将 StringBuilder 传递给 PInvoke 函数

发布于 2024-09-08 19:14:34 字数 582 浏览 6 评论 0原文

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

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

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 到 string 。(但这是公认的答案)

我们是否应该使用如下所示的 use IntPtr ?

extern "C" REGISTRATION_API void calculate(Intptr msg) 

In one of the post Titled "Call a c++ method that returns a string, from c#"

Its said that , to make the following Pinvoke to work change the C++ signature to as

extern "C" REGISTRATION_API void calculate(LPSTR msg) 

C++ code

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

C# code

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

How can stringBuilder which is a class ,convertd to long ptr to string .(but this is the accepted answer)

Shouldnt we use use IntPtr as below ?

extern "C" REGISTRATION_API void calculate(Intptr msg) 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

能否归途做我良人 2024-09-15 19:14:34

查找标记为“传递字符串”的部分,封送拆收器具有一些额外的智能来执行此操作。
http:// msdn.microsoft.com/en-us/library/aa446536.aspx

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

Look for the section marked "Passing Strings", the marshaler has got some added smarts to do this trick.
http://msdn.microsoft.com/en-us/library/aa446536.aspx

To solve this problem (since many of
the Win32 APIs expect string buffers)
in the full .NET Framework, you can,
instead, pass a
System.Text.StringBuilder object; a
pointer will be passed by the
marshaler into the unmanaged function
that can be manipulated. The only
caveat is that the StringBuilder must
be allocated enough space for the
return value, or the text will
overflow, causing an exception to be
thrown by P/Invoke.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文