Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

DLL Callback Pointerübergabe erwartet Variable

  Alt 28. Okt 2007, 02:51
Hallo,

stehe hier gerade vor dem kleinen Problem das ich versuche in einer DLL eine Callback Funktion zu realisieren.
Die DLL steht auch bereits nur der Aufruf der Prozedur funktioniert nicht. Bekomme immer die Meldung das eine Variable fehlen würde.
Delphi-Quellcode:
unit Defines;

interface

type
  TCallBackProc = procedure(Command: Integer); stdcall;
  TGetName = function: Pchar; stdcall;
  TGetVersion = function: PChar; stdcall;
  TSetCallBackProc = procedure(CallBackProc: Pointer); stdcall;
  TGetData = function(Command: Integer): Boolean; stdcall;
  TInit = function: Boolean; stdcall;
  TStart = procedure; stdcall;
  TStop = procedure; stdcall;
  TConfigure = procedure; stdcall;

implementation

end.
Die DLL
Delphi-Quellcode:
library TestPlugin;

uses
  SysUtils,
  Classes,
  Dialogs,
  Defines in '..\Shared\Defines.pas';

var
  FCallBackProc: TCallBackProc;

{$E mcp}

{$R *.res}

// Procedure zum testen der CallBack Funktion
procedure FTimerTimer(Sender: TObject);
begin
  if Assigned(FCallBackProc) then
    FCallBackProc(1);
end;

// Name des Plugins
function GetName: PChar; stdcall
begin
  Result := 'Media Center TestPlugin';
end;

// Version des Plugins
function GetVersion: Pchar; stdcall
begin
  Result := '1.0.0.0';
end;

// CallBack aufruf festlegen
procedure SetCallBackProc(CallBackProc: Pointer); stdcall
begin
  @FCallBackProc := CallBackProc;
end;

// Befehl empfangen
function GetData(Command: Integer): Boolean; stdcall
begin
  ShowMessage(Format('Received Command: %d -> Running CallBack', [Command]));
  FTimerTimer(nil);
end;

// Initialisieren des Plugins / Hier soll auch mal das CallBack rein
function Init: Boolean; stdcall
begin
  ShowMessage('Called Init');
end;

// Plugin Starten
procedure Start; stdcall
begin
  ShowMessage('Called Start');
end;

// Plugin Stoppen
procedure Stop; stdcall
begin
  ShowMessage('Called Stop');
end;

// Plugin konfigurieren
procedure Configure; stdcall
begin
  ShowMessage('Called Configure');
end;

exports
  GetName, GetVersion, SetCallBackProc, GetData, Init, Start, Stop, Configure;

begin
end.
Die Main
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JvExStdCtrls, JvListBox, JvDialogs, Defines;

type
  TForm1 = class(TForm)
    OpenDialog: TJvOpenDialog;
    JvListBox1: TJvListBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure DLLAufruf(Command: Integer);
  private
    Lib: THandle;
    PluginGetName: TGetName;
    PluginGetVersion: TGetVersion;
    PluginSetCallBackProc: TSetCallBackProc;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Opendialog.Execute then begin
    Lib := LoadLibrary(PChar(OpenDialog.FileName));

    if Lib = 0 then
      ShowMessage('Plugin konnte nicht geladen werden!');

    @PluginGetName := GetProcAddress(Lib, 'GetName');
    Self.JvListBox1.Items.Add('Name: ' + PluginGetName);

    @PluginGetVersion := GetProcAddress(Lib, 'GetVersion');
    Self.JvListBox1.Items.Add('Version: ' + PluginGetVersion);
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Lib <> 0 then begin
    @PluginSetCallBackProc := GetProcAddress(Lib, 'SetCallBackProc');
    PluginSetCallBackProc(@DLLAufruf); // Hier kommt die Meldung Variable benötigt
    end;
end;

procedure TForm1.DLLAufruf(Command: Integer);
begin
  ShowMessage(Format('Command von DLL: %d', [Command]));
end;

end.
Was habe ich falsch gemacht? es wird doch nur ein Pointer übergeben, in der DLL scheints ja zu funktionieren...
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat