Forum: PC-Programmierung Entfernen eines USB-Geräts erkennen


von DS (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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.

von Christian R. (supachris)


Lesenswert?

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.

von DS (Gast)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 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

von Christian R. (supachris)


Lesenswert?

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.

von DS (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Fenster musst Du in DllMain erzeugen. Damit hast Du 'ne 
Fensterprozedur (nämlich die jenes Fensters) und kannst auf Nachrichten 
reagieren.

von DS (Gast)


Lesenswert?

Danke für eure Hilfe, habs hinbekommen...

Gruß
DS

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
Noch kein Account? Hier anmelden.