Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi dll in Delphi verwenden (https://www.delphipraxis.net/201558-dll-delphi-verwenden.html)

MorrisF 1. Aug 2019 08:29

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:
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';
Als Beispiel hier die GetScannerInfo-Funktion.
Was sind das alles für Übergabeparameter und wo bekomme ich die Werte dafür her?:?:
Kann mir irgendjemand helfen?

MFG
Morris

Jasocul 1. Aug 2019 09:19

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:
  • Product musst du an die Funktion übergeben
  • alles andere sind vermutlich Rückgabeparameter
  • Das Funktionsergebnis wird ein Fehlercode sein
Zumindest ist das eine durchaus übliche Variante.

MorrisF 1. Aug 2019 09:29

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

jus 1. Aug 2019 10:48

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

hoika 1. Aug 2019 11:09

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.

mkinzler 1. Aug 2019 11:34

AW: dll in Delphi verwenden
 
https://github.com/neslib/Chet

Dalai 1. Aug 2019 18:13

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

MorrisF 2. Aug 2019 09:39

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

MorrisF 5. Aug 2019 13:59

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:
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;
Die Fehlermeldung, die ich hier beim compilieren bekomme ist im Anhang (dllfehler1).

Und hier mein code für das statische einfügen der dll:
Delphi-Quellcode:
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 Fehlermeldung hierfür ist auch im Anhang (dllfehler2).

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

hoika 5. Aug 2019 14:20

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 +2. Es ist jetzt 10:08 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf