Änderungen an den Laufwerken abfangen



  • Hallo,

    erst mal sorry, wenn dieses Forum das falsche ist, aber ich wusste nicht wohin sonst mit dem Problem:

    Ich suche eine Möglichkeit, auf folgendes Ereigniss zu reagieren:

    Mein Programm läuft als Tray-Icon.
    Wenn der Benutzer
    - einen Laufwerksbuchstaben ändert (über die Computerverwaltung z.B. den Laufwerksbuchstaben des CD-Laufwerks von 😨 auf E: verlegt)
    - einen Laufwerksbuchstaben hinzufügt (z.B. einen USB-Stick einsteckt)
    - einen Laufwerksbuchstaben entfernt (z.B. einen USB-Stick entfernt)
    soll eine bestimmte Funktion aufgerufen werden.

    Wie mache ich das?
    Gibt es da eine Windows-Message, oder wie kann mein Programm mitkriegen, dass sich an den Laufwerksbuchstaben was geändert hat?

    Da die Anzahl ja auch gleich bleiben kann, hilft mir

    int anz = GetLogicalDevices();
    

    ja nicht weiter, oder?

    mfg
    trequ



  • Aber deren Namen nicht. (GetLogicalDriveStrings)
    Außerdem brauchst du nur Drives zu prüfen, die als removable gekennzeichnet sind(GetDriveType).
    Es sei denn, jemand zieht im Laufenden Betrieb die Harddisc 😉
    Bei den neueren Bus-Systemen soll das ja wohl möglich sein 😕



  • WM_DEVICECHANGE



  • Hallo,

    SeppSchrot schrieb:

    Aber deren Namen nicht. (GetLogicalDriveStrings)
    Außerdem brauchst du nur Drives zu prüfen, die als removable gekennzeichnet sind(GetDriveType).
    Es sei denn, jemand zieht im Laufenden Betrieb die Harddisc 😉
    Bei den neueren Bus-Systemen soll das ja wohl möglich sein 😕

    Es ist möglich.
    - Man kann man eine SATA-Platte im Betrieb entfernen.
    - Es gibt Hot-Plug Festplatten, die können das auch.

    Nur mit Wechseldatenträgern arbeiten dürfte daher nicht möglich sein.
    Man kann ja auch einer Partition auf der Platte einen anderen Laufwerksbuchstaben zuweisen. Auch dann ändern sich die Laufwerksbuchstaben.

    Ich denke, dass

    dEUs schrieb:

    WM_DEVICECHANGE

    geeignet ist.

    Ich bin allerdings noch recht neu in C++ und habe daher von dem was darüber in der MSDN steht, nicht wirklich Plan.

    Kann mir jemand ein Beispiel geben, wie man eine WM_??? Message ausliest?
    Ich brauche z.B. eine MessageBox wenn sich an den Laufwerken was tut.

    mfg
    trequ



  • Hallo,

    es hat sich erledigt, ich hab es hingekriegt:

    void CMy1Dlg::OnDeviceChange(WPARAM wp, LPARAM lp){
    	switch(wp){
    		case DBT_CONFIGCHANGECANCELED:
    			m_list.AddString("DBT_CONFIGCHANGECANCELED");
    			break;
    		case DBT_CONFIGCHANGED:
    			m_list.AddString("DBT_CONFIGCHANGED");
    			break;
    		case DBT_DEVICEARRIVAL:
    			m_list.AddString("DBT_DEVICEARRIVAL");
    			break;
    		case DBT_DEVICEREMOVECOMPLETE:
    			m_list.AddString("DBT_DEVICEREMOVECOMPLETE");
    			break;
    		case DBT_DEVICEQUERYREMOVE:
    			m_list.AddString("DBT_DEVICEQUERYREMOVE");
    			break;
    		case DBT_DEVICEQUERYREMOVEFAILED:
    			m_list.AddString("DBT_DEVICEQUERYREMOVEFAILED");
    			break;
    		case DBT_DEVICEREMOVEPENDING:
    			m_list.AddString("DBT_DEVICEREMOVEPENDING");
    			break;
    		case DBT_DEVICETYPESPECIFIC:
    			m_list.AddString("DBT_DEVICETYPESPECIFIC");
    			break;
    		case DBT_DEVNODES_CHANGED:
    			m_list.AddString("DBT_DEVNODES_CHANGED");
    			break;
    		case DBT_QUERYCHANGECONFIG:
    			m_list.AddString("DBT_QUERYCHANGECONFIG");
    			break;
    		case DBT_USERDEFINED:
    			m_list.AddString("DBT_USERDEFINED");		
    			break;
    	}
    	m_list.UpdateData(true);
    }
    

    Damit bekomme ich eine liste, welche alle Ereignisse enthält.

    Kann mir jemand sagen, wie ich die Infomationen in lp auslese?

    mfg
    trequ



  • afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );

    Parameters

    nEventType

    An event type. See the Remarks section for a description of the available values

    dwData

    The address of a structure that contains event-specific data. Its meaning depends on the given event.

    D.h., je nachdem welchen Wert nEventType hat, musst du dwData auf eine andere Struktur casten.

    Unter einem beliebigen Wert von nEventType findest du in der MSDN folgendes:

    Pointer to a structure identifying the device to remove. To determine the structure type, treat the structure as a DEV_BROADCAST_HDR structure and check its dbch_devicetype member.

    Und unter DEV_BROADCAST_HDR findest du dann die eigentliche Information, was was ist.



  • Hallo,

    ok, mein Wissen reicht so weit, dass ich weiß, was eine Struktur ist.

    Ich weis, dass ich mit

    struktur.name
    struktur.vorname
    struktur.gebdatum
    

    darauf zugreifen kann.

    Was es aber mit "casten" auf sich hat - sorry... 😕

    Wenn ich auf
    lp.dbch_devicetype
    zugreifen will, bekomme ich jedenfalls nur Fehler.

    Ich vermute, es liegt daran, dass lp nicht als eine Struktur definiert wurde.
    Es hat ja den Datentyp LPARAM.
    Aber wie komme ichvon LPARAM jetzt zu einer Struktur?

    Es reicht mir, wenn ich auslesen kann, welcher Laufwerksbuchstabe betroffen ist.

    Laut der MSDN wäre das:
    -> dbch_devicetype
    (Logical volume. This structure is a DEV_BROADCAST_VOLUME structure.)
    -> DEV_BROADCAST_VOLUME
    -> dbcv_unitmask
    (Logical unit mask identifying one or more logical units. Each bit in the mask corresponds to one logical drive. Bit 0 represents drive A, bit 1 represents drive B, and so on.)

    Danke für die Hilfe.

    mfg
    trequ



  • DEV_BROADCAST_HDR *pTmp = (DEV_BROADCAST_HDR*)lp;
    switch(pTmp->dbch_devicetype)
    {
    case xyz:
      BetreffendeStruct* pPointer = (BetreffendeStruct*)lp;
      break;
    case abc:
    ...
    }
    

    so sollte das tun.


Log in to reply