使用标准调用约定的 Delphi XE7 中 PAnsiChar 的 DLL 导出问题

DLL export issues with PAnsiChar in Delphi XE7 using stdcall convention

我有一个 DLL- 有一个函数

Decrypt(aText, aKey: PAnsiChar): PAnsiChar; stdcall

而且这个功能已经导出了。 作为

exports
  Decrypt;

如果我通过以下方式从客户端调用:

lH :=  LoadLibrary('EncDec.dll');
FEncDyc := GetProcAddress(lH , PChar('Decrypt'));

lResult := FEncDyc(PAnsiChar(AnsiString(EditPwd.Text)), 
    PAnsiChar(AnsiString(EditKey.Text)));

其中 FEncDyc 是指向类型

的函数的指针
TDecrypt =  function (aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar;

我总是得到参数 aText 和 aKey 的垃圾值;我哪里错了? 如果我将 dll 的定义更改为

Decrypt(aText, aKey: PAnsiChar): PAnsiChar; export;

我在 DLL 中得到的值没有垃圾字符 - 工作正常!

stdcall 的代码有什么问题,如果我改用导出密钥,会有什么不同。

另外请建议:传递 PAnsiChar 的正确方法是什么以及如何在我的 dll 中将其类型转换为 AnsiString。

导入时指定调用约定失败。而不是

TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar;

你需要

TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar; stdcall;

请注意 return 值。您必须确保使用 GetMem 或等效项动态分配您 return 的值。并且您还需要从 DLL 中导出一个释放器。