Ich habe bemerkt, dass die Versendung der DBT_DEVICEREMOVECOMPLETE Nachricht zumindest unvollständig sein dürfte. Keine Ahnung, ob das wirklich das Problem ist, aber ich würde das zumindest doch gerne in korrekter Form ausprobieren.
Ich habe das jetzt so versucht:
Delphi-Quellcode:
const
DBT_DEVICEREMOVECOMPLETE = 32772;
var
phdr: PDevBroadcastHdr; //Aus JvComputerInfoEx
begin
phdr.dbch_size := SizeOf(DEV_BROADCAST_HDR);
phdr.dbch_devicetype := DBT_DEVTYP_VOLUME;
SendMessage(HWND_BROADCAST, WM_DEVICECHANGE, DBT_DEVICEREMOVECOMPLETE, INTEGER(@phdr));
//Auszug aus JvComputerInfoEx:
{$EXTERNALSYM PDevBroadcastHdr}
PDevBroadcastHdr = ^TDevBroadcastHdr;
{$EXTERNALSYM DEV_BROADCAST_HDR}
DEV_BROADCAST_HDR = packed record
dbch_size: DWORD;
dbch_devicetype: DWORD;
dbch_reserved: DWORD;
end;
TDevBroadcastHdr = DEV_BROADCAST_HDR;
Aber das kann so nicht stimmen.
MSDN:
WM_DEVICECHANGE message
DBT_DEVICEREMOVECOMPLETE event
Hier steht:
Code:
lParam: A pointer to a structure identifying the device removed. The structure consists of an event-independent header, followed by event-dependent members that describe the device. To use this structure, treat the structure as a DEV_BROADCAST_HDR structure, then check its dbch_devicetype member to determine the device type.
Allerdings sehe ich in
DEV_BROADCAST_HDR keine Möglichkeit, ein Laufwerk anzugeben.
Was übersehe ich?