2009-07-08 4 views
7

Я разрабатываю приложение в C++/CLI и имею библиотеку записи файлов csv в неуправляемом коде, который я хочу использовать из управляемой части. Так что моя функция выглядит следующим образом:Как преобразовать систему :: String^в const char *?

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

... но я действительно изо всех сил, чтобы превратить свою блестящую систему :: String^в нечто совместимое. В основном я надеялся вызвать, делая что-то вроде:

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

Возможный дубликат [как преобразовать систему :: String в const char \ *?] (Http://stackoverflow.com/questions/29335426/how-to-convert-systemstring-to-const-char) –

ответ

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

От Dev Shed.

+0

+ 1/Принято: Большое спасибо! –

+14

Отсутствует маршал :: FreeHGlobal (...); что может привести к утечке памяти. –

+4

@Cedrik, а затем опубликовать лучшую версию моего кода. – mcandre

11

Как mcandre упоминает, Marshal::StringToHGlobalAnsi() является правильным. Но не забудьте освободить вновь выделенный ресурс с помощью Marshal::FreeHGlobal(), когда строка больше не используется.

В качестве альтернативы вы можете использовать шаблон msclr::interop::marshal_as, чтобы создать строковый ресурс и автоматически отпустить его, когда вызов выходит из области ресурсов.

Смежные вопросы