Выделение неуправляемого массива строк из PInvoked OpenFileDialog (GetOpenFileName) - PullRequest
0 голосов
/ 20 марта 2009

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 Ответ

1 голос
/ 20 марта 2009

То, что вы делаете, выглядит довольно хорошо - единственное изменение, которое я бы сделал, - это использование Encoding.Unicode.GetByteCount(name) вместо name.Length * 2 (просто более очевидно, что происходит).

Кроме того, вы можете использовать Marshal.PtrToStringUni(ptr), если вы уверены, что ваши неуправляемые данные являются Unicode, поскольку это устраняет любую двусмысленность в отношении вашего строкового кодирования.

...