我有以下不能更改的c++函数(第三方):
c++
int __stdcall TEST(wchar_t **xml, int &result_size)
{
// xml is instantiated here!
}
c#
class native
{
[DllImport("somedll.dll")]
public static extern int TEST(StringBuilder a, ref int size);
{
}
}
示例:
StringBuilder b = new StringBuilder();
int size = 0;
native.Test(b,ref size)
字符串生成器对象仅包含第一个字符。如果我调整对象的大小:
b.Length = size; The data is incorrect except first character.
这是将wchar_t**从c++传递到c#的正确方式吗?
致以敬意,
约翰
发布于 2013-05-27 07:26:30
该函数将按如下方式p/调用:
[DllImport(@"mylib.dll")]
static extern int TEST(out IntPtr xml);
我删除了size参数,因为您可以使用以null结尾的字符串,所以不需要它。
如下所示调用函数:
IntPtr xmlptr;
int retval = TEST(out xmlptr);
string xml = Marshal.PtrToStringUni(xmlptr);
// deallocate xmlptr somehow
棘手的一点是释放分配在本机端的内存。或者使用共享分配器,例如COM分配器。或者从本机代码中导出一个解除分配器。
就我个人而言,我会重新设计接口以使用COM BSTR。我会让C++返回一个BSTR,并在托管端使用MarshalAs(UnmanagedType.BStr)。然后,框架会为您处理所有的释放和编组。
https://stackoverflow.com/questions/16751626
复制