Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich versuche gerade mit Lazarus eine dll zu erstellen. Zunächst als Test mit einer einfachen Funktion:

function hello(name: String): String;

begin

  hello := 'Hallo ' + name;

end;

Die dll wird übersetzt und ich kann diese in meinem Programm auch einbinden. Drücke ich hier auf einen Knopf und lass mir von "hello" den Knopf-Titel ändern funktioniert das auch. Nur sobald ich ein zweites mal auf den Knopf drücke erhalte ich einen SIGSEGV. Diesen erhalte ich auch wenn ich das Programm dann einfach nur schließen will.

Ich habe im Internet leider nichts passendes gefunden bisher: Hat mir irgendjemand ein einfaches Beispiel für free pascal mit einer dll? Oder kennt jemand dieses Problem und weiß wie man es umgeht?

Kapitel 12 der fpc Doku hab ich gelesen und auch einige Beispiele im Wiki angesehen. Bloß fehlten da immer wieder mal irgendwelche Type-Definitionen. Und wenn ich das sinngemäß nachgebaut habe, habe ich halt immer obigen Fehler erhalten.

Vielen Dank,

dd

Geschrieben

Das mit der Speicherzugriffsverletung ist mir schon klar. Nur weiß ich nicht wo die passiert. Dachte, dass das evtl. ein generelles Problem bei der Programmierung mit FPC ist. Deswegen auch die Frage nach dem Beispiel.

Aber um diesen konkreten Fall mit mehr Hintergrund zu füllen:

Das Programm:

unit Unit1; 


{$mode objfpc}{$H+}


interface


uses

  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,

  dynlibs;



type


  { TForm1 }


  TForm1 = class(TForm)

    Button1: TButton;

    Label1: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);

    procedure FormCreate(Sender: TObject);

  private

    { private declarations }

    dll: THandle;

    hello: function (name: string): string; cdecl;


  public

    { public declarations }

  end; 


var

  Form1: TForm1; 


implementation


{$R *.lfm}


{ TForm1 }


procedure TForm1.Button1Click(Sender: TObject);

begin

  Label1.Caption := hello('Du');;

end;


procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);

begin

  FreeLibrary(dll);

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

  dll := LoadLibrary('project1.' + SharedSuffix);

  Pointer(hello) := GetProcedureAddress(dll, 'hello');

end;


end.

Und die dll:
library testlib;


{$mode objfpc}{$H+}


uses

  Classes

  { you can add units after this };


{$R *.res}



function hello (name: string): string; cdecl;

begin

  hello := 'Hallo ' + name;

end;


exports

  hello;


end.

Geschrieben
Das mit der Speicherzugriffsverletung ist mir schon klar. Nur weiß ich nicht wo die passiert. Dachte, dass das evtl. ein generelles Problem bei der Programmierung mit FPC ist.

Du musst halt einmal debuggen. Prüfe einmal das Handle der Funktion auf Gültigkeit. Außerdem steht etwas über Pointer in der Doku Pointers weil THandle ist ein spezielles Handle. Weiterhin brauchst Du keine "globale" Variable auf Deine DLL, denn die DLL wird genau einmal geladen und entladen, das musst Du auch sicher stellen.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...