2012-02-07 34 views
14

Tôi mới sử dụng C# (từ nền C++ gốc) và tôi đang cố viết một giao diện người dùng nhỏ để in các cửa sổ phát tin nhắn trong số những thứ khác. Tôi đã ghi đè các vòng lặp thông điệp WndProc mặc định trong chương trình C# tôi như vậy:Làm cách nào để chuyển đổi loại IntPtr không được quản lý thành chuỗi 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); 
    } 

Những gì tôi muốn biết là làm thế nào để có được một chuỗi đại diện của đối tượng lParam đó là loại IntPtr. Về cơ bản nó là một khoảng trống * trong đất C++, tôi có thể bỏ nó vào trong C# bằng cách nào đó không? Có lẽ làm như vậy vốn đã không an toàn.

Trả lời

22

Marshal.PtrToStringAuto Method (IntPtr)

Phân bổ một quản lý String và bản sao tất cả các nhân vật đến các ký tự null đầu tiên từ một chuỗi được lưu trữ trong bộ nhớ không được quản lý vào nó.

+3

Kiểm tra IntPtr.Zero trước. Thông tin không chính xác đáng giá. –

+0

Hoạt động tốt, cảm ơn rất nhiều. – Benj

6

Câu trả lời ở trên là tuyệt vời và nó gần như giải quyết cùng một vấn đề đối với tôi nhưng ... Tôi nhận được những gì trông giống như chữ Hán lại từ phương pháp này (潆 湵 ⁤ 瑡 氠 慥 瑳 漠 敮 爠 灥 慥 整 ⁤浩 条 ⁥ 慮 敭 ›䌢 ⸢). Những gì tôi phải làm là sử dụng phương thức Marshal.PtrToStringAnsi (IntPtr) như được mô tả ở đây: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.ptrtostringansi.aspx và tại đây: http://answers.unity3d.com/questions/555441/unitys-simplest-plugin-print-does-not-work.html.

Khi tôi thực hiện thay đổi, Chuỗi của tôi đã bằng tiếng Anh một lần nữa. Không chắc tại sao điều đó lại xảy ra, nhưng có rồi!

+6

[Từ MSDN] (http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "* Nếu nền tảng hiện tại là Unicode, mỗi ký tự ANSI được mở rộng thành ký tự Unicode và phương thức này gọi PtrToStringUni Nếu không, phương thức này gọi PtrToStringAnsi. * "Hệ thống của bạn là một hệ thống Unicode nhưng mã không được quản lý của bạn đã trả về một chuỗi Ansi để hệ thống Tự động chọn mã hóa chuỗi sai. –

+0

@ScottChamberlain, Cảm ơn –

+0

Tôi cũng muốn cảm ơn Ilia, nhưng tôi không thể Tag anh ấy vì lý do nào đó. –

Các vấn đề liên quan