System :: String对C ++ char *参数的引用

时间:2011-07-11 08:29:57

标签: c++ string reference c++-cli

是否有直接的方法在本地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

4 个答案:

答案 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应该可以让转换变得更加轻松。