Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I convert an unmanaged IntPtr type to a c# string?

Tags:

I'm new to C# (from a native C++ background) and I'm trying to write a little UI to print windows broadcast messages among other things. I've overridden the default WndProc message loop in my C# program like so:

[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);
    }

What I'd like to know, is how to obtain a string representation of the lParam object which is of type IntPtr. It's essentially a void* in C++ land, can I cast it inside C# somehow? Presumably doing so is inherently unsafe.

like image 572
Benj Avatar asked Feb 07 '12 11:02

Benj


2 Answers

Marshal.PtrToStringAuto Method (IntPtr)

Allocates a managed String and copies all characters up to the first null character from a string stored in unmanaged memory into it.

like image 105
GSerg Avatar answered Oct 12 '22 01:10

GSerg


The above answer was great and it nearly solved the same issue for me but... I got what looks like Chinese characters back from the method (潆湵⁤瑡氠慥瑳漠敮爠灥慥整⁤浩条⁥慮敭›䌢⸢). What I had to do was use the Marshal.PtrToStringAnsi(IntPtr) method as described here: 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.

Once I made the change, my String was in English once more. Not sure why that was happening, but there ya go!

like image 33
justian17 Avatar answered Oct 12 '22 02:10

justian17