Hola!
Veo varias cosas mal en tu código, te comento:
Código Delphi
[-]
const
DLLFunc: TDLLFunc = nil;
DLLName = 'inicio.DLL';
DLLName sí que es constante. DLLFunc es una variable.... primero apunta a nil, y después a la dirección de la función en la DLL. Por tanto, cámbialo por:
Código Delphi
[-]
var
DLLFunc: TDLLFunc = nil;
const
DLLName = 'inicio.DLL';
Segundo, estás liándote con la carga de la DLL. Puedes cargar una DLL de dos formas:
Así, siendo la carga automática (la palabra far te sobra....):
Código Delphi
[-]
function suma(parametro1: PAnsiChar ; parametro2: PAnsiChar ; parametro3:PAnsiChar ; parametro4:PAnsiChar ): AnsiChar;
stdcall; external 'inicio.DLL';
procedure TForm1.FormCreate(Sender: TObject);
var
resultadosuma: string;
begin
resultadosuma := suma(
PansiChar(AnsiString('a1')),
PansiChar(AnsiString('b2')),
PansiChar(AnsiString('c3')),
PansiChar(AnsiString('d4'))
);
end;
O de esta otra forma, que sería manual:
Código Delphi
[-]
procedure TForm1.FormCreate(Sender: TObject);
var
resultadosuma: string;
begin
DLLHandle := LoadLibrary(DLLName);
if (DLLHandle < HINSTANCE_ERROR) then
raise Exception.Create(DLLName + ' library can not be loaded or not found. ' + SysErrorMessage(GetLastError));
try
@DLLFunc := GetProcAddress(DLLHandle, 'suma');
if Assigned(DLLFunc) then
begin
resultadosuma := DLLFunc(
PansiChar(AnsiString('a1')),
PansiChar(AnsiString('b2')),
PansiChar(AnsiString('c3')),
PansiChar(AnsiString('d4'))
);
...
end;
end;
pero no de las dos formas a la vez!!!
Las dos son igual de válidas, pero si usas la primera, si la librería no existe tu aplicación no arrancará, mietras que si usas la segunda puedes controlar esto y hacer otras cosas, o no usar la funcionalidad que proporciona etc... La más sencilla es la primera, por supuesto.
Tercero:
StrPas recibe un PChar (o PAnsiChar) como parámetro y devuelve un string. Por supuesto no puedes hacer StrPas(resultadosuma), ya que resultadosuma es string, no PAnsiChar. Para usarlo bien deberás usarlo así:
Código Delphi
[-]
var
LStringAMostrar: string;
begin
LStringAMostrar:=StrPas(suma(...)); end
Cuarto:
Si quieres que suma devuelve una cadena de texto, NOOOOO puede devolver AnsiChar, ya que AnsiChar es un carácter sólo!!! Deberá devolver un PAnsiChar, exactamente igual que lo harías en c. Ahora tendrás un puntero a una cadena, el cual puedes pasarle a StrPas para que te genere la string correcta.
Creo que eso es todo....
Un saludo,
LoPiTaL