حشد لمجموعة غير المدارة من سلاسل من PInvoked OpenFileDialog (GetOpenFileName)

StackOverflow https://stackoverflow.com/questions/667049

سؤال

وOpenFileDialog إرجاع مؤشر إلى الذاكرة التي تحتوي على سلسلة من سلاسل خالية منتهية، تليها لاغية النهائي للدلالة على نهاية مجموعة.

وهذه هي الطريقة التي كنت اتلقى C # السلاسل مرة أخرى من مؤشر غير المدارة، ولكن أنا متأكد من يجب أن يكون هناك طريقة أكثر أناقة وأكثر أمنا.

            IntPtr unmanagedPtr = // start of the array ...
            int offset = 0;
            while (true)
            {
                IntPtr ptr = new IntPtr( unmanagedPtr.ToInt32() + offset );
                string name = Marshal.PtrToStringAuto(ptr);
                if(string.IsNullOrEmpty(name))
                    break;

                // Hack!  (assumes 2 bytes per string character + terminal null)
                offset += name.Length * 2 + 2;
            }
هل كانت مفيدة؟

المحلول

وماذا كنت تفعل تبدو جيدة - التغيير الوحيد الذي أود أن جعل سيكون لاستخدام Encoding.Unicode.GetByteCount(name) بدلا من name.Length * 2 (انها مجرد أكثر وضوحا ما يحدث)

وبالإضافة إلى ذلك، قد ترغب في استخدام Marshal.PtrToStringUni(ptr) إذا كنت إيجابية أن البيانات غير المدارة الخاص بك هو Unicode، كما أنه يزيل أي غموض حول ترميز سلسلة الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top