Marshalling una una matriz no administrado de cadenas de un PInvoked OpenFileDialog (GetOpenFileName)
-
21-08-2019 - |
Pregunta
OpenFileDialog devuelve un puntero a la memoria que contiene una secuencia de cadenas terminadas en nulo, seguido por nulo final para indicar el final de la matriz.
Esta es la forma en que estoy recibiendo C # cuerdas detrás del puntero no administrado, pero estoy seguro de que debe haber una manera más segura, más 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;
}
Solución
Lo que está haciendo se ve muy bien -. El único cambio que haría sería utilizar Encoding.Unicode.GetByteCount(name)
en lugar de name.Length * 2
(es sólo más evidente lo que está pasando)
Además, es posible que desee utilizar Marshal.PtrToStringUni(ptr)
si está seguro de que sus datos no administrado es Unicode, ya que elimina cualquier ambigüedad acerca de su cadena de codificación.