Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#21

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 10. Sep 2006, 21:39
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" ...
Angehängte Dateien
Dateityp: exe smartcardnotify_457.exe (167,0 KB, 80x aufgerufen)
Dateityp: rar source_236.rar (9,0 KB, 76x aufgerufen)
  Mit Zitat antworten Zitat