Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SD-Card im CardReader mittels WM_DeviceChange? (https://www.delphipraxis.net/76268-sd-card-im-cardreader-mittels-wm_devicechange.html)

Rociel 1. Sep 2006 08:33


SD-Card im CardReader mittels WM_DeviceChange?
 
hi, folgender code läuft ganz gut (mit cd's klappts):

Delphi-Quellcode:
procedure TForm2.WMDeviceChange(var Msg: TMessage);
const
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
var
  myMsg: string;
begin
  inherited;
  case Msg.wParam of
    $8000: myMsg := '0';
    $8001: myMsg := '1';
    $8002: myMsg := '2';
    $8003: myMsg := '3';
    $8004: myMsg := '4';
    $8005: myMsg := '5';
    $8006: myMsg := '6';
    $8007: myMsg := '7';
    $8017: myMsg := '17';
    $8018: myMsg := '18';
    $8019: myMsg := '19';
    $FFFF: myMsg := 'FFFF!';
  else myMsg:='other';
  end;
  ShowMessage(myMsg);
end;
Das problem ist, wenn ich in meinen über USB angeschlossenen CardReader eine Karte stecke, meldet der mit dieser prozedur garnix.

anzumerken ist, dass ich das autorun schon wie in http://www.delphipraxis.net/internal...ct.php?t=89850 beschrieben aktiviert hab, und neugestartet hab.

wenn ich den Cardreader an sich zum usb connecte, bringt er jedoch auch die meldung, dass er was gefunden hat, nur halt nit wenn ich dann ne karte reinstecke.

kann mir wer sagen, was ich falsch mache?

Olli 8. Sep 2006 15:59

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
Schonmal MSDN-Library durchsuchenRegisterDeviceNotification probiert?

Rociel 8. Sep 2006 21:47

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
hi, danke erstmal für den tipp, ich hab mir mal http://www.swissdelphicenter.ch/de/showcode.php?id=2211 angeschaut.

wenn ich das jetzt richtig sehe, dann sagt RegisterDeviceNotification dem system, dass es für ein zusätzliches gerät, welches connectet, bzw. disconnected wird, dann über WMDeviceChange eine Meldung bringt, ja?

und wenn ja, bzw. nein, wie binde ich das dann für meine zwecke in mein programm ein, sry, für die frage, aber ich habe noch so ziemlich keine erfahrungen, was API-Programmierung angeht.....

Robert Marquardt 9. Sep 2006 06:17

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
RegisterDeviceNotification sollte man nicht brauchen. Es ist dafuer zustaendig das man alle WM_DEVICECHANGEs fuer ein bestimmtes Device bekommt.
Die Basis-DEVICECHANGEs bekommt man auch so.

Ich wuerde mal vermuten das WM_DEVICECHANGE hier nicht an die zweite Form weitergeleitet wird.

Besorg dir mal mal meine HID-Komponente von http://www.soft-gems.net/HID.php oder aus der JVCL.
Dort ist eine Konversion von DBT.h (DBT.pas) dabei. Damit hast du erst mal die WM_DEVICECHANGE Konstanten.
Zusaetzlich enthaelt das File noch nuetzliche Kommentare von Microsoft.
Der beste Weg WM_DEVICECHANGe zu empfangen geht ueber AllocateHwnd.

Rociel 9. Sep 2006 08:34

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
an welche zweite form denn?

ich hab das mom um fehlerquellen zu vermeiden, erstmal in einem form laufen.

wie gesagt mit cds etc. gehts ja, nur halt nich wenn ich karten im cardreader austausche

Rociel 9. Sep 2006 08:59

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
so, hab grad mit der komponente das ausprobiert, bei DeviceChange und Arrival hab ich gesagt, dass er erstmal ne message bringen soll, hat er aber nu auch nicht, also geht das mit der nit

Olli 9. Sep 2006 09:54

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

Zitat von Robert Marquardt
RegisterDeviceNotification sollte man nicht brauchen. Es ist dafuer zustaendig das man alle WM_DEVICECHANGEs fuer ein bestimmtes Device bekommt.
Die Basis-DEVICECHANGEs bekommt man auch so.

Klar, nur leider nicht für alle Geräteklassen. Daher mein Tip.

Im PSDK steht (Hervorhebung meinerseits):
The DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE events are automatically broadcast to all top-level windows for port devices. Therefore, it is not necessary to call RegisterDeviceNotification for ports, and the function fails if the dbch_devicetype member is DBT_DEVTYP_PORT. Volume notifications are also broadcast to top-level windows, so the function fails if dbch_devicetype is DBT_DEVTYP_VOLUME. OEM-defined devices are not used directly by the system, so the function fails if dbch_devicetype is DBT_DEVTYP_OEM.
Kann mein Fehler sein, aber ich sah Smartcards nicht als "port devices" an ...
Aber als übersetzer der entsprechenden API-Teile bei den JEDIs kennst du dich dabei sicher besser aus.

Die Benutzung von RegisterDeviceNotification ist wunderbar im PSDK beschrieben, einfach durchlesen und das erarbeitete anwenden. Hat man das ein paar Mal gemacht, hat man das Schema raus und braucht beim nächsten mal nur noch gezielt nachschauen wie diese oder jene API-Funktion aufgerufen wird.

Rociel 9. Sep 2006 10:28

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
aso, ok, lads mir grad runter.

und die Karte im CardReader läuft dann unter DBT_DEVTYP_OEM, ja?

Olli 9. Sep 2006 12:17

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
Ich denke eher: DBT_DEVTYP_DEVICEINTERFACE und dann die GUID für Smartcard-Devices.

Rociel 9. Sep 2006 15:05

Re: SD-Card im CardReader mittels WM_DeviceChange?
 
so, ich hab den CardReader angeschlossen, und folgenden code verwendet:

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
var dbi: DEV_BROADCAST_DEVICEINTERFACE;
  Size: Integer;
begin
  Size := SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi, Size);
  dbi.dbcc_size := Size;
  dbi.dbcc_devicetype := DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved := 0;
  dbi.dbcc_classguid := GUID_DEVINTERFACE_SD;
  dbi.dbcc_name := 0;

  RegisterDeviceNotification(FWindowHandle, @dbi, DEVICE_NOTIFY_WINDOW_HANDLE);
end;
delphi meckert nich, un startet das programm ohne fehler.

und nu zur classGUID, ich hab in der registry n bissl gestöbert, und folgende Schlüssel:
  • HK_LocalMachine\Systen\CurrentControlSet\Enum\
  • USBSTOR\'blabla_zeugs,von Cardreader'\000000000020&1\ (wobei es &0 bis &3 gibt)
  • USB\Vid_0dda&Pid_2005\Vid_0dda&Pid_2005\ und
  • STORAGE\RemovableMedia\
  • STORAGE\Volume\

verschiedenste GUIDs gefunden, und halt zugeordnet:
Delphi-Quellcode:
const
  GUID_DEVINTERFACE_SD: TGUID = '{71A27CDD-812A-11D0-BEC7-08002BE2092F}';
er bringt aber keine meldung, beim reinstecken, bzw. rausziehn der Karte.....[delphi]


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
Seite 1 von 3  1 23      

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