2012-02-07 14 views
14

Soy nuevo en C# (de un fondo C++ nativo) y estoy tratando de escribir una pequeña interfaz de usuario para imprimir mensajes de difusión de Windows entre otras cosas. He anulado el bucle de mensajes WndProc por defecto en mi programa en C#, así:¿Cómo puedo convertir un tipo IntPtr no administrado en una cadena 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); 
    } 

Lo que me gustaría saber, es cómo obtener una representación de cadena del objeto IParam que es de tipo IntPtr. Es esencialmente un vacío * en C++, ¿puedo lanzarlo dentro de C# de alguna manera? Presumiblemente hacerlo es inherentemente inseguro.

Respuesta

22

Marshal.PtrToStringAuto Method (IntPtr)

asigna un String administrados y copia todos los caracteres hasta el primer carácter nulo de una cadena almacenada en la memoria no administrada en ella.

+3

Prueba para IntPtr.Zero primero. La información no es exactamente lo vale. –

+0

Funciona muy bien, muchas gracias. – Benj

6

La respuesta anterior era grande y casi resuelto el mismo problema para mí, pero ... Tengo lo ve como caracteres chinos hacia atrás a partir del método (潆 湵 ⁤ 瑡 氠 慥 瑳 漠 敮 爠 灥 慥 整 ⁤浩 ⁥ 慮 䌢 䌢> 䌢 ⸢). Lo que tenía que hacer era utilizar el método Marshal.PtrToStringAnsi (IntPtr) como se describe aquí: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx y aquí: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html.

Una vez que hice el cambio, mi cadena estaba en inglés una vez más. No estoy seguro de por qué estaba sucediendo eso, pero ya está!

+6

[Desde MSDN] (http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "* Si la plataforma actual es Unicode, cada carácter ANSI se amplía a un carácter Unicode y este método llama a PtrToStringUni De lo contrario, este método llama a PtrToStringAnsi. * "Su sistema es un sistema Unicode pero su código no administrado estaba devolviendo una cadena Ansi para que el sistema Automático escogiera la codificación de cadena incorrecta. –

+0

@ScottChamberlain, Gracias –

+0

Quiero agradecer a Ilia también, pero no puedo etiquetarlo por alguna razón. –

Cuestiones relacionadas