Also deinen alten Code konnte ich dann irgendwie doch nicht so richtig verwerten. Wirst kaum etwas vom alten Code wiederfinden
Im Anhang die EXE und der Source. Funzt bei mir mit SD-Cards wunderbar. Smartcard habe ich hier nicht, obwohl es ein Multicard-Reader ist. Aber ich gehe davon aus, daß es gleich sein sollte ...
Ich bekomme die Nachrichten und in der Ausgabe auch welcher Laufwerksbuchstabe betroffen ist.
Als Ersatz für die halbherzige DBT-Übersetzung habe ich JwaDbt.pas aus dem
JEDI-ApiLib-Projekt genommen. Das steht wahlweise unter
MPL oder
LGPL. Wenn dir das nicht paßt, mußt du nochmal zu Fuß die fehlenden Sachen übersetzen ...
Delphi-Quellcode:
function TMainForm.__GetDriveLetterFromUnitMask(dwUnitMask: DWORD): string;
var
i: Integer;
begin
Result := '';
for i := 0 to 31 do
begin
if ((dwUnitMask shr i) and 1 <> 0) then
begin
Result := Result + Chr($41 + i);
end;
end;
end;
function TMainForm.__GetMoreInfoFromEvent(lParam: PDevBroadcastHdr): string;
begin
Result := '';
if (not IsBadReadPtr(lParam, sizeof(lParam^))) then
case lParam^.dbch_devicetype of
DBT_DEVTYP_DEVICEINTERFACE:
begin
Result := Format(', DBT_DEVTYP_DEVICEINTERFACE = "%s"', [@PDevBroadcastDeviceInterfaceA(lParam)^.dbcc_name[0]]);
end;
DBT_DEVTYP_HANDLE:
begin
Result := ', DBT_DEVTYP_HANDLE';
end;
DBT_DEVTYP_OEM:
begin
Result := ', DBT_DEVTYP_OEM';
end;
DBT_DEVTYP_PORT:
begin
Result := ', DBT_DEVTYP_PORT';
end;
DBT_DEVTYP_VOLUME:
begin
Result := Format(', DBT_DEVTYP_VOLUME = 0x%8.8X (letters: %s)', [PDevBroadcastVolume(lParam)^.dbcv_unitmask, __GetDriveLetterFromUnitMask(PDevBroadcastVolume(lParam)^.dbcv_unitmask)]);
end;
else
Result := ', <unknown devtype>'
end;
end;
function TMainForm.__GetEventTypeString(wParam: WPARAM; lParam: LPARAM): string;
var
sEventType: string;
sMore: string;
begin
sMore := '';
case wParam of
DBT_DEVNODES_CHANGED:
begin
sEventType := 'DBT_DEVNODES_CHANGED';
end;
DBT_QUERYCHANGECONFIG:
begin
sEventType := 'DBT_QUERYCHANGECONFIG';
end;
DBT_CONFIGCHANGED:
begin
sEventType := 'DBT_CONFIGCHANGED';
end;
DBT_CONFIGCHANGECANCELED:
begin
sEventType := 'DBT_CONFIGCHANGECANCELED';
end;
DBT_DEVICEARRIVAL:
begin
sEventType := 'DBT_DEVICEARRIVAL';
end;
DBT_DEVICEQUERYREMOVE:
begin
sEventType := 'DBT_DEVICEQUERYREMOVE';
end;
DBT_DEVICEQUERYREMOVEFAILED:
begin
sEventType := 'DBT_DEVICEQUERYREMOVEFAILED';
end;
DBT_DEVICEREMOVEPENDING:
begin
sEventType := 'DBT_DEVICEREMOVEPENDING';
end;
DBT_DEVICEREMOVECOMPLETE:
begin
sEventType := 'DBT_DEVICEREMOVECOMPLETE';
end;
DBT_DEVICETYPESPECIFIC:
begin
sEventType := 'DBT_DEVICETYPESPECIFIC';
end;
DBT_CUSTOMEVENT:
begin
sEventType := 'DBT_CUSTOMEVENT';
end;
DBT_USERDEFINED:
begin
sEventType := 'DBT_USERDEFINED';
end;
else
sEventType := '<unknown evt>';
end;
sMore := __GetMoreInfoFromEvent(PDevBroadcastHdr(lParam));
Result := Format('%s%s', [sEventType, sMore]);
end;
procedure TMainForm.WMDeviceChange(var Msg: TMessage);
begin
Listbox1.Items.Append(Format('-> WM_DEVICECHANGE: %s', [__GetEventTypeString(Msg.WParam, Msg.LParam)]));
end;
PS: Wer jetzt dämlich fragt wieso ich die begin-end nicht weggelassen habe, bekommt eins auf den Deckel!!!
PPS: Ja, die EXE ist gepackt, weil ich mit Modem im Internet rumkrieche und auf eine ungepackte aktuell gut verzichten kann, es ist ja auch keine
DLL.
PPPS: "__" als Präfix bedeutet "private Funktion/Methode" ...