【问题标题】:Passing StringBuilder to PInvoke function将 StringBuilder 传递给 PInvoke 函数
【发布时间】:2010-07-08 11:22:17
【问题描述】:

在标题为“调用从 c# 中返回字符串的 c++ 方法”的帖子中

据说,要使以下 Pinvoke 工作,将 C++ 签名更改为 as

extern "C" REGISTRATION_API void calculate(LPSTR msg) 

C++ 代码

extern "C" REGISTRATION_API void calculate(char* msg) 

C#代码

[DllImport("thecpp.dll", CharSet=CharSet.Ansi)] 
static extern void calculate(StringBuilder sMsg); 

作为一个类的 stringBuilder 如何将 long ptr 转换为字符串。(但这是公认的答案)

我们是否应该像下面那样使用使用 IntPtr ?

extern "C" REGISTRATION_API void calculate(Intptr msg) 

【问题讨论】:

    标签: c# string marshalling


    【解决方案1】:

    查找标记为“传递字符串”的部分,marshaler 已经增加了一些技巧来完成这个技巧。
    http://msdn.microsoft.com/en-us/library/aa446536.aspx

    为了解决这个问题(因为很多 Win32 API 需要字符串缓冲区) 在完整的 .NET Framework 中,您可以, 相反,通过 System.Text.StringBuilder 对象;一种 指针将由 封送器进入非托管函数 可以操纵的。唯一的 需要注意的是 StringBuilder 必须 被分配足够的空间 返回值,否则文本将 溢出,导致异常 由 P/Invoke 抛出。

    【讨论】:

    • 该链接指向 .NET Compact 框架。它是否也适用于 .NET Framework,是否也有文档?
    • 我相信它确实如此 - 我编写了使用它的代码并且不能在 Compact 框架上运行。你试一试了吗?此页面的最后一部分也证实了这一点msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx
    • 我确实尝试过,但是(我后来发现)有一个特殊的函数,它分配内存并希望调用者释放它,FindMimeFromData。这似乎不适用于 StringBuilder,结果我只得到了垃圾。
    • @ygoe 是本地函数分配字符串吗?我调用的函数具有相应的 freeXXX 函数(释放分配的本机内存),必须调用这些函数进行清理。
    • 是的,但是文档说我必须调用一些通用的 FreeXXX 方法来释放内存,我能找到的所有示例也是如此。效果很好。
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多