Hallo zusammen, ich arbeite mit einem Cypress FX2LP USB-Gerät. Dieses wird mittels LabView über eine von mir in C++ geschriebene DLL angesprochen. Es funktioniert auch alles hervorragend, aber wenn ich das Gerät abziehe scheint das der Cypress-Treiber nicht an meine DLL zu melden, sprich ich kann immer noch mit dem Treiber auf das nicht mehr vorhandene Gerät zugreifen... Die Cypress-API bietet zwar eine IsOpen-Abfrage, aber die kontrolliert nur ob das Handle zum Treiber gültig ist. Nun wollte ich die wm_devicechange messages auswerten, das scheint aber nur in window procedures zu gehen, und die gibts aber glaub ich in dlls nicht. Habt ihr ne Idee wie ich da herangehen könnte? Gruß DS
> und die gibts aber glaub ich in dlls nicht.
Schon, Du musst nur eine Fensterprozedur mit Nachrichtenschleife in
Deiner DLL implementieren. Die Anmeldung der Fensterklasse etc. sollte
in DllMain erfolgen.
Aus dem BulkLoop Demo von Cypress:
1 | LRESULT CBulkLoopDlg::OnPnpEvent(WPARAM wParam, LPARAM lParam) |
2 | {
|
3 | if (wParam == DBT_DEVICEARRIVAL) |
4 | if (bDevNodeChange) |
5 | bArrived = true; |
6 | |
7 | if (wParam == DBT_DEVICEREMOVECOMPLETE) |
8 | {
|
9 | if (bDevNodeChange) { |
10 | m_XferSize.SetWindowText(""); |
11 | m_SeedValue.SetWindowText(""); |
12 | m_FillPatternComBox.SetWindowText(""); |
13 | |
14 | m_OutEndptComBox.ResetContent(); |
15 | m_InEndptComBox.ResetContent(); |
16 | |
17 | bDevNodeChange = false; |
18 | }
|
19 | }
|
20 | |
21 | if (wParam == DBT_DEVNODES_CHANGED) |
22 | {
|
23 | bDevNodeChange = true; |
24 | |
25 | if (bArrived) { |
26 | FindLoopDevice(); |
27 | bArrived = false; |
28 | bDevNodeChange = false; |
29 | }
|
30 | |
31 | }
|
32 | |
33 | return 0; |
34 | }
|
Damit bekommst du die Nachrichten.
Hallo, irgendwie kapier ich das nicht. Ich hab in meiner DLL doch nur Funktionen, die kein Fenster haben. Ich würde ja gern in meiner openDevice-Funktion den Nachrichtenempfang starten und beim closeDevice beenden. Heißt das, dass ich im openDevice ein Fenster öffnen müsste, welches eine Fensterprozedur öffnet, welche nun die Nachrichten empfängt? @rufus: wenn ich Code in die dllmain schreibe, wann wird der denn ausgeführt??? @christian: hab mir den code mal angekuckt, woher bekomme ich denn den WPARAM und den LPARAM? Muss ich die mit new erstellen und die werden dann automatisch beschrieben oder gibt's die schon? Ist mir alles noch etwas undurchsichtig...
> wenn ich Code in die dllmain schreibe, wann wird der denn ausgeführt??? Wenn die DLL vom sie nutzenden Prozess geladen wird. http://msdn.microsoft.com/en-us/library/ms682583.aspx
Die wParam und lParam bekommst du ja vom CyAPI, das schmeißt dir die Nachricht hin, und du musst sie nur auswerten. Wieso nimmst du nicht das managed API? Das ist viel sinnvoller gelöst.
Ich bekomm's einfach nicht hin. Da ich ja ne DLL hab gibt es keine Fenster und damit keine Fensterprozedur und damit keine Wparam und lParam. Vielleicht steh ich ja auch nur auf dem Schlauch, aber bitte erklärts mir genauer... Danke schonmal.
Das Fenster musst Du in DllMain erzeugen. Damit hast Du 'ne Fensterprozedur (nämlich die jenes Fensters) und kannst auf Nachrichten reagieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.