首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c# PInvoke w_char_t**

c# PInvoke w_char_t**
EN

Stack Overflow用户
提问于 2013-05-26 00:33:44
回答 1查看 223关注 0票数 0

我有以下不能更改的c++函数(第三方):

c++

代码语言:javascript
运行
复制
int __stdcall TEST(wchar_t **xml, int &result_size)
{
  // xml is instantiated here!
}

c#

代码语言:javascript
运行
复制
class native
{
   [DllImport("somedll.dll")]

   public static extern int TEST(StringBuilder a, ref int size);
   {
   }
}

示例:

代码语言:javascript
运行
复制
 StringBuilder b = new StringBuilder();
 int size = 0;
 native.Test(b,ref size)

字符串生成器对象仅包含第一个字符。如果我调整对象的大小:

代码语言:javascript
运行
复制
b.Length = size; The data is incorrect except first character.

这是将wchar_t**从c++传递到c#的正确方式吗?

致以敬意,

约翰

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-27 15:26:30

该函数将按如下方式p/调用:

代码语言:javascript
运行
复制
[DllImport(@"mylib.dll")]
static extern int TEST(out IntPtr xml);

我删除了size参数,因为您可以使用以null结尾的字符串,所以不需要它。

如下所示调用函数:

代码语言:javascript
运行
复制
IntPtr xmlptr;
int retval = TEST(out xmlptr);
string xml = Marshal.PtrToStringUni(xmlptr);
// deallocate xmlptr somehow

棘手的一点是释放分配在本机端的内存。或者使用共享分配器,例如COM分配器。或者从本机代码中导出一个解除分配器。

就我个人而言,我会重新设计接口以使用COM BSTR。我会让C++返回一个BSTR,并在托管端使用MarshalAs(UnmanagedType.BStr)。然后,框架会为您处理所有的释放和编组。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16751626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档