我试图使用本机程序中的C dll.我按照
here解释的虚拟方法场景
让我说我的C函数签名是形式
int Setup(const char* szIp, const char* szPort);
相应的delphi签名是
function Setup(ip, port: PChar):Integer: virtual; cdecl; abstract;
从delphi程序的某个地方我可以打电话
pObj.Setup('192.168.1.100', '97777');
控件进入dll,但szIp和szPort形式参数只接收我从delphi程序传递的ip和port的第一个字符.
我知道它与null在delphi中正确终止字符串有关.所以我也试过以下.
var
pzIp, pzPort: PChar;
szIp, szPort: string;
begin
szIp := '192.168.1.2';
szPort := '9777';
//initilize memory for pchar vars
GetMem(pzIp, Length(szIp)+1);
GetMem(pzPort, Length(szPort)+1);
//null terminate the strings
pzIp[Length(szIp)+1] := #0;
pzPort[Length(szPort)+1] := #0;
//copy strings to pchar
StrPCopy(pzIp, szIp);
StrPCopy(pzPort, szPort);
end.
这也是工作的.当我写pzIp和pzPort时,我得到了奇怪的结果.
忘了说,来自C dll的所有成员函数都是用__stdcall编译并正确导出的