我有一个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的正确方法。
答案 0 :(得分:1)
导入时未能指定调用约定。而不是
TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar;
你需要
TDecrypt = function(aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar; stdcall;
请注意返回值。您必须确保使用GetMem
或等效项动态分配返回的值。而且你还需要从DLL中导出一个deallocator。