![]() |
Newbee! Anwendung für USB/HID - startet nicht auf anderem PC
Hallo,
Bin neu bei DELPHI. Ich habe jetzt eine Anwendung erstellt, die Standards aus dem Delphi-Paket nutzt und eine eigene DLL vom Hersteller. Per USB soll mit einem HID-Gerät kommuniziert werden. Hier auf meinem Läppi habe ich es entwickelt und es läuft. Die EXE und die fremde DLL auf 2 anderen PCs - läuft nicht. - Keine Fehlermeldung! Das USB-Device wird von WinXP korrekt erkannt und installiert, meine Anwendung erkennt auch den Connect/Disconnect des HID-Gerätes über einen Event und sendet Daten an das Gerät, welches auch eine Antwort sendet (die Kontroll-LEDs an meinem Gerät zeigen Aktionen). Der PC empfängt diese Daten nicht. Fehlt da jetzt wieder eine Library ? Wie gehe ich am besten an so ein Problem ? |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Hallo und herzlich willkommen inder Delphi-Praxis,
irgendwie sieht das schon nach einer fehlenden DLL aus. Aber um Dir helfen zu können brauchen wir schon noch ein paar mehr Informationen. Es gibt aber ein Programm, womit Du nachschauen kannst, welche DLL's u.s.w. Dein Programm nutzt. Ich weiß gerade leider den Namen nicht genau. |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Das klingt merkwuerdig. Hat das HID-Geraet zusatzliche Treiber oder laeuft es auf den Standard-HID-Treibern?
Was fuer eine Device-Klasse ist es denn? Ich nehme an du benutzt die HID-Komponente. Poste doch mal was du in OnDeviceChange machst. |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Hallo,
remote debugging würde ich da mal empfehlen. Inwieweit die PR das auch kann, weiss ich nicht. Ansonstens alles loggen (Textdatei) Heiko |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Hier mal das Proggi als Quelle.
Das Gerüst wurde mittels EasyHID automatisch erzeugt und ich habe noch etwas "Leben" eingehaucht.
Code:
unit FormMain;
interface uses Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs; const // input and out buffer size constants... BufferInSize = 32; BufferOutSize = 32; type // input and output buffers... TBufferIn = array[0..BufferInSize] of char; TBufferOut = array[0..BufferOutSize] of char; // main form TMain = class(TForm) Datentext: TMemo; Programmname: TLabel; ReadButton: TButton; LabelConnected: TLabel; DeviceLabel: TLabel; DeleteButton: TButton; SaveButton: TButton; SaveDialog: TSaveDialog; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ReadButtonClick(Sender: TObject); procedure DeleteButtonClick(Sender: TObject); procedure SaveButtonClick(Sender: TObject); private FBufferIn:TBufferIn; FBufferOut:TBufferOut; function USBEvent(var Msg: TMessage): Boolean; public end; var Main: TMain; implementation uses cUSBInterface, cUSBInterfaceTypes; const // vendor and product ID constants... VENDOR_ID = 6017; PRODUCT_ID = 2000; {$R *.DFM} procedure TMain.FormCreate(Sender: TObject); begin Application.HookMainWindow(USBEvent); Connect(Application.Handle); end; procedure TMain.FormDestroy(Sender: TObject); begin Application.UnHookMainWindow(USBEvent); end; procedure TMain.ReadButtonClick(Sender: TObject); Var DevHandle:cardinal; begin //Buffer löschen DatenText.Clear; //Daten vom USB-Device abrufen [...] DevHandle := GetHandle(VENDOR_ID, PRODUCT_ID); Write(DevHandle,@FBufferOut); //Löschen-Knopf aktivieren DeleteButton.Enabled := true; SaveButton.Enabled := true; end; { **************************************************************************** * Name : USBEvent * * Purpose : DLL message handler hook * **************************************************************************** } function TMain.USBEvent(var Msg: TMessage): Boolean; var DevHandle:cardinal; USBDatenText:string; I: Integer; begin result := False; if Msg.Msg = WM_HID_EVENT then begin case Msg.WParam of // a HID device has been plugged in... NOTIFY_PLUGGED : begin // is it our HID device... DevHandle := Msg.LParam; // handle of HID device in this message if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin //SetReadNotify(DevHandle,true); SetReadNotify(DevHandle,true); [das hier wird durchlaufen] LabelConnected.Caption:='connected'; DeviceLabel.Caption:='?'; [...] //Lesen-Knopf aktivieren ReadButton.Enabled := true; end; result := true; end; // a HID device has been device removed... NOTIFY_UNPLUGGED : begin DevHandle := Msg.LParam; // handle of HID device in this message if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin LabelConnected.Caption:='not connected'; DeviceLabel.Caption:=''; ReadButton.enabled := false; DeleteButton.enabled := false; end; result := true; end; // a HID device has been attached or removed. This event is fired after // either NotifyPlugged or NotifyUnplugged. NOTIFY_CHANGED : begin // get the handle of the device we are interested in // and set it's read notification flag to true... DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID); SetReadNotify(DevHandle,true); result := true; end; // a HID device has sent some data.. NOTIFY_READ : begin DevHandle := Msg.LParam; // handle of HID device in this message if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then begin // read the data - remember that first byte is report ID... Read(DevHandle,@FBufferIn); case FBufferIn[1] of 'T','L': begin [...] end; end; end; result := true; end; end; end; end; end. |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Das ist nicht die HID-Komponente, sondern ein "Konkurrenzprodukt". Ich wusste garnicht das es so etwas gibt.
Lade dir mal von ![]() Ich schreib dir mal ein Skelettprogramm, wenn ich mich ein bischen besser fuehle. Auf was fuer Windows-Varianten laeuft denn das Programm? Die obige Source sieht soweit sauber aus. |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Ja,
hatte ich mir auch schon angesehen und für zu aufwendig empfunden. Das Problem ist ja nur - es läuft auf dem Entwicklungs-PC. Warum nicht überall ? Bernd |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Bei der HID-Komponente kommt man mit weniger Code aus. Beantworte doch mal die Fragen. Der Unterschied muss in den Rechnern liegen.
|
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Hallo,
Danke erst mal für die Posts. Hier ein paar Antworten: Es sind alles Windows XP 32bit-Kisten. Das Gerät ist ein uC, den ich selbst mit Code versorge. Es werden keine extra-Treiber benötigt, das Gerät wird mit den Standard-HID-Treibern vom Betriebssystem erkannt und unterstützt. Es soll nichts steuern, sondern nur Daten austauschen. |
Re: Newbee! Anwendung für USB/HID - startet nicht auf andere
Probieren wir es erst mal mit der HID-Komponente.
Delphi-Quellcode:
Hier ein Programm fuer das Auslesen einer Fernbedienung. Ich glaube die richtige VID und PID einzusetzen sollte kein Problem sein.
unit NB5100PMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, JvComponentBase, JvHidControllerClass, StdCtrls; type TForm1 = class(TForm) HidCtl: TJvHidDeviceController; Label1: TLabel; ListBox1: TListBox; procedure HidCtlDeviceChange(Sender: TObject); procedure HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); public Dev: TJvHidDevice; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.HidCtlDeviceChange(Sender: TObject); begin // pruefen ob das bereits benutzte Geraet ausgesteckt wurde if Assigned(Dev) and not Dev.IsPluggedIn then begin // das Geraet zurueckgeben HidCtl.CheckIn(Dev); Label1.Caption := 'No device'; end; // noch kein Geraet in Benutzung if not Assigned(Dev) then // pruefen ob die Fernbedienung angesteckt wurde, wenn ja in Benutzung nehmen if HidCtl.CheckOutByID(Dev, $147A, $E019) then begin Label1.Caption := 'Device connected'; Listbox1.Items.Clear; end; end; procedure TForm1.HidCtlDeviceData(HidDev: TJvHidDevice; ReportID: Byte; const Data: Pointer; Size: Word); var I: Word; P: PChar; S: string; begin P := Data; S := ''; for I := 0 to Size - 1 do S := S + Format('%.2x ', [Cardinal(P[I])]); ListBox1.Items.Add(S); end; end. Wenn du nicht die JVCL benutzt, dann JvComponentBase aus dem uses loeschen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 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