Domanda

L'obiettivo è quello di evitare di copiare i dati di stringa, quando ho bisogno di un const wchar_t*.

La risposta sembra essere sì, ma la funzione PtrToStringChars non ha la propria voce di MSDN (è citato solo in KB e blog come un trucco). Che mi ha fatto sospettoso e voglio verificare con voi ragazzi. E 'sicuro da usare quella funzione?

È stato utile?

Soluzione

Sì, nessun problema. In realtà è un po ' documentato ma difficile da trova. La documentazione MSDN per le librerie del C ++ non sono grandi. Esso restituisce un puntatore interno, che non è adatto per la conversione ad un const wchar_t * ancora. Devi perno del puntatore in modo che il garbage collector non può spostare la stringa. Usa pin_ptr <> di farlo.

È possibile utilizzare il maresciallo :: StringToHGlobalUni () per creare una copia della stringa. Utilizzare che invece se la wchar_t * deve rimanere valido per un periodo di tempo prolungato. Pinning oggetti troppo tempo non è molto salutare per il garbage collector.

Altri suggerimenti

Questa è una soluzione completa basata su PtrToStringChars che accede la struttura interna delle stringhe gestiti e quindi copia i contenuti utilizzando funzioni standard C:

wchar_t *ManagedStringToUnicodeString(String ^s)
{
    // Declare
    wchar_t *ReturnString = nullptr;
    long len = s->Length;

    // Check length
    if(len == 0) return nullptr;

    // Pin the string
    pin_ptr<const wchar_t> PinnedString = PtrToStringChars(s);

    // Copy to new string
    ReturnString = (wchar_t *)malloc((len+1)*sizeof(wchar_t));
    if(ReturnString)
    {
        wcsncpy(ReturnString, (wchar_t *)PinnedString, len+1);
    }

    // Unpin
    PinnedString = nullptr;

    // Return
    return ReturnString;
}

In base a questo articolo: http://support.microsoft.com/kb/311259 PtrToStringChars è ufficialmente supportato e possono essere usati. E 'descritto come "ottenere un puntatore gc interno al primo carattere contenuto in un oggetto System :: String" in vcclr.h.

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