Domanda

OpenFileDialog restituisce un puntatore alla memoria contenente una sequenza di stringhe null-terminate, seguita da nullo finale per indicare la fine della matrice.

Questo è come mi sto C # stringhe indietro dal puntatore non gestito, ma sono sicuro che ci deve essere un modo più sicuro più 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;
            }
È stato utile?

Soluzione

quello che stai facendo sembra piuttosto buono -. L'unico cambiamento che vorrei fare sarebbe quella di utilizzare Encoding.Unicode.GetByteCount(name) invece di name.Length * 2 (è solo più evidente quello che sta succedendo)

Inoltre, si potrebbe desiderare di utilizzare Marshal.PtrToStringUni(ptr) se si è certi che i vostri dati non gestito è Unicode, in quanto rimuove ogni ambiguità circa la codifica della stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top