Thema: Delphi dll in Delphi verwenden

Einzelnen Beitrag anzeigen

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