2012-02-07 126 views
14

我是新來的C#(從本機C + +背景),我試圖寫一個小UI來打印窗口廣播消息等等。我已經覆蓋默認的WndProc消息循環在我的C#程序像這樣:如何將非託管IntPtr類型轉換爲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++土地上的一個void *,我可以以某種方式將它投射到C#中嗎?據推測,這樣做本質上是不安全的。

回答

22

Marshal.PtrToStringAuto Method (IntPtr)

分配一個管理String,並將所有字符,直到從存儲在非託管內存爲一個字符串的第一個空字符。

+3

首先測試IntPtr.Zero。信息並不完全值得。 – 2012-02-07 12:37:41

+0

很好,非常感謝。 – Benj 2012-02-07 13:09:45

6

以上的答案是偉大的,它幾乎解決了同樣的問題,但對我來說...我得到什麼樣子中國文字從後面的方法(瀠湵⁤瑡氠慥瑳漠敮爠灥慥整⁤浩條⁥慮敭>䌢⸢)。我所要做的就是使用這裏描述的Marshal.PtrToStringAnsi(IntPtr)方法: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx and here: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html

一旦我做了改變,我的字符串再次用英語。不知道爲什麼會發生這種情況,但是你去了!

+6

[來自MSDN](http://msdn.microsoft.com/zh-cn/library/ewyktcaa.aspx)「*如果當前平臺是Unicode,則每個ANSI字符都會擴展爲Unicode字符,並且此方法會調用PtrToStringUni 。否則,這個方法調用PtrToStringAnsi。*「你的系統是一個Unicode系統,但你的非託管代碼返回一個Ansi字符串,所以Auto系統選擇錯誤的字符串編碼。 – 2014-01-14 15:40:01

+0

@ScottChamberlain,謝謝 – 2016-09-29 15:37:43

+0

我也要感謝Ilia,但是我不能標記他出於某種原因。 – 2016-09-29 15:39:42

相關問題