繁体   English   中英

如何通过P / Invoke封送cstring *?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM