AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

dll in Delphi verwenden

Ein Thema von MorrisF · begonnen am 1. Aug 2019 · letzter Beitrag vom 6. Aug 2019
Antwort Antwort
Seite 1 von 3  1 23   
MorrisF

Registriert seit: 3. Apr 2019
32 Beiträge
 
#1

dll in Delphi verwenden

  Alt 1. Aug 2019, 08:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.146 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 09:19
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.
Peter
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
32 Beiträge
 
#3

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 09:29
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
Angehängte Dateien
Dateityp: pdf ReinerScanner API Functions.pdf (2,07 MB, 38x aufgerufen)
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
315 Beiträge
 
Delphi 2007 Professional
 
#4

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 10:48
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

Geändert von jus ( 1. Aug 2019 um 10:54 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.833 Beiträge
 
Delphi XE4 Professional
 
#5

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 11:09
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.
Heiko

Geändert von hoika ( 1. Aug 2019 um 19:00 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.652 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 11:34
https://github.com/neslib/Chet
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.544 Beiträge
 
Delphi 5 Professional
 
#7

AW: dll in Delphi verwenden

  Alt 1. Aug 2019, 18:13
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

Geändert von Dalai ( 1. Aug 2019 um 18:16 Uhr)
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
32 Beiträge
 
#8

AW: dll in Delphi verwenden

  Alt 2. Aug 2019, 09:39
Vielen Dank, für die Tipps!
Ich werde mich mal durch die pdf arbeiten und ein bisschen rumprobieren.

MFG
Morris
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
32 Beiträge
 
#9

AW: dll in Delphi verwenden

  Alt 5. Aug 2019, 13:59
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)
Miniaturansicht angehängter Grafiken
dllfehler1.png   dllfehler2.png  
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.833 Beiträge
 
Delphi XE4 Professional
 
#10

AW: dll in Delphi verwenden

  Alt 5. Aug 2019, 14:20
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?
Heiko

Geändert von hoika ( 5. Aug 2019 um 14:26 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf