2012-02-07 17 views
14

私はC#(ネイティブC++のバックグラウンドから)を初めて使いました.Windowsのブロードキャストメッセージを印刷するための小さなUIを作成しようとしています。私はそうのように私のC#プログラムでデフォルトのWndProcメッセージループを上書きしました:私が知りたいのですがどのようなアンマネージド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); 
    } 

は、タイプのIntPtrであるlParamにオブジェクトの文字列表現を取得する方法です。 C + +の土地では本質的にvoid *ですが、何とかC#の中にキャストできますか?恐らくそれは本質的に安全ではありません。

答えて

22

Marshal.PtrToStringAuto Method (IntPtr)

管理Stringそこにコピーしアンマネージメモリに格納されている文字列から最初のNULL文字までのすべての文字を割り当てます。私はメソッドから戻って漢字のように見えるものだ...

+3

最初にIntPtr.Zeroをテストします。情報は正確に価値があるわけではありません。 –

+0

ありがとう、ありがとう。 – Benj

6

上記の答えは素晴らしかったし、それはほとんど私のために同じ問題を解決しますが(潆湵⁤瑡氠慥瑳漠敮爠灥慥整⁤条⁥⁥敭敭敭敭敭䌢䌢䌢)私がしなければならなかったのは、ここで説明したMarshal.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です。

私が変更を加えたら、私のStringはもう一度英語になりました。なぜそれが起こっていたかわからないが、そこに行く!

+6

[MSDNから](http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "*現在のプラットフォームがUnicodeの場合、各ANSI文字はUnicode文字に拡大され、このメソッドはPtrToStringUni * "あなたのシステムはUnicodeシステムですが、あなたのアンマネージコードがAnsi文字列を返していたので、Autoシステムは間違った文字列エンコーディングを選択していました。 –

+0

@ScottChamberlain、ありがとうございました –

+0

私はIliaにも感謝したいと思いますが、何らかの理由でタグ付けできません。 –

関連する問題