Сортировка неуправляемого массива строк из вызываемого OpenFileDialog (GetOpenFileName)
-
21-08-2019 - |
Вопрос
OpenFileDialog возвращает указатель на память, содержащий последовательность строк, заканчивающихся нулем, за которыми следует final null, чтобы указать конец массива.
Вот как я получаю строки 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)
если вы уверены, что ваши неуправляемые данные являются юникодными, так как это устраняет любую двусмысленность в вашей строковой кодировке.