Rangier eine eine nicht verwaltete Array von Zeichenfolgen von einer PInvoked Openfile (GetOpenFileName)

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

Frage

Openfile gibt einen Zeiger auf dem Speicher eine Folge von Null-terminierte Strings, gefolgt von den endgültigen null mit dem Ende des Feldes anzuzeigen.

Dies ist, wie ich Strings C # wieder aus dem nicht verwalteten Zeiger bekommen, aber ich bin sicher, es muss ein sicherer, eleganter Weg sein.

            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;
            }
War es hilfreich?

Lösung

Was Sie tun, sieht ziemlich gut -. Die einzige Änderung, die ich wäre zu verwenden Encoding.Unicode.GetByteCount(name) statt name.Length * 2 machen würde (es ist nur noch deutlicher, was los ist)

Auch möchten Sie vielleicht Marshal.PtrToStringUni(ptr) verwenden, wenn Sie sicher sind, dass Ihre nicht verwalteten Daten ist Unicode, da es jede Unklarheit über Ihre String-Codierung entfernt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top