AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Messagequeue

Ein Thema von schwa226 · begonnen am 18. Mär 2011 · letzter Beitrag vom 18. Mär 2011
Antwort Antwort
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

DLL Messagequeue

  Alt 18. Mär 2011, 07:40
Guten Morgen!

Ich hänge mal wieder mit einer umsetzung von C++ nach Delphi.
Und zwar habe ich nach diesem Demos:
http://www.infinityusb.com/default.a...&DownloadID=43

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:
TINFSMART_OpenDeviceFromNum = function (dwDevice: DWORD;
                                    hDevice: PDWORD;
                                    lpDeviceString: PAnsiChar): SDK_STATUS; stdcall;
stehen bleigt und nicht zurückkommt.


Die Funktion vorher
TINFSMART_GetNumDevices = function (lpdwNumDevices: PDWORD): SDK_STATUS; stdcall; geht noch ohne Probleme.

Die Demo läuft die ganze Zeit in dieser Funktion und arbeitet die Messagequeue ab:
Code:
   // Main message loop:
   while (GetMessage(&msg, NULL, 0, 0))
   {
      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
      {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
   }
Wie kann ich das am einfachsten in einer Delphi DLL verwirklichen?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#2

AW: DLL Messagequeue

  Alt 18. Mär 2011, 09:54
Du könntest ein MessageOnly-Window samt zugehöriger WndMethod erzeugen: Delphi-Referenz durchsuchenAllocateHwnd
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLL Messagequeue

  Alt 18. Mär 2011, 10:02
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#4

AW: DLL Messagequeue

  Alt 18. Mär 2011, 10:14
Aufpassen, AllocateHwnd erstellt ein Wincontrol, welches in der VCL läuft.
Das verstehe ich aber anders.
Zitat:
Erstellt ein Fenster, das eine bestimmte Fensterprozedur implementiert.

Mit AllocateHWnd können Sie ein Fenster erstellen, das keinem fensterorientierten Steuerelement zugeordnet ist. Die Funktion wird normalerweise zur Erstellung nichtvisueller Fenster verwendet, die zwar auf Botschaften reagieren, aber nicht in der Benutzeroberfläche angezeigt werden. Sie wird beispielsweise von der Komponente TTimer aufgerufen, um ein Fenster für die Timer-Ereignisse von Windows zu erstellen.

Der Parameter Method gibt die Fensterprozedur an, die vom neuen Fenster für die Reaktion auf Botschaften verwendet wird.

AllocateHWnd gibt das Handle des neuen Fensters zurück.

Anmerkung: Geben Sie die mit AllocateHWnd erstellten Fenster mit der Prozedur DeallocateHWnd frei.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

AW: DLL Messagequeue

  Alt 18. Mär 2011, 10:29
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:
http://www.delphipraxis.net/1015009-post23.html
(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.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#6

AW: DLL Messagequeue

  Alt 18. Mär 2011, 10:34
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

AW: DLL Messagequeue

  Alt 18. Mär 2011, 12:36
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:
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;
In meiner DLL rufe ich dann auf:
Delphi-Quellcode:
            test := TTest.Create;
            test.Start;
Nun wird der Thread erzeugt, aber trotz Start kommt er nicht in die Execute?
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.
Delphi 2010, Update 4 & 5

Geändert von schwa226 (18. Mär 2011 um 13:10 Uhr)
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#8

AW: DLL Messagequeue

  Alt 18. Mär 2011, 15:15
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:
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:
Delphi-Quellcode:
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;
Sollte so passen, oder?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz