Ссылка System :: String на параметр C ++ char * - PullRequest
2 голосов
/ 11 июля 2011

Существует ли прямой способ управления строками C ++ / CLI в оболочке с параметром char * для собственного метода C ++?!

пример:

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;
}

привет Леон 22 * ​​1012 *

Ответы [ 4 ]

2 голосов
/ 11 июля 2011

Если char* является выходным параметром, то в C ++ / CLI вы должны передать System::StringBuilder^

2 голосов
/ 11 июля 2011

Вы многое делаете вручную, о чем позаботится среда выполнения.

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, в конечном итоге сокращая количество строк кода пополам.

0 голосов
/ 11 июля 2011

Нельзя избежать преобразований в обоих направлениях, потому что System::String использует wchar_t, и для получения char необходимо *1003*, но marshal_as требуется преобразование Unicode-> Multibyte.должно сделать преобразование намного проще.

0 голосов
/ 11 июля 2011

Если вы ищете "System :: String" с помощью Google, вторая ссылка будет Как преобразовать из System :: String * в Char * в Visual C ++ .Это, очевидно, часто задаваемые вопросы!

(По-видимому, существует около 5 различных способов в зависимости от специфики требуемой конверсии, поэтому я не буду их резюмировать здесь: иди и прочитай статью.)

...