"Can't assign values to an address" beim Zuweisen von DLL Funktion

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
anse
Beiträge: 7
Registriert: So 23. Feb 2025, 16:17
OS, Lazarus, FPC: Winux (L 3.8 FPC 3.2.2)
CPU-Target: 64Bit
Kontaktdaten:

"Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von anse »

Ich bin neu in der Lazarus/FPC Welt, und möchte hier einen Teil aus einem Delphi-Programm in Lazarus zum Laufen bekommen. Hier meckert der Compiler mit "Can't assign values to an address".
Der Code ist zum besseren Verständnis vereinfacht.
Muss ich tatsächlich für jede externe Funktion/Prozedur einen eigenen Typ definieren, auf den ich dann caste? Also z.B. "mysql_get_client_info := Tmysql_get_client_info(GetProcAddress(...))" ?

Code: Alles auswählen

type
  TMyLib = class(TObject)
    mysql_get_client_info: function: PAnsiChar; stdcall;
    mysql_get_server_info: function(Handle: PMYSQL): PAnsiChar; stdcall
    private
      FHandle: TLibHandle;
    protected
      procedure AssignProc(var Proc: Pointer; Name: PAnsiChar);
    public
      constructor Create(DllFile);
  end;
...

constructor TMyLib.Create(DllFile: String);
begin
  inherited Create;
  FHandle := LoadLibrary(DllFile);
  AssignProc(@mysql_get_client_info, 'mysql_get_client_info'); <<< Error: Can't assign values to an address
  AssignProc(@mysql_get_server_info, 'mysql_get_server_info');
  ...
end;

procedure TMyLib.AssignProc(var Proc: Pointer; Name: PAnsiChar);
begin
  Proc := GetProcAddress(FHandle, Name);
end;

Die FPC-Doku sagt hierzu nur:
Error: Can’t assign values to an address

It is not allowed to assign a value to an address of a variable, constant, procedure or function. You can try compiling with -So if the identifier is a procedure variable.
Das ändert den Compiler-Modus zu "Turbo Pascal". Ändert aber nichts an dem Compiler-Fehler...

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

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von Mathias »

So in der Schnelle, muss es so deklariert sein, ausserhalb von deiner class.

Code: Alles auswählen

  Tmysql_get_server_info = procedure(level: TLevel) of object;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

braunbär
Beiträge: 463
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
CPU-Target: 64Bit
Wohnort: Wien

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von braunbär »

Das Format von prozeduralen Parametern ist in Free Pascal anders als in Delphi, da bin ich am Anfang auch drüber gestolpert.
Versuche als erstes, im Mode Delphi (nicht Turbo Pascal) zu kompilieren. Wenn es in Delphi funktioniert hat, müsste es im Mode Delphi hier auch funktionieren.

anse
Beiträge: 7
Registriert: So 23. Feb 2025, 16:17
OS, Lazarus, FPC: Winux (L 3.8 FPC 3.2.2)
CPU-Target: 64Bit
Kontaktdaten:

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von anse »

Guter Punkt, leider funktioniert aber auch der Delphi-Modus nicht, also -Sd in den Compiler Options.

Code: Alles auswählen

  TMyLib = class(TObject)
    mysql_get_client_info: function: PAnsiChar; stdcall;
...
  @mysql_get_client_info := GetProcAddress(LibHandle, 'mysql_get_client_info');
  >>> Error: Can't assign values to an address
Auch GetProcedureAddress anstatt GetProcAddress gibt denselben Fehler.

Nebenfrage: kann man beim Kompilieren irgendwo die finale FPC-Kommandozeile sehen?

anse
Beiträge: 7
Registriert: So 23. Feb 2025, 16:17
OS, Lazarus, FPC: Winux (L 3.8 FPC 3.2.2)
CPU-Target: 64Bit
Kontaktdaten:

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von anse »

Sorry.... Delphi mode funktioniert doch! Ich hatte die Compileranweisung {$mode objfpc} im Kopf der Unit noch drin - da nützt offenbar auch der globale -Sd Schalter nix. Mit {$mode delphi} geht alles durch.

Ähnlicher Thread: https://www.pilotlogic.com/sitejoom/ind ... dress.html

Benutzeravatar
Zvoni
Beiträge: 378
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von Zvoni »

Ich wäre doch sehr erstaunt, wenn die mysql-libs ihre Prozeduren per "stdcall" exportieren......
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

CCRDudeLaz
Beiträge: 54
Registriert: Do 25. Jan 2024, 08:33
OS, Lazarus, FPC: Win/macOS (L trunk FPC trunk)
CPU-Target: 32+64

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von CCRDudeLaz »

Zvoni hat geschrieben: Mo 24. Feb 2025, 08:30 Ich wäre doch sehr erstaunt, wenn die mysql-libs ihre Prozeduren per "stdcall" exportieren......
Staunen ist erlaubt ;)

Die "klassische" Header-Übersetzung von Matthias Fichtner für Delphi nutzt erfolgreich stdcall. FreePascal definiert stdcall für Windows und cdecl für Unix.

Benutzeravatar
Zvoni
Beiträge: 378
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: "Can't assign values to an address" beim Zuweisen von DLL Funktion

Beitrag von Zvoni »

CCRDudeLaz hat geschrieben: Mo 24. Feb 2025, 09:24
Zvoni hat geschrieben: Mo 24. Feb 2025, 08:30 Ich wäre doch sehr erstaunt, wenn die mysql-libs ihre Prozeduren per "stdcall" exportieren......
Staunen ist erlaubt ;)

Die "klassische" Header-Übersetzung von Matthias Fichtner für Delphi nutzt erfolgreich stdcall. FreePascal definiert stdcall für Windows und cdecl für Unix.
Huh? Hab grad in mysql.inc nachgeschaut.
Du hast recht: Es ist stdcall für Windows. *staun*
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten