Delphi动态DLL调用中的奇怪行为

时间:2017-01-12 00:11:58

标签: c++ delphi dll

我有以下问题:

我有一个用C ++编写的DLL,它接受输入参数为* char。

以下列方式使用Delphi RTL声明DLL时:

child_...

并在我的代码中调用它:

function MyDllCall(aParam: PAnsiChar): Longint; stdcall; external 'MyDllName.dll' name 'MyFunction'

效果很好。

当我尝试通过调用LoadLibrary,GetProcAddress和FreeLibrary来调用它时,如下面的代码:

MyDllCall(PAnsiChar('some text'));

我认为这个问题与以PAnsiChar传递的字符串参数有某种关系。试图更改C ++ DLL源代码,注销params并验证分配的param变量中的一些奇怪的文本。

编辑:以下是C ++ Dll代码的一部分:

procedure DllCall;
type
  TMyDllCall = function(aParam: PAnsiChar): Longint;
var
  aMyDllCall: TMyDllCall;
  libHandle: Integer;
  res: Integer; 
begin
  libHandle := LoadLibrary('MyDLL.dll');
  if libHandle <> 0 then
  begin
    @aMyDllCall := GetProcAddress(libHandle, 'MyDllFunction');
    if @aMyDllCall <> nil then
    begin
      res:= aMyDllCall(PAnsiChar('some text')); << This crashes
      FreeLibrary(libHandle);
    end;
  end;
end;

我错过了什么吗? 感谢。

1 个答案:

答案 0 :(得分:2)

您的第一个定义(静态定义)使用stdcall

function MyDllCall(aParam: PAnsiChar): Longint; stdcall; external Stdcall 'MyDllName.dll' name 'MyFunction';

你的第二个(动态的)没有。由于那个失败了,我认为很明显失踪的stdcall就是问题所在:

type
  TMyDllCall = function(aParam: PAnsiChar): Longint;  // No stdcall here