Moin...
Ich habe eine
DLL, mit D5 erstellt, und eine Anwendung die auf Seattle compiliert ist. Die QT Auschnitte sind zu Testwecken vereinfacht.
Was passieren soll:
1.
DLL laden
2. procedure StartTransfer aufrufen
3. In der
DLL: In StartTransfer den Wert "bearbeiten"
4. Als Callback zurückgeben.
5. In DoWork (Callback) die Werte anzeigen (MessageDialog)
Fehler: Die Werte die ich erwartet habe sind "verschoben" bzw. nicht vorhanden.
Wo hab ich den Denkfehler?
DLL:
Delphi-Quellcode:
uses
SysUtils, Classes, Windows,
dbisamtb;
procedure SetWorkCallback(CallBack: Pointer); stdcall;
procedure StartTransfer(Path: PWideChar); stdcall;
implementation
var
FWorkCallBack: procedure(TagName, TagValue: PWideChar) = nil;
procedure SetWorkCallback(CallBack: Pointer);
begin
@FWorkCallBack := CallBack;
end;
procedure StartTransfer(Path: PWideChar);
begin
if Assigned(FWorkCallBack) then begin
FWorkCallBack('bla', Path); // hier werden die Werte gefüllt
end;
end;
Anwendung:
Delphi-Quellcode:
procedure TConfigTransfer.LoadDLL;
begin
FDLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + conDBISAM_DLL));
if FDLLHandle <> 0 then begin
@FSetWorkCallBack := GetProcAddress(FDLLHandle, 'SetWorkCallback');
if @FSetWorkCallBack <> nil then begin
FSetWorkCallBack(@TConfigTransfer.DoWork); // Callback "registrieren"
end;
@FStartTransfer := GetProcAddress(FDLLHandle, 'StartTransfer');
end;
end;
procedure TConfigTransfer.StartTransfer;
begin
if @FStartTransfer <> nil then begin
FStartTransfer('Blubb'); // Start
end;
end;
procedure TConfigTransfer.DoWork(TagName, TagValue: PChar);
var
Name: string;
Value: string;
begin
Name := TagName;
Value := TagValue;
MessageDlg(Name + ' ' + Value, mtInformation, [mbOK], 0); // siehe Bild1 (SOLL Name = 'bla', Value = 'Blubb')
end;