Empacotamento de uma uma matriz não gerido das cadeias de um PInvoked OpenFileDialog (GetOpenFileName)
-
21-08-2019 - |
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;
}
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