Сортировка неуправляемого массива строк из вызываемого OpenFileDialog (GetOpenFileName)

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

Вопрос

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) если вы уверены, что ваши неуправляемые данные являются юникодными, так как это устраняет любую двусмысленность в вашей строковой кодировке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top