使用标准调用约定的 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 中导出一个释放器。
我有一个 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 中导出一个释放器。