Marshalling una una matriz no administrado de cadenas de un PInvoked OpenFileDialog (GetOpenFileName)

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

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

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top