dll in Delphi verwenden
Hallo liebes Forum,
ich habe ein sehr spezifisches Problem aber hoffe trotzdem, dass mir jemand weiterhelfen kann. Von der Firma Reiner habe ich einen Scanner bekommen. Nun will ich ein Programm in Delphi schreiben, mit dem man diesen Scanner bedienen kann. Hierfür benutze ich die "98x_API.dll". Des weiteren habe ich ein pdf von Reiner erhalten, in dem die Funktionen der dll beschrieben werden. Leider habe ich keine Ahnung, wie ich mit diesen Funktionen umzugehen habe, bzw welche Funktion ich wann in meinem Programm verwenden sollte. Folgendermaßen greife ich auf die Funktionen der dll zu:
Delphi-Quellcode:
Als Beispiel hier die GetScannerInfo-Funktion.
function Scanner98x_GetScannerInfo(product:pchar; serialNumber:pchar; fwVersion:pchar;
strReserved:pchar; _Interface:pDWORD; camera:pDWORD; endorser:pDWORD; stamp:pDWORD; MICRReader:pDWORD; mcReader:pDWORD; docLength:pDWORD; extensions:pDWORD; dwReserved:pDWORD): DWORD; stdcall; external '98x_API.dll'; Was sind das alles für Übergabeparameter und wo bekomme ich die Werte dafür her?:?: Kann mir irgendjemand helfen? MFG Morris |
AW: dll in Delphi verwenden
Zunächst mal solltest du dieses Tutorial durchlesen:
http://michael-puff.de/Programmierun...l_tutorial.pdf Ansonsten kann man dir ohne die Anleitung zu den DLLs nicht sehr viel helfen. Ich nehme beim aktuellen Beispiel folgendes an:
|
AW: dll in Delphi verwenden
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank, für die schnelle Antwort!
Ich habe jetzt mal die pdf von Reiner angehängt. Das Tutorial werde ich mir auch durchlesen. MFG Morris |
AW: dll in Delphi verwenden
Hallo,
das Gerät kenne ich nicht, aber es kommt schon mal vor, dass man irgendwelche Fremdgeräte in Delphi einbinden muß, wo keine Delphisourcen existieren. Als ersten Schritt würde ich mal die mitgelieferten Beipsielprogramme durch den VisualC Compiler mal durchjagen und schauen ob es kompiliert und das Programm überhaupt funktioniert. Dann hast du zumindest Gewißheit, dass die mitgelieferten Beispiele funktionieren. Dann würde ich mir mal "die Scanner98x_API.h" Schnittstellendefinitionen genau anschauen und für den Anfang mal nur jene Teile übersetzen, die wirklich notwendig sind. Es gibt dazu vermutlich automatische Übersetzungstools von .h auf .pas, die könnte man sich auch zu Rate ziehen, wenn man mit C Syntax nicht so firm ist. Dann Schritt für Schritt in Delphi die Funktionen implementieren. Achja, ich würde statt "stdcall" auch mal "cdecl" bei C-DLLs probieren. ;-) lg, jus |
AW: dll in Delphi verwenden
Hallo,
laut PDF ist es stdcall. Hast du die PDF selbst mal gelesen. Steht doch alles drin, u.a. auch, was Product ist. Und auch das korrekte Byte-Alignment. Und es wird von einem Integration Example gesprochen. Wenn Du Glück hast, gibt es das auch in DotNet. Du musst halt ein bisschen probieren. |
AW: dll in Delphi verwenden
|
AW: dll in Delphi verwenden
Laut PDF erwartet die Funktion Scanner98x_GetScannerInfo als einzigen einen von zwei Parameter einen Zeiger auf eine Datenstruktur, nicht die einzelnen Teile davon in vielen Parametern. Was die Funktion tut, steht ebenfalls in dem PDF (unter Punkt 9. Schematic representation of the .. operation, functionality).
Grüße Dalai |
AW: dll in Delphi verwenden
Vielen Dank, für die Tipps!
Ich werde mich mal durch die pdf arbeiten und ein bisschen rumprobieren. MFG Morris |
AW: dll in Delphi verwenden
Liste der Anhänge anzeigen (Anzahl: 2)
So, ich bin zurück vom probieren. xD
Ich habe 2 Varianten ausprobiert. zum einen die statische und zum anderen die dynamische, wobei ich mich an dieses (http://michael-puff.de/Programmierun...l_tutorial.pdf) Tutorial gehalten habe. Allerdings funst es immernoch nicht. Hier der Code der dynamischen Version:
Delphi-Quellcode:
Die Fehlermeldung, die ich hier beim compilieren bekomme ist im Anhang (dllfehler1).
unit Scanner_DLLDynImport;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; const //DLL´s ct_nativeDLL = '98x_API.dll'; //Methoden der DLL´s ct_Init = 'Scanner98x_Init'; {$T+} type //DLL Methoden TFNInit = function (Attempts, Timeout: DWORD; Error: LPDWORD): Boolean; cdecl; var Scanner98x_Init: TFNInit = nil; type TDialog_Scannen = class(TForm) procedure FormCreate(Sender: TObject); function GetEntryPoints(): Boolean; private { Private-Deklarationen } public { Public-Deklarationen } end; var Dialog_Scannen: TDialog_Scannen; implementation {$R *.dfm} procedure TDialog_Scannen.FormCreate(Sender: TObject); begin try if GetEntryPoints() then Scanner98x_Init(1, 1000, nil); except on e: Exception do ShowMessage('Fehler in FormCreate(): ' + e.Message); end; end; function TDialog_Scannen.GetEntryPoints(): Boolean; var lib: THandle; begin Result := True; try lib := LoadLibrary(ct_nativeDLL); case lib = 0 of True: begin @Scanner98x_Init := nil; ShowMessage('FEHLER: DLL konnten nicht geladen werden!'); Result := False; end; else begin @Scanner98x_Init := GetProcAddress(lib, ct_Init); if not Assigned(Scanner98x_Init) then begin ShowMessage('FEHLER: Eintrittspunkt von Scanner98x_Init() nicht gefunden!'); Result := False; end; end; end; except on e: Exception do ShowMessage('Fehler in GetEntryPoints(): ' + e.Message); end; end; Und hier mein code für das statische einfügen der dll:
Delphi-Quellcode:
Die Fehlermeldung hierfür ist auch im Anhang (dllfehler2).
unit D_Scannen;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; const //DLL´s ct_nativeDLL = '98x_API.dll'; type TDialog_Scannen = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Dialog_Scannen: TDialog_Scannen; //DLL Methoden function Init(Attempts, Timeout: DWORD; Error: LPDWORD): Boolean; cdecl; external ct_nativeDLL name 'Scanner98x_Init'; implementation {$R *.dfm} procedure TDialog_Scannen.FormCreate(Sender: TObject); begin try Init(1, 1000, nil); except on e: Exception do begin ShowMessage('Fehler in FormCreate(): ' + e.Message); end; end; end; end. Die "98x_API.dll" ist jeweils im selben Ordner, wie die .exe, also was mach ich falsch? Sieht jemand irgendwelche groben Fehler? (Ich habe vorher noch nie mit Pointern gearbeitet:oops:) |
AW: dll in Delphi verwenden
Hallo,
- laut PDF ist es stdcall - Und Boolean ist meines Wissens <> BOOL. -> Google befragen - LoadLibrary schlägt fehl, wenn der Rückgabewert <=32 (oder <32) -> Google An welcher Stelle im Code kommt die Meldung direkt. Und die Meldung kommt wohl eher beim Laufen des Programmes, und nicht beim Compilieren? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 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