[英]How to convert C++/CLI string to const char*
我有一個C ++ / CLI DLL,我計划用作C#DLL和本機C ++客戶端之間的適配器。 我需要在兩個方向傳遞字符串。 適配器使用VS2013編譯,但需要支持使用VS2008構建的客戶端,因此我在API中使用const char *。 但是,即使兩者都是VS2013構建的,我所擁有的也無法工作。
在其他地方,我找到了使用msclr \\ marshal.h的建議,所以我創建了:
using namespace msclr::interop;
System::String^ ToCliString(const char* s)
{
System::String ^result = marshal_as<System::String^>(s);
return result;
}
const char* ToCppString(System::String^ s)
{
msclr::interop::marshal_context context;
const char* result = context.marshal_as<const char*>(s);
return result;
}
為了測試這些,我在C ++ / CLI DLL中創建了一個往返轉換方法:
const char* Foo(const char *cstar)
{
System::String^ cli = ::ToCliString(cstar);
if (cli == "abc")
{
MessageBox::Show("const char* -> CLI: OK");
}
const char* cstar2 = ::ToCppString(cli);
if (std::strcmp(cstar2, "abc") == 0)
{
MessageBox::Show("CLI -> const char*: OK");
}
else if (std::strcmp(cstar2, "") == 0)
{
MessageBox::Show("ToCppString returned empty string");
}
else
{
MessageBox::Show("ToCppString returned something else");
}
return cstar2;
}
當本機C ++客戶端調用Foo(“abc”)時,將顯示第一條消息,顯示“返回的其他內容”消息,並且客戶端收到垃圾郵件(îþîþîþîþîþîþîþîþþþþþþþþþþþþþþþþ>>vÚ§)。 所以看起來我的第二次轉換不起作用。
UPDATE
這是我使用的最終解決方案。
我使用zneaks的建議來編組std :: string和PaulMcKenzie的建議來傳遞調用者分配的char *而不是返回const char *。 謝謝你們倆。
void ToCppString(System::String^ input, char* output)
{
std::string temp= marshal_as<std::string>(input);
strcpy(output, temp.c_str());
}
void Foo(const char* input, char* output)
{
System::String^ cli = ::ToCliString(input);
::ToCppString(cli, output);
}
問題是marshal_context
擁有你得到的char指針,所以當你的函數返回時它會被釋放 :
此示例為從System :: String到const char *變量類型的編組創建了一個上下文。轉換后的數據在刪除上下文的行之后無效。
請考慮使用marshal_as<std::string>
,因為允許該字符串比marshal_context
。
另外,請注意VC ++ 2008 express不包含編組頭文件(marshal.h和其他),因此您必須使用VC ++ 2008 pro或以上版本。 從VS2010開始,看起來這些頭文件包含在快遞版中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.