使用stdcall约定在Delphi XE7中使用PAnsiChar导出DLL

时间:2015-03-27 03:44:28

标签: delphi delphi-xe7 dllexport

我有一个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是指向

类型的func的指针
TDecrypt =  function (aText: PAnsiChar; aKey: PAnsiChar): PAnsiChar;

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

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

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

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

另外请建议:通过PAnsiChar以及如何在我的dll中将其强制转换为AnsiString的正确方法。

1 个答案:

答案 0 :(得分:1)

导入时未能指定调用约定。而不是

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

你需要

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

请注意返回值。您必须确保使用GetMem或等效项动态分配返回的值。而且你还需要从DLL中导出一个deallocator。