web-dev-qa-db-ja.com

アンマネージIntPtr型をc#文字列に変換するにはどうすればよいですか?

私は(ネイティブC++のバックグラウンドから)C#を初めて使用し、Windowsブロードキャストメッセージを印刷するための小さなUIを作成しようとしています。次のように、C#プログラムでデフォルトのWndProcメッセージループをオーバーライドしました。

[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#内にキャストできますか?おそらくそうすることは本質的に危険です。

19
Benj

Marshal.PtrToStringAutoメソッド(IntPtr)

マネージドStringを割り当て、アンマネージドメモリに格納されている文字列から最初のヌル文字までのすべての文字をコピーします。

24
GSerg

上記の答えは素晴らしく、私にとって同じ問題をほぼ解決しましたが...方法から漢字のように見えるものを取得しました(潆湵⁤瑡氠゚ ー ト敮爠灥漠敮爠灥敮爠灥整整⁤浩条⁥θ⁥›䌢⸢)。私がしなければならなかったことは、ここで説明されているように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

変更を加えると、文字列はもう一度英語になりました。なぜそれが起こったのかわかりませんが、そこに行きます!

7
Ilia Koulikov