Question

OpenFileDialog renvoie un pointeur vers la mémoire contenant une séquence de chaînes à zéro terminal, suivie par null finale pour indiquer la fin du tableau.

Voici comment je reçois des chaînes C # retour du pointeur non géré, mais je suis sûr qu'il doit y avoir une façon plus sûre, plus élégante.

            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;
            }
Était-ce utile?

La solution

Qu'est-ce que vous faites semble assez bon -. Le seul changement que je ferais serait d'utiliser au lieu de Encoding.Unicode.GetByteCount(name) name.Length * 2 (il est juste plus évident ce qui se passe)

En outre, vous pouvez utiliser si vous êtes Marshal.PtrToStringUni(ptr) positif que vos données non géré est Unicode, car il supprime toute ambiguïté sur l'encodage de votre chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top