Ich habe das gerade mit einer
DLL in C und einem Hauptprogramm in Delphi implementiert und es funktioniert problemlos.
LParam nutze ich als einen Zeiger auf eine Struktur. Das geht deshalb gut, da die
DLL ja im gleichen Adressraum wie das Programm steht und daher der Zeiger gueltig ist. SendMessage garantiert das der Thread nicht weiterlaeuft und die Struktur veraendert.
Jetzt muss ich nur noch rauskriegen wie ich Threadsynchronisation unter Linux mache, ohne das mein
API leidet.
Delphi-Quellcode:
unit BlaMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls,
BlaKit;
type
TBlaMainForm =
class(TForm)
// deleted
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
BlaDev: Pointer;
CallbackMsg: ULONG;
function CallbackEvent(
var Msg: TMessage): Boolean;
end;
var
BlaMainForm: TBlaMainForm;
implementation
{$R *.dfm}
function TBlaMainForm.CallbackEvent(
var Msg: TMessage): Boolean;
var
I: Integer;
BlaData: PBLA_DATA;
begin
// check for message from DLL
Result := Msg.Msg = CallbackMsg;
if Result
then
begin
// LParam of message contains pointer to BLA_DATA structure
BlaData := PBLA_DATA(Msg.LParam);
// deleted
end;
end;
procedure TBlaMainForm.FormCreate(Sender: TObject);
begin
// deleted
// hook the message received
Application.HookMainWindow(CallbackEvent);
// tell the DLL to send messages when data is received
// returns the message ID used with SendMessage
CallbackMsg := BlaRegister(BlaDev, Application.Handle);
end;
procedure TblaMainForm.FormDestroy(Sender: TObject);
begin
Application.UnhookMainWindow(CallbackEvent);
// deleted
end;
end.
Sorry, das Programm ist etwas ausgeschlachtet, da das zugehoerige Produkt noch nicht fertig ist.