2015-03-29 3 views
0

Как преобразовать 'String ^' в 'const char *'?как конвертировать System :: String в const char *?

 String^ cr = ("netsh wlan set hostednetwork mode=allow ssid=" + this->txtSSID->Text + " key=" + this->txtPASS->Text); 
system(cr); 

Ошибка:

1 IntelliSense: argument of type "System::String ^" is incompatible with parameter of type "const char *" 
+0

Скопируйте/вставьте заголовок своего вопроса в поле поиска Google. Много и много хитов. –

+1

Хорошо, у этого есть хороший ответ, используя его как цель обмана для многих других. –

ответ

4

Вы можете сделать это, используя msclr::interop::marshal_context класс:

#include <msclr/marshal.h> 

Тогда:

String^ something = "something"; 

msclr::interop::marshal_context ctx; 
const char* converted = ctx.marshal_as<const char*>(something); 

system(converted); 

Буфер для converted освобождается, если ctx выходит за рамки.

Но в вашем случае, это было бы намного проще просто вызвать эквивалент управляемого API:

System::Diagnostics::Process::Start("netsh", "the args"); 
0

4 Методы на https://support.microsoft.com/en-us/help/311259/how-to-convert-from-system-string-to-char-in-visual-c не работал для меня в VS2015. Вместо этого я воспользовался этим советом: https://msdn.microsoft.com/en-us/library/d1ae6tz5.aspx и просто поместил его в функцию для удобства. Я отклонился от предлагаемого решения, где он выделяет новую память для char * - Я предпочитаю оставлять это для вызывающего, хотя этот создает дополнительный риск.

#include <vcclr.h> 

using namespace System; 

void Str2CharPtr(String ^str, char* chrPtr) 
{ 
    // Pin memory so GC can't move it while native function is called 
    pin_ptr<const wchar_t> wchPtr = PtrToStringChars(str); 

    // Convert wchar_t* to char* 
    size_t convertedChars = 0; 
    size_t sizeInBytes = ((str->Length + 1) * 2); 

    wcstombs_s(&convertedChars, chrPtr, sizeInBytes, wchPtr, sizeInBytes); 
} 
Смежные вопросы