2 votes

Erreur lors de l'appel d'une DLL avec Unicode Delphi

J'ai une DLL avec ceci signature de la fonction :

function KP_RecuperarDadosFabricante(EnderecoIp, ChaveAcesso, 
  Porta: string; Return: PAnsiChar): Integer; stdcall; external 'Key.dll';

Voici un exemple de code VB.NET tiré du manuel de la dll :

Dim ret As Integer 
Dim ptrStr As IntPtr 
Dim DadosFab As String 

ptrStr = System.Runtime.InteropServices.Marshal.AllocHGlobal(256) 
ret = KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", ptrStr) 
DadosFab = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptrStr)
System.Runtime.InteropServices.Marshal.FreeHGlobal(ptrStr)

Voici mon code Delphi :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Return: string;
  pReturn: PAnsiChar;
begin
  GetMem(pReturn, 512);
  FillChar(pReturn^, 512, 0);
  Memo1.Text:='';
  if KP_RecuperarDadosFabricante("192.168.1.201", "0", "4370", pReturn) = 1 then
  begin
    Return := StrPas(pReturn);
    ShowMessage(Return);
  end
  else
  begin
    ShowMessage('Error');
  end;
end;

Ce code fonctionne bien dans Delphi 7 , mais ne fonctionne pas dans Delphi XE . Il renvoie toujours "Erreur". Comment faire fonctionner ce code dans Delphi XE ?

7voto

Rob Kennedy Points 107381

Si la DLL a été écrite dans Delphi 7, vous ne pouvez pas l'utiliser dans Delphi XE. Même si vous modifiez le fichier string paramètres à AnsiString pour que la taille des caractères soit la même, vous êtes toujours confronté au fait que la structure interne des chaînes de caractères a changé quelque part entre ces deux versions, de sorte que l'option AnsiString que vous envoyez à partir du code Delphi XE ne ressemblera pas à ce que le code Delphi 7 attend d'une AnsiString à regarder.

Si vous avez le pouvoir de modifier et de recompiler la DLL, vous devez faire en sorte que les paramètres soient les suivants PAnsiChar à la place, comme c'est le cas pour la plupart des autres DLL sous Windows. N'oubliez pas non plus de modifier la valeur finale de PChar au paramètre PAnsiChar .


Si la DLL a été écrite dans un langage autre que Delphi, il se peut que vous puissiez résoudre le problème en modifiant simplement la signature de la fonction. Les langages autres que Delphi ne disposent pas de la fonction string la déclaration était donc toujours erronée ; vous avez juste eu de la chance lorsque cela a fonctionné à partir de Delphi 7. Modifiez tous les paramètres pour qu'ils aient le type PAnsiChar (y compris le dernier paramètre) ; ils correspondront alors à l'élément char* qu'ils possèdent probablement à partir du code C d'origine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X