![]() |
SD-Card im CardReader mittels WM_DeviceChange?
hi, folgender code läuft ganz gut (mit cd's klappts):
Delphi-Quellcode:
Das problem ist, wenn ich in meinen über USB angeschlossenen CardReader eine Karte stecke, meldet der mit dieser prozedur garnix.
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; anzumerken ist, dass ich das autorun schon wie in ![]() 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? |
Re: SD-Card im CardReader mittels WM_DeviceChange?
Schonmal
![]() |
Re: SD-Card im CardReader mittels WM_DeviceChange?
hi, danke erstmal für den tipp, ich hab mir mal
![]() 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..... |
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 ![]() 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. |
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 |
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
|
Re: SD-Card im CardReader mittels WM_DeviceChange?
Zitat:
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. 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. |
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? |
Re: SD-Card im CardReader mittels WM_DeviceChange?
Ich denke eher: DBT_DEVTYP_DEVICEINTERFACE und dann die GUID für Smartcard-Devices.
|
Re: SD-Card im CardReader mittels WM_DeviceChange?
so, ich hab den CardReader angeschlossen, und folgenden code verwendet:
Delphi-Quellcode:
delphi meckert nich, un startet das programm ohne fehler.
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; und nu zur classGUID, ich hab in der registry n bissl gestöbert, und folgende Schlüssel:
verschiedenste GUIDs gefunden, und halt zugeordnet:
Delphi-Quellcode:
er bringt aber keine meldung, beim reinstecken, bzw. rausziehn der Karte.....[delphi]
const
GUID_DEVINTERFACE_SD: TGUID = '{71A27CDD-812A-11D0-BEC7-08002BE2092F}'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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 by Thomas Breitkreuz