www.mikrocontroller.net

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


Autor: DS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus dem BulkLoop Demo von Cypress:
LRESULT CBulkLoopDlg::OnPnpEvent(WPARAM wParam, LPARAM lParam) 
{
  if (wParam == DBT_DEVICEARRIVAL) 
    if (bDevNodeChange) 
      bArrived = true;

  if (wParam == DBT_DEVICEREMOVECOMPLETE) 
  {
    if (bDevNodeChange) {
      m_XferSize.SetWindowText("");
      m_SeedValue.SetWindowText("");
      m_FillPatternComBox.SetWindowText("");

      m_OutEndptComBox.ResetContent();
      m_InEndptComBox.ResetContent();

      bDevNodeChange = false;
    }
  }

  if (wParam == DBT_DEVNODES_CHANGED) 
  {
    bDevNodeChange = true;

    if (bArrived) {
      FindLoopDevice();
      bArrived = false;
      bDevNodeChange = false;
    }

  }

  return 0;
}

Damit bekommst du die Nachrichten.

Autor: DS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: DS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe, habs hinbekommen...

Gruß
DS

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.