如何将非托管IntPtr类型转换为c#字符串?

时间:2012-02-07 11:59:05

标签: c# unmanaged

我是C#的新手(来自本机C ++背景),我正在尝试编写一个小UI来打印Windows广播消息等。我已经在我的C#程序中重写了默认的WndProc消息循环,如下所示:

[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);
    }

我想知道的是,如何获取intPatr类型的lParam对象的字符串表示。它本质上是C ++领域的一个空白*,我能以某种方式将它转换为C#吗?据推测,这样做本质上是不安全的。

2 个答案:

答案 0 :(得分:24)

Marshal.PtrToStringAuto Method (IntPtr)

  

分配一个托管String,并将存储在非托管内存中的字符串中的所有字符复制到第一个空字符中。

答案 1 :(得分:6)

上面的答案很棒,几乎解决了同样的问题,但是...我从方法中得到了看起来像汉字的东西(潆湵⁤氠慥瑳敮敮敮慥慥⁤⁤条条条虑敭>䌢⸢)。我必须做的是使用Marshal.PtrToStringAnsi(IntPtr)方法,如下所述: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx 和这里: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html

一旦我做了更改,我的String再次使用英语。不知道为什么会这样,但是你去了!