GetProcAddress

Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

GetProcAddress

Beitrag von malabarista »

Ich versuche eine eigene DLL einzubinden. Und bekomme beim Kompilieren dabei eine Fehlermeldung:
Argument cannot be assigned to


Code: Alles auswählen

 
var
  Form1: TForm1;
  hLib2: HMODULE;
  function starth(MHandle, AHandle: HWND): Byte; stdcall;
  function stoph(): boolean; stdcall;
...
 
procedure TForm1.start(Sender: TObject);
 
begin
  hLib2 := LoadLibrary('k3h.dll');
  if hLib2<>0 then
     begin
     @starth := GetProcAddress(hLib2, 'startk3h');   //<-- hier kommt die compiler-Fehlermeldung
     if @starth = nil then Exit;
     end;
...
 
 


Was ist da falsch ?
Und wie muss es richtig heissen ?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: GetProcAddress

Beitrag von mse »

malabarista hat geschrieben:

Code: Alles auswählen

 
     starth := GetProcAddress(hLib2, 'startk3h');   //kein @
 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GetProcAddress

Beitrag von Mathias »

Anscheinend führen mehrere Wege nach Rom, bei mir sieht sowas ganz anders aus. :roll:
Der Weg von mse sieht irgendwie viel eleganter aus.

Code: Alles auswählen

var
  LibHandle:THandle;
  QAPIExtOpenCard:function (cardnum:Longint;devnum:Longint): Longint; stdcall;
begin
  LibHandle := LoadLibrary(PChar('qlib32.dll'));
 
  if LibHandle = 0 then begin
    Fehler;
    Exit;
  end;
 
  Pointer(QAPIExtOpenCard) := GetProcAddress(LibHandle, 'QAPIExtOpenCard');
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: GetProcAddress

Beitrag von mse »

Wenn's denn funktioniert, ich habe lediglich aus dem Gedächtnis geantwortet. Ich verwende jeweils initializedynlib(), siehe z.B.
https://gitlab.com/mseide-msegui/mseide ... peakng.pas

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GetProcAddress

Beitrag von Mathias »

Die Varianten mit LoadLibrary sind sowieso schlecht, das diese an Windows gebunden sind.

So viel ich wies, gibt es noch etwas Platttformübergreifendes, nur habe ich mich damit (noch) nicht befasst, das die Sache mit qlib32.dll eine einmalige Sache war.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: GetProcAddress

Beitrag von malabarista »

Bei Weglassen des @ erhalte ich beim Kompilieren die beiden Fehlermeldungen
Error: Wrong number of parameters specified for call to "starth"
Error: Found declaration: starth(LongWord;LongWord):Byte; StdCall;

Wobei ich nicht weiss, wo er sich diese declaration mit "LongWord" herholt.

Denn in der DLL ist die function definiert als:
function startk3h(MHandle, AHandle: HWND): Byte; export;

und hier habe ich sie am Anfang (s.Beispiel) definiert:
function starth(MHandle, AHandle: HWND): Byte; stdcall;

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: GetProcAddress

Beitrag von mse »

Welcher Dialekt, {$mode delphi} oder {$mode objfpc}?

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: GetProcAddress

Beitrag von malabarista »

Was ist der Unterschied zwischen den beiden ?

Vorbesetzt war
{$mode objfpc}{$H+}

und das habe ich so gelassen...

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: GetProcAddress

Beitrag von mse »

malabarista hat geschrieben:Was ist der Unterschied zwischen den beiden ?

Die indirection für Prozedur-Variablen ist unterschiedlich.
Vorbesetzt war
{$mode objfpc}{$H+}

Mathias hat schon recht:

Code: Alles auswählen

 
var
  hLib2: HMODULE;
  starth: function(MHandle, AHandle: HWND): Byte; stdcall;
  stoph: function(): boolean; stdcall;
[...]
 hLib2 := LoadLibrary('k3h.dll');
 if hLib2<>0 then begin
  pointer(starth):= GetProcAddress(hLib2, 'startk3h');
  if starth = nil then begin
   Exit;
  end;
 end;
 

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: GetProcAddress

Beitrag von malabarista »

Ja, das klappt.
Danke.

Antworten