是否有直接的方法在本地C ++方法的char *参数包装器中管理C ++ / CLI字符串?!
示例:
void Test::TestFunc(System::String ^%str)
{
// right conversion to char* and consider the reference
}
原生C ++函数:
void TestB::Func(char *str)
{
...
}
我的狡猾方式:
void Test::TestFunc(System::String ^%szRecvBuffer)
{
pin_ptr<const wchar_t> szRecvBufferP = PtrToStringChars(szRecvBuffer);
// Convert to a char*
size_t origsize = wcslen(szRecvBufferP) + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
char nstring[newsize];
wcstombs_s(&convertedChars, nstring, origsize, szRecvBufferP, _TRUNCATE);
strcat_s(nstring, " (char *)");
char *szRecvBufferCh = nstring;
m_object->TestCommand(szRecvBufferCh); // parameter char*
System::String ^tmp = gcnew System::String(szRecvBufferCh);
szRecvBuffer = tmp;
}
迎接leon22
答案 0 :(得分:2)
如果char*
是输出参数,则在C ++ / CLI中必须传递System::StringBuilder^
答案 1 :(得分:2)
您正在手动执行大量运行时将为您处理的事情。
void Test::TestFunc(String^% szRecvBuffer)
{
using System::Runtime::InteropServices::Marshal;
IntPtr memHandle = Marshal::StringToHGlobalAnsi(szRecvBuffer);
try
{
char* const str = static_cast<char*>(memHandle.ToPointer());
m_object->TestCommand(str);
szRecvBuffer = gcnew String(str);
}
finally
{
Marshal::FreeHGlobal(memHandle);
}
}
如果您使用的是VC ++ 2010,则可以将std::unique_ptr<>
与自定义删除器一起使用,以避免使用try..finally
,最终将代码行数减少一半。
答案 2 :(得分:0)
如果您使用Google搜索“System :: String”,则第二个链接为How to convert from System::String* to Char* in Visual C++。这显然是常见问题!
(根据所需转换的具体情况,似乎有大约5种不同的方式,所以我不会在这里总结一下:阅读文章。)
答案 3 :(得分:0)
您无法避免双向转换,因为System::String
使用wchar_t
,并且需要Unicode-&gt;多字节转换才能获得char
。
但marshal_as
应该可以让转换变得更加轻松。