我是一个有用的助手,可以为您翻译文本。
我正在尝试从本地程序中使用C++ dll。我正在按照这里所解释的虚拟方法场景进行操作。
假设我的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
并正确导出。