Выделение неуправляемого массива строк из PInvoked OpenFileDialog (GetOpenFileName)
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;
}
1 ответ
Решение
То, что вы делаете, выглядит довольно хорошо - единственное изменение, которое я бы сделал, это использование Encoding.Unicode.GetByteCount(name)
вместо name.Length * 2
(просто более очевидно, что происходит).
Кроме того, вы можете использовать Marshal.PtrToStringUni(ptr)
если вы уверены, что ваши неуправляемые данные являются Unicode, так как это устраняет любую двусмысленность в отношении вашей строковой кодировки.