从 System.String 转换为 PCTSTR

发布于 2024-11-28 22:43:42 字数 226 浏览 1 评论 0原文

我必须从 System.String (C#) 转换为 PCTSTR,其类型为 _nulltermerated const char*

到目前为止,我找不到任何可以准确告诉我如何执行此操作的内容。

有很多从 System::String (C++/CLI) 转换的示例,但我在 System.String (C#) 上找不到任何内容,

我正在 Visual Studio 2005 中工作。

I'm having to convert from System.String (C#) into a PCTSTR which would be typed as _nullterminated const char*

So far I can't find anything that can tell me exactly how to do this.

Plenty of examples to convert from System::String (C++/CLI), but I can't find anything on System.String (C#)

I'm working in Visual Studio 2005.

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

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

发布评论

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

评论(3

终难愈 2024-12-05 22:43:42

PCTSTRconst char* 的类型定义时,请使用 Marshal.StringToHGlobalAnsi

PCTSTRconst wchar_t* 的类型定义时,请使用 Marshal.StringToHGlobalUni

在这两种情况下,请调用 Marshal.FreeHGlobal 使用完毕后释放内存;尽管您使用 C#,但相关内存分配是不受管理的,因此不符合垃圾回收条件,并且如果您不正确清理它将会泄漏。

When PCTSTR is a typedef for const char*, use Marshal.StringToHGlobalAnsi.

When PCTSTR is a typedef for const wchar_t*, use Marshal.StringToHGlobalUni.

In both cases, call Marshal.FreeHGlobal to free the memory when you're done with it; despite your using C#, the memory allocation in question is unmanaged, so consequently is not eligible for garbage collection and will leak if you don't clean it up properly.

心奴独伤 2024-12-05 22:43:42

您应该使用 Marshal 静态类

var str = "Hello world" 
var marshalledStr = Marshal.StringToHGlobalUni(str).ToPointer()

请参阅有关编组的完整参考 http: //msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx

You should use Marshal static class

var str = "Hello world" 
var marshalledStr = Marshal.StringToHGlobalUni(str).ToPointer()

See complete reference on marshalling http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.aspx

断桥再见 2024-12-05 22:43:42

如果您想在 PInvoke 调用中使用它,只需将参数声明为 string,并使用 MarshalAs(UnmanagementType.LPStr)

[DllImport("somelib.dll")]
static extern void function([MarshalAs(UnmanagedType.LPStr)] string s);

If you want to use it in a PInvoke call, you can just declare the parameter as string, and use MarshalAs(UnmanagedType.LPStr):

[DllImport("somelib.dll")]
static extern void function([MarshalAs(UnmanagedType.LPStr)] string s);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文