2012-02-07 17 views
14

Jestem nowy w C# (z natywnego tła C++) i staram się napisać trochę interfejsu użytkownika, aby drukować wiadomości sieciowe między innymi. Mam nadpisane na wiadomość pętlę domyślny WndProc w moim programie C# tak:Jak mogę przekonwertować niezarządzanego typu IntPtr na ciąg 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); 
    } 

Co chciałbym wiedzieć, jest to, jak uzyskać ciąg znaków reprezentujący obiekt lParam który jest typu IntPtr. Zasadniczo jest to pustka * w krainie C++, czy mogę jakoś ją rzucić w C#? Prawdopodobnie zrobienie tego jest z natury niebezpieczne.

Odpowiedz

22

Marshal.PtrToStringAuto Method (IntPtr)

alokuje zarządzanych String i kopie wszystkich znaków aż do pierwszego znaku null z ciągiem przechowywane w pamięci niekontrolowana do niego.

+3

Najpierw przetestuj IntPtr.Zero. Informacje nie są tego warte. –

+0

Działa świetnie, dziękuję za dużo. – Benj

6

Powyższa odpowiedź była super i to prawie rozwiązać ten sam problem dla mnie, ale ... mam co wygląda chińskich znaków z powrotem od metody (潆 湵 ⁤ 瑡 氠 慥 瑳 漠 敮 爠 灥 慥 整 ⁤浩 条 ⁥ 慮 敭> 䌢 ⸢). Co musiałem zrobić, to użyć metody Marshal.PtrToStringAnsi (IntPtr), jak opisano tutaj: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx i tutaj: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html.

Po wprowadzeniu zmiany mój String był ponownie w języku angielskim. Nie wiem, dlaczego tak się dzieje, ale proszę!

+6

[z MSDN] (http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "* Jeśli bieżąca platforma to kod Unicode, każdy znak ANSI jest rozszerzony na znak Unicode i ta metoda wywołuje PtrToStringUni W przeciwnym razie ta metoda wywoła PtrToStringAnsi. * "Twój system jest systemem Unicode, ale twój niezarządzany kod zwrócił ciąg Ansi, więc system Auto wybrał złe kodowanie ciągów znaków. –

+0

@ScottChamberlain, Dzięki –

+0

Chcę również podziękować Ilii, ale nie mogę go Tagować z jakiegoś powodu. –