如何将System :: String转换为const char *?

时间:2015-03-29 22:02:43

标签: c++-cli

如何转换' String ^' to' 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 *"

2 个答案:

答案 0 :(得分:7)

您可以使用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");

答案 1 :(得分:0)

https://support.microsoft.com/en-us/help/311259/how-to-convert-from-system-string-to-char-in-visual-c上的4种方法 在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);
}