GetProcAddress

GetProcAddress

Beitragvon malabarista » 9. Jan 2018, 15:11 GetProcAddress

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 ?
malabarista
 
Beiträge: 294
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 9. Jan 2018, 15:31 Re: GetProcAddress

malabarista hat geschrieben:
Code: Alles auswählen
 
     starth := GetProcAddress(hLib2, 'startk3h');   //kein @
 
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Mathias » 9. Jan 2018, 16:48 Re: GetProcAddress

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 9. Jan 2018, 17:16 Re: GetProcAddress

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
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Mathias » 9. Jan 2018, 17:44 Re: GetProcAddress

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon malabarista » 9. Jan 2018, 17:48 Re: GetProcAddress

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;
malabarista
 
Beiträge: 294
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 9. Jan 2018, 17:57 Re: GetProcAddress

Welcher Dialekt, {$mode delphi} oder {$mode objfpc}?
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon malabarista » 9. Jan 2018, 19:22 Re: GetProcAddress

Was ist der Unterschied zwischen den beiden ?

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

und das habe ich so gelassen...
malabarista
 
Beiträge: 294
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon mse » 9. Jan 2018, 19:56 Re: GetProcAddress

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;
 
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon malabarista » 10. Jan 2018, 11:48 Re: GetProcAddress

Ja, das klappt.
Danke.
malabarista
 
Beiträge: 294
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Windows



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried