大佬教程收集整理的这篇文章主要介绍了Delphi PChar到C const char *,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
让我说我的C函数签名是形式@H_197_3@
int Setup(const char* szIp,const char* szPort);
function Setup(ip,port: PChar):Integer: virtual; cdecl; abstract;
从delphi程序的某个地方我可以打电话@H_197_3@
pObj.Setup('192.168.1.100','97777');
控件进入dll,但szIp和szPort形式参数只接收我从delphi程序传递的ip和port的第一个字符.@H_197_3@
我知道它与null在delphi中正确终止字符串有关.所以我也试过以下.@H_197_3@
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时,我得到了奇怪的结果.@H_197_3@
忘了说,来自C dll的所有成员函数都是用__stdcall编译并正确导出的@H_197_3@
例如如果你传递字符串’ABC’#0(我显式地显示空终止符,但这只是Delphi中字符串的隐式部分,不需要特别添加),这会传递一个指向8字节序列的指针,不是4个字节!@H_197_3@
但是因为字符串中的3个字符只有8位代码点值(在Unicode术语中,这意味着C代码“看到”的字符串看起来像:@H_197_3@
'A'#0'B'#0'C'#0#0#0
这可以解释为什么你的C代码似乎只是获取字符串的第一个字符 – 它在第一个字符的第二个字节中看到#0并假设它是整个字符串的空终止符.@H_197_3@
您需要修改C代码以正确接收指向WideCHAR字符串的指针,或者修改Delphi中的函数签名,并在将这些字符串传递给C函数之前将其转换为Delphi代码中的ANSIString:@H_197_3@
修改功能签名:@H_197_3@
function Setup(ip,port: PANSIChar):Integer: virtual; stdcall; abstract;
以及相应的“Long hand”显示在调用函数之前将字符串转换为ANSIString – 编译器可能会为您处理此问题,但您@R_668_9381@在代码中清除它而不是依赖于“编译器魔术”是有帮助的:@H_197_3@
var sIpaddress: ANSIString; sPort: ANSIString; begin sIpaddress := '192.168.1.100'; sPort := '97777'; pObj.Setup(sIpaddress,sPort); // etc...
以上是大佬教程为你收集整理的Delphi PChar到C const char *全部内容,希望文章能够帮你解决Delphi PChar到C const char *所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。