E 'possibile ottenere un puntatore alla stringa ^' s array interno in C ++ / CLI?
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?
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.