AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi SD-Card im CardReader mittels WM_DeviceChange?
Thema durchsuchen
Ansicht
Themen-Optionen

SD-Card im CardReader mittels WM_DeviceChange?

Offene Frage von "ralfiii"
Ein Thema von Rociel · begonnen am 1. Sep 2006 · letzter Beitrag vom 18. Jul 2011
 
Olli
(Gast)

n/a Beiträge
 
#21

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 10. Sep 2006, 20: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, 77x aufgerufen)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz