2012-02-07 4 views
14

Sono nuovo di C# (da uno sfondo C++ nativo) e sto cercando di scrivere una piccola interfaccia utente per stampare messaggi di broadcast di Windows tra le altre cose. Ho sovrascritto il ciclo di messaggi di default WndProc nel mio programma C# in questo modo:Come posso convertire un tipo IntPtr non gestito in una stringa 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); 
    } 

Quello che mi piacerebbe sapere, è come ottenere una rappresentazione stringa dell'oggetto lParam che è di tipo IntPtr. È essenzialmente un vuoto * in C++ land, posso lanciarlo in C# in qualche modo? Presumibilmente farlo è intrinsecamente insicuro.

risposta

22

Marshal.PtrToStringAuto Method (IntPtr)

assegna un gestite String e copia tutti i caratteri fino al primo carattere null da una stringa memorizzata nella memoria non gestita in esso.

+3

Prima prova per IntPtr.Zero. Le informazioni non valgono esattamente la pena. –

+0

Funziona alla grande, grazie mille. – Benj

6

La risposta di cui sopra è ottimo ed è quasi risolto lo stesso problema per me, ma ... ho ottenuto quello che appare come caratteri cinesi indietro dal metodo (潆 湵 ⁤ 瑡 氠 慥 瑳 漠 敮 爠 灥 慥 整 ⁤浩 条 ⁥ 慮 敭> 䌢 ⸢). Quello che dovevo fare era usare il metodo Marshal.PtrToStringAnsi (IntPtr) come descritto qui: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx e qui: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html.

Una volta apportata la modifica, la mia stringa era di nuovo in inglese. Non sono sicuro del perché stia succedendo, ma ci sei!

+6

[Da MSDN] (http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "* Se la piattaforma corrente è Unicode, ogni carattere ANSI viene allargato a un carattere Unicode e questo metodo chiama PtrToStringUni In caso contrario, questo metodo chiama PtrToStringAnsi. * "Il sistema è un sistema Unicode ma il codice non gestito restituiva una stringa Ansi, pertanto il sistema Auto stava scegliendo la codifica stringa errata. –

+0

@ScottChamberlain, Grazie –

+0

Voglio ringraziare anche Ilia, ma non posso etichettarlo per qualche motivo. –