![]() |
DLL Messagequeue
Guten Morgen!
Ich hänge mal wieder mit einer umsetzung von C++ nach Delphi. Und zwar habe ich nach diesem Demos: ![]() die INFSMART.PAS erzeugt. In der Demo werden diese Funktionen in einer Anwendnung mit einer Form benutzt. Ich möchte es aber in einer DLL benutzen die keine Form hat. Das Problem ist, dass die DLL nun bei dem Aufruf von
Delphi-Quellcode:
stehen bleigt und nicht zurückkommt.
TINFSMART_OpenDeviceFromNum = function (dwDevice: DWORD;
hDevice: PDWORD; lpDeviceString: PAnsiChar): SDK_STATUS; stdcall; Die Funktion vorher
Delphi-Quellcode:
geht noch ohne Probleme.
TINFSMART_GetNumDevices = function (lpdwNumDevices: PDWORD): SDK_STATUS; stdcall;
Die Demo läuft die ganze Zeit in dieser Funktion und arbeitet die Messagequeue ab:
Code:
Wie kann ich das am einfachsten in einer Delphi DLL verwirklichen?
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } |
AW: DLL Messagequeue
Du könntest ein MessageOnly-Window samt zugehöriger WndMethod erzeugen:
![]() |
AW: DLL Messagequeue
Aufpassen, AllocateHwnd erstellt ein Wincontrol, welches in der VCL läuft.
Aber wenn die DLL keinen Messagebehandlung für die VCL bereitstellt, dann hängt es auch da. Eventuell läuft es aver über die VCL der EXE, was allerdings auch Problemchen bereiten könnte. CreateWindow/CreateWindowEx zum Erstellen eines MessageWindows und eine MessageLoop in einem eigenem Thread könnte da helfen. (Erstellen der Windows und die MessageLoop müssen immer selben Thread ablaufen) PS: Eine DLL/EXE haben keine MessageQueue ... diese ist immer an einen Thread gebunden und wer einen Thread erstellt ist egal. Die Messages der Windows werden immer an die Queue geschickt, in welchem Thread das Window erstellt wurde. |
AW: DLL Messagequeue
Zitat:
Zitat:
|
AW: DLL Messagequeue
Danke einmal für die Antworten!
Ich habe mit dem Hersteller Kontakt aufgenommen und dieser hat mir gesagt, dass es ohne Probleme gehen sollte. Da er aber keine Delphi Implementierung zur Verfügung stellt redet er sich natürlich darauf aus... Inzwischen ist mir eingefallen, dass ich schon einmal mit einer DLL und USB-HID Device gekämpft habe. Auch hier war das Problem, dass die DLL stehen geblieben ist. In einer Anwendung mit Form ging es ohne Probleme. Dazu muss ich mir das aber noch ansehen was ich da gemacht habe um dieses Problem zu umgehen. noch schnell gesucht: ![]() (war aber das Problem, dass es bei WaitFor stehen geblieben ist) Auch werde ich die INFSMART.PAS einmal mit einer Anwendung mit Form verwenden. Da bin ich mir eigentlich sicher dass es funktioniert. |
AW: DLL Messagequeue
Egal in welchem Thread man AllocateHWnd aufruft, die Messages werden immer an den VCL-Thread gesendet.
Wenn man also eine eigene MessageLoop nutzen will, sollte man da aufpassen. |
AW: DLL Messagequeue
So,
wie ich mir gedacht habe läuft es mit einer VCL Application ohne Probleme. Ich kann das Device öffnen und wieder schließen. In der DLL bleibt es beim Öffnen stehen. Auch ein Einbinden der D6DLLSynchronizer.pas hat nichts gebracht. Diese würde ja ein AllocateHWnd durchführen. Jetzt stellt sich mir die Frage wie ich das machen kann damit es in der DLL auch funktioniert!? Das ganze in einen eignenen Thread auszulagern möchte ich eigentlich umgehen. Edit: Jetzt habe ich einfach das einmal Probiert:
Delphi-Quellcode:
In meiner DLL rufe ich dann auf:
Type
TTest = class(TThread) private public constructor Create(); protected procedure Execute; override; end; constructor TTest.Create(); begin inherited create(True); // CreateSuspended = true FreeOnTerminate := True; end; procedure TTest.Execute; var msg : Tmsg; begin while not Terminated do begin Sleep(1); end; end;
Delphi-Quellcode:
Nun wird der Thread erzeugt, aber trotz Start kommt er nicht in die Execute?
test := TTest.Create;
test.Start; Ein Breakpoint in der Execute bleibt unangetastet. Die DLL arbeitet aber step für step weiter. Wenn schon dieser Thread nicht ausgeführt wird kann das auch der Grund sein warum es mit der Funktion auch nicht geht. |
AW: DLL Messagequeue
Habe es nun doch noch geschafft!
Die Funktion darf nicht im öffnen der DLL aufgerfufen werden. Wenn ich sie über eine exported Funktion aufrufe geht es ohne Probleme. Nun habe ich aber noch eine Frage zwecks C++ -> Delphi:
Code:
Delphi:
INFSMART_SDK SDK_STATUS _stdcall INFSMART_Phoenix_Enable(HANDLE hDevice, unsigned int baud, unsigned int * ActualBaud, unsigned char stopbit, unsigned char parity, unsigned char databits, unsigned int dwFrq, unsigned int PhRunningFrq, bool updateonly);
Delphi-Quellcode:
Sollte so passen, oder?
TINFSMART_Phoenix_Enable = function (hDevice: THandle;
baud: DWORD; ActualBaud: PDWORD; stopbit: Byte; parity: Byte; databits: Byte; dwFrq: DWORD; PhRunningFrq: DWORD; updateonly: Bool): SDK_STATUS; stdcall; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz