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
Antwort Antwort
Seite 3 von 3     123   
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, 76x aufgerufen)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#22

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 10. Sep 2006, 20:42
Statt if (not IsBadReadPtr(lParam, sizeof(lParam^))) then kannste auch sagen if(Assigned(lParam))then
  Mit Zitat antworten Zitat
Rociel

Registriert seit: 13. Feb 2005
Ort: Könnern/MD
107 Beiträge
 
Delphi 2006 Personal
 
#23

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 11. Sep 2006, 09:39
hm, geht nit.....

also ich hab n hama "USB 2.0 Card Reader 1000 & 1" der is üblicher weise über USB angeshclossen, is auch USB 2.0 was aber eigentlich nich von bedeutung sein sollte.

ja system einmal zum programmieren ne VMWare mit WinXP und Delphi 2005

bzw. also host auch WinXP.

die programme, hab ich jeweils in der VMWare als auch auf dem Hostsystem ausgeführt, wobei er bei keinem was erkannt hat, und da er inner VM auch den CardReader über WMDeviceChange erkennt, wenn er als solches eingesteckt wird, denke ich nicht, dass es anner VM liegen kann, wie gesagt auf'm hostsystem isses ja auch nicht anders
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#24

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 11. Sep 2006, 11:50
Windows XP also, ich schicke dir heute am Abend (wenn ich es nicht vergesse) nochmal eine geänderte Version zu.

Ah, Sekunde. Wenn du den Cardreader reinsteckst, erscheint dann bereits ein Laufwerk (oder mehrere) oder nicht? Bei mir wird erst ein Laufwerk ("Volume") angemeldet, sobald ich die Karte reinstecke. Irgendwo muß ich aber auch noch einen alten Hama rumliegen haben ...
  Mit Zitat antworten Zitat
Rociel

Registriert seit: 13. Feb 2005
Ort: Könnern/MD
107 Beiträge
 
Delphi 2006 Personal
 
#25

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 11. Sep 2006, 21:34
jab, die erscheinen schon beim reinstecken des readers
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#26

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 13. Jun 2007, 02:13
Hi Olli,

ich wollte mal eben anfragen warum du hier Shift Left benutzt? Rein zum Verstaendnis und des Lernens!

Danke!

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;
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#27

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 13. Jun 2007, 10:48
Zitat von Mackhack:
ich wollte mal eben anfragen warum du hier Shift Left benutzt? Rein zum Verstaendnis und des Lernens!
Der zitierte Code ist SHR, was IMO auch richtig wäre. Die Idee ist einfach, die Bitmaske in einen String aus Laufwerksbuchstaben umzuwandeln.

Dazu gehe ich durch die Bitmaske (von Bit 0 bis 31 eben) und lese jedes Bit aus. Wenn es auf Hi gesetzt ist, füge ich an das Resultat den Buchstaben 'A'+i an. i ist dabei das Offset (i.e. welches Bit es war) relativ zum ASCII-Code von 'A'.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#28

Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 13. Jun 2007, 15:24
Sorry hab mich verlesen gehabt.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#29

AW: Re: SD-Card im CardReader mittels WM_DeviceChange?

  Alt 18. Jul 2011, 12:54
jab, die erscheinen schon beim reinstecken des readers
Hey Rociel!
Hast du für dein Problem eine brauchbare Lösung gefunden?
(Hab hier gerade die selbe Anforderung und auch Reader die die Laufwerksbuchstaben immer anzeigen - also auch wenn noch keine Karte drin ist)

Danke

Geändert von ralfiii (18. Jul 2011 um 13:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 10:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz