2012-02-07 9 views
14

मैं सी # (मूल सी ++ पृष्ठभूमि से) के लिए नया हूं और मैं अन्य चीजों के बीच विंडोज प्रसारण संदेशों को मुद्रित करने के लिए एक छोटा यूआई लिखने की कोशिश कर रहा हूं। मैं तो जैसे मेरी सी # कार्यक्रम में डिफ़ॉल्ट 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); 
    } 

मुझे पता है कि क्या करना चाहते हैं, lParam ऑब्जेक्ट प्रकार IntPtr की है, जिनमें से एक स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए कैसे है। यह अनिवार्य रूप से एक शून्य * सी ++ भूमि में है, क्या मैं इसे किसी भी तरह सी # में डाल सकता हूं? संभवतः ऐसा करना स्वाभाविक रूप से असुरक्षित है।

उत्तर

22

Marshal.PtrToStringAuto Method (IntPtr)

एक स्ट्रिंग में अप्रबंधित स्मृति में संग्रहीत से पहले नल केरेक्टर अप करने के लिए एक प्रबंधित String और प्रतियां सभी पात्रों का आवंटन।

+3

पहले IntPtr.Zero के लिए परीक्षण। जानकारी बिल्कुल इसके लायक नहीं है। –

+0

बहुत अच्छा काम करता है, बहुत बहुत धन्यवाद। – Benj

6

ऊपर जवाब महान था और यह लगभग मेरे लिए एक ही समस्या हल हो जाती है, लेकिन ... मुझे मिल गया क्या विधि से वापस चीनी अक्षरों की तरह दिखता है (潆 湵 ⁤ 瑡 氠 慥 瑳 漠 敮 爠 灥 慥 整 ⁤浩 条 ⁥ 慮 敭> 䌢 ⸢)। मुझे क्या करना था, यहां वर्णित मार्शल.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

एक बार जब मैंने परिवर्तन किया, तो मेरी स्ट्रिंग एक बार अंग्रेजी में थी। यकीन नहीं है कि यह क्यों हो रहा था, लेकिन वहाँ जाओ!

+6

[एमएसडीएन से] (http://msdn.microsoft.com/en-us/library/ewyktcaa.aspx) "* यदि वर्तमान प्लेटफॉर्म यूनिकोड है, तो प्रत्येक एएनएसआई चरित्र यूनिकोड चरित्र तक बढ़ाया जाता है और यह विधि PtrToStringUni को कॉल करती है अन्यथा, यह विधि PtrToStringAnsi को कॉल करती है। * "आपका सिस्टम एक यूनिकोड सिस्टम है लेकिन आपका अप्रबंधित कोड Ansi स्ट्रिंग लौटा रहा था ताकि ऑटो सिस्टम गलत स्ट्रिंग एन्कोडिंग का चयन कर रहा हो। –

+0

@ स्कॉटकैम्बरलेन, धन्यवाद –

+0

मैं इलिया को भी धन्यवाद देना चाहता हूं, लेकिन मैं उसे किसी कारण से टैग नहीं कर सकता। –