2009-07-08 20 views
7

Estoy desarrollando una aplicación en C++/CLI y tengo una biblioteca de escritura de archivos csv en código no administrado que quiero usar desde la parte administrada. Así que mi función es como la siguiente:¿Cómo convierto un System :: String^a const char *?

bool CSVWriter::Write(const char* stringToWrite); 

... pero estoy realmente luchando para convertir mi sistema brillante :: string^en algo compatible. Básicamente yo estaba esperando para llamar haciendo algo como:

if(m_myWriter->Write(String::Format("{0}",someValueIWantToSave))) 
{ 
    // report success 
} 
+0

posible duplicado de [cómo convertir System :: String en const char \ *?] (Http://stackoverflow.com/questions/29335426/how-to-convert-systemstring-to-constchar) –

Respuesta

13
using namespace System::Runtime::InteropServices; 
const char* str = (const char*) (Marshal::StringToHGlobalAnsi(managedString)).ToPointer(); 

De Dev Shed.

+0

+ 1/Aceptado: ¡Muchas gracias! –

+14

Missing Marshal :: FreeHGlobal (...); que puede provocar una pérdida de memoria. –

+4

@Cedrik, luego publique una mejor versión de mi código. – mcandre

11

Como mcandre menciona, es correcto. Pero no olvide liberar el recurso recientemente asignado con Marshal::FreeHGlobal(), cuando la cadena ya no esté en uso.

Como alternativa, puede usar la plantilla msclr::interop::marshal_as para crear el recurso de cadena y liberarlo automáticamente cuando la llamada sale del alcance del recurso.