如何将非托管IntPtr类型转换为ac#string?

Ben*_*enj 18 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

GSe*_*erg 24

Marshal.PtrToStringAuto 方法(IntPtr)

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

  • 首先测试IntPtr.Zero.信息并不完全值得. (3认同)

Ili*_*kov 7

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

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

  • [来自MSDN](http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx)"*如果当前平台是Unicode,则每个ANSI字符都扩展为Unicode字符,此方法调用PtrToStringUni.否则,此方法调用PtrToStringAnsi.*"您的系统是Unicode系统,但您的非托管代码返回Ansi字符串,因此Auto系统选择了错误的字符串编码. (6认同)