Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#1

DLL Callback Merkwürdigkeiten

  Alt 20. Nov 2016, 13:21
Delphi-Version: 10 Seattle
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;
Miniaturansicht angehängter Grafiken
fehler.png  
  Mit Zitat antworten Zitat