Как преобразовать неуправляемый тип 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.
Как только я внес изменения, моя строка снова была на английском языке. Не уверен, почему это произошло, но вот так!