How to convert C++/CLI string to const char*

Jim C

I've got a C++/CLI DLL I plan to use as an adapter between my C# DLL and native C++ clients. I need to pass strings in both directions. The adapter is compiled with VS2013 but needs to support clients built with VS2008 so I'm using const char* in the API. But what I've got isn't working even when both are VS2013-built.

Elsewhere, I found advice to use msclr\marshal.h, so I created:

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

To test these, I created a round-trip conversion method in my 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;
}

When the native C++ client calls Foo("abc"), the 1st message gets displayed, the "returned something else" message gets displayed and the client receives junk (îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþÞ›vÚ§). So it would seem my 2nd conversion is not working.

UPDATE

Here's the final solution I used.

I used zneaks' advice to marshall to std::string and PaulMcKenzie's advice to pass a caller-allocated char* instead of returning const char*. Thank you both.

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

The problem is that the marshal_context owns the char pointer that you got, so it is deallocated when your function returns:

This example creates a context for marshaling from a System::String to a const char * variable type.The converted data will not be valid after the line that deletes the context.

Consider using marshal_as<std::string> instead, since the string is allowed to outlive the marshal_context.

Эта статья взята из Интернета, укажите источник при перепечатке.

Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

Как преобразовать const char * в char * в C?

Как преобразовать std :: string в const char * или char *?

Convert const char** to void*?

How to convert a Path into a const char* for FFI?

Ошибка c ++: присвоение 'char *' несовместимого типа 'const char *'

Как предоставить аргумент 'const char *' для функции, которая принимает 'char *' в C ++?

C - могу ли я создать переменную const char * из char *?

преобразовать char * в const char * в C ++

преобразовать char * в const char * в C ++

Как преобразовать vector <string> в const char * const * в с ++?

c++ - char const * const * - <error reading characters of string>

C ++: выбор `const char *` против `std :: string` при использовании делегирующего конструктора

В C ++ зачем перегружать функцию в массиве const char и частной структуре, обертывающей const char *?

Как преобразовать char * в char * const * в C

c ++ не существует подходящей функции преобразования из "std :: string" в "const char *"

char * против const char * в C

How to convert elements in const unsigned char array to char

Почему string :: c_str () возвращает const char *, когда строки распределяются динамически?

c ++ map / set итератор не может быть разыменован --- map <const char *, string>

Ошибка C ++: невозможно преобразовать 'std :: basic_string <char>' в 'const char *'

C++ const char* to std::string &

C возвращает указатель const char или указатель char из функции

how to convert a string of numbers to a char

недопустимое преобразование c ++ из 'const char *' в 'char *'

не существует подходящей функции преобразования из "std :: string" в "const char *" c ++

Совместимы ли char * и const char * при использовании тернарного оператора в C?

const char * возвращает true в C ++ CLI

Как преобразовать const char & в const std :: string &?

C++ Add string to const char* array

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    How to click an array of links in puppeteer?

  3. 3

    (fields.E300) Поле определяет связь с моделью, которая либо не установлена, либо является абстрактной.

  4. 4

    Modbus Python Schneider PM5300

  5. 5

    Elasticsearch - Нечеткий поиск не дает предложения

  6. 6

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  7. 7

    TypeError: store.getState não é uma função. (Em 'store.getState ()', 'store.getState' é indefinido, como posso resolver esse problema?

  8. 8

    Перебирайте несколько столбцов в фрейме данных Panda и находите уникальные значения подсчета

  9. 9

    Проблемы со сборкой Python Image Registration Toolkit

  10. 10

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  11. 11

    Vue js CLI 2 импортирует и использует плагин javascript

  12. 12

    Автозаполнение с Java, Redis, Elastic Search, Монго

  13. 13

    Текущая ветка не настроена для извлечения В конфигурации не найдено значение для ключа branch.master.merge

  14. 14

    SQL Вычтите две строки друг от друга в одном столбце, чтобы получить результат

  15. 15

    How to normalize different curves drawn with geom = "step" when using stat_summary

  16. 16

    Merging legends in plotly subplot

  17. 17

    ViewPager2 мигает / перезагружается при смахивании

  18. 18

    Vue 2 / Vue CLI 3: создание асинхронных однофайловых компонентов

  19. 19

    как я могу удалить vue cli 2?

  20. 20

    Ошибка «LINK: фатальная ошибка LNK1123: сбой при преобразовании в COFF: файл недействителен или поврежден» после установки Visual Studio 2012 Release Preview

  21. 21

    Single legend for Plotly subplot for line plots created from two data frames in R

популярныйтег

файл