[英]How do I marshal cstring* via P/Invoke?
我试图从C#调用第三方DLL,但无法整理一些字符串数据。 DLL是用Clarion编写的,我对所使用的数据类型不是很熟悉。 具体来说,该规范具有我无法使用的功能的以下签名:
Bool QuerySoftwareVersion( cstring* version) // edited documentation typo
//Returns Software version (20 character cstring).
我以为cstring只是一个以空字符结尾的字符串,但是在我的定义中,我无法使它与out char[] version
一起使用。 有人知道正确的处理方式吗?
编辑:实际上,到目前为止,我发现这表明Clarion中的cstring确实只是一个以空字符结尾的字符串。
更新:我已经更新了问题的标题和详细信息,因为事实证明DLL文档中有错字。 有问题的version
参数声明为cstring*
类型,而不是cstringt*. And in Clarion,
类型cstringt*. And in Clarion,
cstringt*. And in Clarion,
cstring`显然只是一个c样式,以null终止的字符串。 因此,封送处理不应该那么复杂,因为他们声称封送处理是使用C调用约定编写的。 有没有人成功地p /调用了通过参考参数传递字符串的Clarion DLL?
我从未调用过Clarion,但是我有一个Clarion和C#都调用过的DLL(用C语言编写),我将其互操作为:
[DllImport("clarionlib.dll", CharSet=CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl,
ExactSpelling=true, EntryPoint="QuerySoftwareVersion")] static extern
bool QuerySoftwareVersion(StringBuilder sName);
还要注意,您传递的StringBuilder参数的大小必须达到最大预期返回值的大小(请原谅我的C#,我敢肯定等效项会更短):
System.Text.StringBuilder buffer;
buffer = new System.Text.StringBuilder();
buffer.EnsureCapacity(21);
QuerySoftwareVersion(buffer);
string myString = buffer.ToString();
我在DLL API中使用CString引用取得了一些成功:
SCODE WINAPI Test( const CString& str );
我使用以下C#代码导入:
[DllImport("CBData.Dll")]
public static extern int Test( [MarshalAs(UnmanagedType.LPStr)] ref String str );
并调用以下C#代码:
String b = "Some text";
int x = Test(ref b);
这对我有用-我不确定这是否安全。 我希望这可以帮助你。
尝试使用StringBuilder:
[DllImport("mylibrary.dll")]
static extern bool QuerySoftwareVersion([Out] StringBuilder version);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.