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

本文关键字:类型转换 字符串 IntPtr | 更新日期: 2023-09-27 18:23:42

我是C#的新手(来自原生C++背景),我正在尝试编写一个小UI来打印窗口广播消息等。我在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);
    }

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

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

Marshal.PtrToStringAuto方法(IntPtr)

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

上面的答案很好,几乎解决了我的同样问题,但。。。我从这个方法中得到了看起来像汉字的东西(潆湵⁤瑡氠慥瑳漠敮爠灥慥整⁤浩条⁥慮敭›䌢⸢).我要做的是使用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.

一旦我做出了改变,我的字符串又变成了英语。不知道为什么会发生这种事,但你来了!