Как преобразовать неуправляемый тип IntPtr в строку c#?

Я новичок в C# (из собственного фона C++), и я пытаюсь написать немного пользовательского интерфейса для печати широковещательных сообщений windows, среди прочего. Я переопределил цикл сообщений WndProc по умолчанию в моей программе 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++ land, могу ли я как-то бросить его внутри C#? По-видимому, это по своей сути небезопасно.

2 ответов


Marshal.PtrToStringAuto Метод (IntPtr)

выделяет управляемый String и копирует все символы до первого нулевого символа из строки, хранящейся в неуправляемой памяти в него.


приведенный выше ответ был отличным, и он почти решил ту же проблему для меня, но... Я получил то, что выглядит как китайские иероглифы из метода (潆湵瑡氠慥瑳漠敮爠灥慥整浩条慮敭"䌢). Мне нужно было использовать Маршала.Метод 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.

Как только я внес изменения, моя строка снова была на английском языке. Не уверен, почему это произошло, но вот так!