حشد لمجموعة غير المدارة من سلاسل من PInvoked OpenFileDialog (GetOpenFileName)
-
21-08-2019 - |
سؤال
و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، كما أنه يزيل أي غموض حول ترميز سلسلة الخاص بك.
لا تنتمي إلى StackOverflow