AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi plötzlich Probleme mit RegisterDeviceNotification
Thema durchsuchen
Ansicht
Themen-Optionen

plötzlich Probleme mit RegisterDeviceNotification

Ein Thema von Shadow · begonnen am 14. Apr 2008 · letzter Beitrag vom 15. Apr 2008
Antwort Antwort
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#1

plötzlich Probleme mit RegisterDeviceNotification

  Alt 14. Apr 2008, 16:51
Hallo alle zusammen,

hab hier ein kleines Problem und so langsam weiß ich nciht mehr weiter.. vielleicht kann mir ja jemand helfen...

Ich habe den unten angehängten Code genutzt um zu erkennen ob ein usb stick eingesteckt / abgezogen wird.
Der Code läuft auch ohne Probleme (compiliert mit Delphi4)

Nach eienr Umstellung auf Turbo Delphi bekomme ich bei der RegisterDeviceNotification bei GetLast Error 13 (The data is invalid.).

Verstehe nicht woher das kommt liegt das an einer compieroption ? Komisch das es mit dem älteren compiler geht.

Muß das dringend wieder zum laufen bekommen Bin für jede Hilfe dankbar


Lg
Andre



Delphi-Quellcode:
// Component to detect when usb devices are connected or disconnected
// using RegisterDeviceNotification

unit U_Usb;

interface

uses
  Windows, Messages, SysUtils, Classes, Forms;

type

    PDevBroadcastHdr = ^DEV_BROADCAST_HDR;
    DEV_BROADCAST_HDR = packed record
      dbch_size: DWORD;
      dbch_devicetype: DWORD;
      dbch_reserved: DWORD;
    end;

    PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
    DEV_BROADCAST_DEVICEINTERFACE = record
      dbcc_size: DWORD;
      dbcc_devicetype: DWORD;
      dbcc_reserved: DWORD;
      dbcc_classguid: TGUID;
      dbcc_name: short;
    end;

const
     GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
     DBT_DEVICEARRIVAL = $8000; // system detected a new device
     DBT_DEVICEREMOVECOMPLETE = $8004; // device is gone
     DBT_DEVTYP_DEVICEINTERFACE = $00000005; // device interface class

type

  TComponentUSB = class(TComponent)
  private
    FWindowHandle: HWND;
    FOnUSBArrival: TNotifyEvent;
    FOnUSBRemove: TNotifyEvent;
    procedure WndProc(var Msg: TMessage);
    function USBRegister: Boolean;
  protected
    procedure WMDeviceChange(var Msg : TMessage); dynamic;
  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property OnUSBArrival: TNotifyEvent read FOnUSBArrival write FOnUSBArrival;
    property OnUSBRemove: TNotifyEvent read FOnUSBRemove write FOnUSBRemove;
  end;

implementation

constructor TComponentUSB.Create(AOwner : TComponent);
begin
     inherited Create(AOwner);
     FWindowHandle := AllocateHWnd(WndProc);
     USBRegister;
end;

destructor TComponentUSB.Destroy;
begin
     DeallocateHWnd(FWindowHandle);
     inherited Destroy;
end;

procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
     if (Msg.Msg = WM_DEVICECHANGE) then begin
        try
           WMDeviceChange( Msg );
        except
              Application.HandleException(Self);
        end;
     end
     else
         Msg.Result := DefWindowProc( FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TComponentUSB.WMDeviceChange(var Msg : TMessage);
var
   devType: Integer;
   Datos: PDevBroadcastHdr;
begin
     if (msg.WParam=DBT_DEVICEARRIVAL) or (msg.WParam=DBT_DEVICEREMOVECOMPLETE) then begin
        Datos := PDevBroadcastHdr(msg.LParam);
        devType := Datos^.dbch_devicetype;
        if devType=DBT_DEVTYP_DEVICEINTERFACE then begin // USB Device
           if msg.WParam=DBT_DEVICEARRIVAL then begin
              if Assigned( FOnUSBArrival ) then
                 FOnUSBArrival( Self );
           end else begin
               if Assigned( FOnUSBRemove ) then
                  FOnUSBRemove( Self );
           end;
        end;
     end;
end;

function TComponentUSB.USBRegister: Boolean;
var
   dbi: DEV_BROADCAST_DEVICEINTERFACE;
   size: Integer;
   r: Pointer;
begin
     Result := False;
     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_USB_DEVICE;
     dbi.dbcc_name := 0;

     r := RegisterDeviceNotification( FWindowHandle,
                                      @dbi,
                                      DEVICE_NOTIFY_WINDOW_HANDLE
                                     );
     if Assigned( r ) then Result := True;

end;

end.
[edit=SirThornberry]Text korrigiert - aus "hab ihr.." wird "hab hier.." - Mfg, SirThornberry[/edit]
Andre
  Mit Zitat antworten Zitat
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 09:55
Hat keiner ne Idee ?
Andre
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:01
mach mal aus
DEV_BROADCAST_DEVICEINTERFACE = record einfach
DEV_BROADCAST_DEVICEINTERFACE = packed record Du kannst ja auch mal mit dem Debugger durchsteppen ob sizeof wirklich den richtigen Wert angibt. Wenn nicht liegts wohl daran das die Elemente im Record anders aligned sind als in Delphi4.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:07
Ja an SizeOf dachte ich gestern abend auch schon .. bin gerade am testen ...
Andre
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:11
was ich nicht ganz verstehe ist das du DEV_BROADCAST_HDR definierst aber dann gar nicht in deiner eigenen Struktur verwendest.
Anstelle von
Delphi-Quellcode:
PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE;
DEV_BROADCAST_DEVICEINTERFACE = packed record
  dbcc_size: DWORD;
  dbcc_devicetype: DWORD;
  dbcc_reserved: DWORD;
  dbcc_classguid: TGUID;
  dbcc_name: short;
end;
hätte ich es dann so erwartet:
Delphi-Quellcode:
DEV_BROADCAST_DEVICEINTERFACE = packed record
  dbcc_hdr: DEV_BROADCAST_HDR;
  dbcc_classguid: TGUID;
  dbcc_name: short;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:14
Also packed hat erstmal so nix gebracht ... unter delphi4 hat die Struktur ne größe von 32 unter Turbo nur 30
wird also daran liegen nur egal was ich recordfeld ausrichten unter den Compileroptionen rum spiele es scheint sich nix zu ändern an der größe der Struktur ... auf alle fälle ist es schon mal die richtige Spur...hmm
Andre
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:16
dann müsstest du mal prüfen wie groß DWord, short und TGui in den verschiedenen Delphiversionen sind und die Datentypen entsprechend anpassen. Ohne TGui ist die Struktur 14 Bytes groß.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:29
Jups ... habs eben mal getestet also

unter delphi 4

Gesamte Struktur 32

DWORD 4
GUI 16
Short 2


unter turbo

Gesamte Strukut 30

DWORD 4
GUI 16
Short 2


Kann also nur noch daran liegen wie das Record abgelegt wird.
Andre
  Mit Zitat antworten Zitat
Shadow

Registriert seit: 31. Aug 2007
Ort: Glinde
17 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: plötzlich Probleme mit RegisterDeviceNotification

  Alt 15. Apr 2008, 10:47
Sooo .. also in Delphi 4 ist unter compiler Optionen "Ausgerichtete Recordfelder" anktiviert was einer
Compileroption von {$A+} entspricht und siehe da wenn ich die setze geht es .. die Struktur ist dann ebenfalls 32 und
die RegisterDeviceNotification liefert das ersehnte Ergebnis

Danke für deine Hilfe Jens.

Lg Andre
Andre
  Mit Zitat antworten Zitat
Antwort Antwort


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:38 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