quando dichiari
function ReverseString(Str2Rev: PChar): boolean; cdecl; external 'simpledll';
vuol dire che (es sotto windows) ci deve essere nella stessa cartella simpledll.dll
il progetto della libreria si chiama project1:
sei sicuro che quando compili la libreria il file di output sia simpledll.dll?
Edit:
inoltre, nel file della libreria la dichiarazione è STDCALL:
function ReverseString(Str2Rev: PChar): boolean; stdcall;
mentre nel binario che la usa, la dichiari come CDECL
la dichiarazione deve essere la stessa
Io uso Lazarus 2.0.6 in Windows 10 64bit, non sono riuscito ad aprire il progetto postato da xinyiman (perché probabilmente proveniente da OsX). Ho creato un nuovo progetto ed ho inserito il codice estratto dai file postati. Ho apportato piccole correzioni al codice per adattarlo e renderlo funzionante in Windows.
Ho preferito riutilizzare la funzione di xinyiman per “invertire” la stringa, apportando piccole correzioni, in modo da concentrare l’attenzione sulla chiamata della DLL (in genere utilizzo altri metodi per lavorare sulle stringhe).
DLL:
library simpledll;
{$mode objfpc}{$H+}
uses
Classes, Sysutils;
{$R *.res}
function ReverseString(Str2Rev: PChar): boolean; stdcall;
var
NewStr: String;
i, sLun: integer;
Begin
sLun:=StrLen(Str2Rev);
if sLun>0 then Begin
NewStr:='';
For i:=sLun-1 downto 0 do
NewStr := NewStr + Str2Rev[i];
StrLCopy(Str2Rev, PChar(NewStr), sLun);
Result := True;
End Else
Result := False;
End;
(* xinyiman
function ReverseString(Str2Rev: PChar): boolean; stdcall;
var
NewStr: String;
NewStrPtr: PChar;
i: integer;
Begin
Try
Result := False;
NewStrPtr := @NewStr;
For I := StrLen(Str2Rev) - 1 to 0 do
NewStr := NewStr + Str2Rev[i];
StrLCopy(Str2Rev, NewStrPtr, StrLen(NewStrPtr));
Except
Result := True;
End;
End;
*)
exports
ReverseString index 1;
begin
end.
File chiamante:
unit Unit1;
{$mode objfpc}{$H+}
//{$linklib libsimpledll.dylib}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls (*, dynlibs*);
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
public
end;
function ReverseString(Str2Rev: PChar): boolean; stdcall; external 'simpledll.dll';
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
strA : PChar;
begin
strA := PChar(Edit1.Text);
if ReverseString(strA) then
ShowMessage(strA)
else
ShowMessage('Errore!');
Label1.Caption:=strA;
end;
end.
Ciao a tutti.
Otto.