我有以下问题:
我有一个用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;
我错过了什么吗? 感谢。
答案 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