Empacotamento de uma uma matriz não gerido das cadeias de um PInvoked OpenFileDialog (GetOpenFileName)

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

Pergunta

OpenFileDialog retorna um apontador para a memória que contém uma sequência de cadeias terminadas em nulos, seguido por null final para indicar o fim da matriz.

Isto é como eu estou ficando C # cordas de volta do ponteiro não gerenciado, mas eu tenho certeza que deve haver uma maneira mais segura, mais elegante.

            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;
            }
Foi útil?

Solução

O que você está fazendo parece muito bom -. A única mudança que eu faria seria usar Encoding.Unicode.GetByteCount(name) vez de name.Length * 2 (é apenas mais evidente o que está acontecendo)

Além disso, você pode querer usar Marshal.PtrToStringUni(ptr) se você é positivo que os seus dados não gerenciado é Unicode, uma vez que elimina qualquer ambiguidade sobre sua codificação string.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top