【问题标题】:DLL export issues with PAnsiChar in Delphi XE7 using stdcall conventionDelphi XE7 中使用标准调用约定的 PAnsiChar 的 DLL 导出问题
【发布时间】:2015-03-27 03:44:28
【问题描述】:

我有一个 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。

【问题讨论】:

    标签: delphi delphi-xe7 dllexport


    【解决方案1】:

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

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

    你需要

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

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

    【讨论】:

    • 如果我需要传递 PansiChar 类型的值 - 这是正确的方法吗?
    • 你的传球没问题。转换为 AnsiString,然后转换为 PAnsiChar,就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多