簡體   English   中英

如何將C ++ / CLI字符串轉換為const char *

[英]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 :: Stringconst char *變量類型的編組創建了一個上下文。轉換后的數據在刪除上下文的行之后無效。

請考慮使用marshal_as<std::string> ,因為允許該字符串比marshal_context

另外,請注意VC ++ 2008 express不包含編組頭文件(marshal.h和其他),因此您必須使用VC ++ 2008 pro或以上版本。 從VS2010開始,看起來這些頭文件包含在快遞版中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM