2012-02-07 71 views
14

我是新来的C#(从本机C + +背景),我试图写一个小UI来打印窗口广播消息等等。我已经覆盖默认的WndProc消息循环在我的C#程序像这样:如何将非托管IntPtr类型转换为c#字符串?

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     // Listen for operating system broadcasts. 
     switch (m.Msg) 
     { 
      case WM_SETTINGCHANGE: 

       this.richTextLog.Text += "WM_SETTINGCHANGE - lParam=" + m.LParam.ToString() + "\n"; 

       break; 
     } 
     base.WndProc(ref m); 
    } 

我想知道什么,是如何获取lParam的对象,它是类型的IntPtr的字符串表示。它本质上是C++土地上的一个void *,我可以以某种方式将它投射到C#中吗?据推测,这样做本质上是不安全的。

回答

22

Marshal.PtrToStringAuto Method (IntPtr)

分配一个管理String,并将所有字符,直到从存储在非托管内存为一个字符串的第一个空字符。

+3

首先测试IntPtr.Zero。信息并不完全值得。 – 2012-02-07 12:37:41

+0

很好,非常感谢。 – Benj 2012-02-07 13:09:45

6

以上的答案是伟大的,它几乎解决了同样的问题,但对我来说...我得到什么样子中国文字从后面的方法(潆湵⁤瑡氠慥瑳漠敮爠灥慥整⁤浩条⁥虑敭>䌢⸢)。我所要做的就是使用这里描述的Marshal.PtrToStringAnsi(IntPtr)方法: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx and here: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html

一旦我做了改变,我的字符串再次用英语。不知道为什么会发生这种情况,但是你去了!

+6

[来自MSDN](http://msdn.microsoft.com/zh-cn/library/ewyktcaa.aspx)“*如果当前平台是Unicode,则每个ANSI字符都会扩展为Unicode字符,并且此方法会调用PtrToStringUni 。否则,这个方法调用PtrToStringAnsi。*“你的系统是一个Unicode系统,但你的非托管代码返回一个Ansi字符串,所以Auto系统选择错误的字符串编码。 – 2014-01-14 15:40:01

+0

@ScottChamberlain,谢谢 – 2016-09-29 15:37:43

+0

我也要感谢Ilia,但是我不能标记他出于某种原因。 – 2016-09-29 15:39:42

相关问题