如何将未托管的IntPtr类型转换为C#字符串?

20

我是C++的开发者,现在学习C#,尝试编写一个小工具用于打印窗口广播消息等内容。我已经重载了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 ++中,它基本上是void *,我能否在C#中进行某种类型的转换? 做这样做可能是不安全的。

2个回答

31

3
首先测试IntPtr.Zero。这个信息并不是非常有价值。 - Hans Passant

8
上面的回答很好,几乎解决了我的同样问题,但是......从该方法返回的结果看起来像是中文字符(潆湵⁤瑡氠慥瑳漠敮爠灥慥整⁤浩条⁥慮敭›䌢⸢)。我需要做的是使用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
一旦我进行了更改,我的字符串再次变成了英文。不确定为什么会出现这种情况,但就是这样!

7
如果当前平台是Unicode,则每个ANSI字符将被扩展为Unicode字符,并且该方法将调用PtrToStringUni。否则,该方法将调用PtrToStringAnsi。您的系统是Unicode系统,但您的非托管代码返回了一个ANSI字符串,因此自动系统选择了错误的字符串编码。 - Scott Chamberlain
@ScottChamberlain,谢谢。 - AleX_
我也想感谢Ilia,但出于某些原因我无法标记他。 - AleX_
我使用PtrToStringAnsi和PtrToStringAuto都无法获得可读的字符 :( - Pedro77
@Pedro77 尝试在应用程序中间调用它(=不要作为第一个函数)。 给OGL一点时间来热身。 首先创建一个视口。 - Bitterblue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接