【发布时间】:2009-09-09 10:16:07
【问题描述】:
我正在尝试使用来自本机程序的 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和端口的第一个字符。
我知道这与在 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.
这也不起作用。当我 Writeln pzIp 和 pzPort 我得到奇怪的结果。
忘了说,C++ dll 中的所有成员函数都使用__stdcall 编译并正确导出
【问题讨论】: