|
Администратор
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Преобразование между типами System::String, char*, wchar_t*, std::string и др.12.03.2016, 21:03. Показов 53194. Ответов 1
Метки нет (Все метки)
При написании кода, взаимодействующего как с .NET и управляемым кодом, так и с неуправляемым кодом (такими как стандартные библиотеки C и C++ или WinAPI), зачастую возникает необходимость в преобразовании между разными строковыми типами или другими типами, часто использующимися в разработке.
Эта статья описывает простые способы превращения управляемых строковых типов в неуправляемые и наоборот, и этот же процесс для типов HANDLE и System::IntPtr. Содержание: #
Общие положения # ▲ С выходом Visual Studio 2008 процесс преобразования строковых типов значительно упростился и ограничивается использованием всего лишь двух методов: marshal_as() и marshal_context::marshal_as(). Эти методы поддерживают маршалинг между строковыми типами System::String^, char*, const char*, wchar_t*, const wchar_t*, BSTR, bstr_t, std::string, std::wstring, CStringT<char>, CStringT<wchar_t> и CComBSTR. Также поддерживается преобразование между типами, представляющими указатели: System::IntPtr и HANDLE. Для использования методов marshal_as() и marshal_context::marshal_as() нужно подключить один или несколько заголовочных файлов из папки msclr: marshal.h, marshal_windows.h, marshal_cppstd.h или marshal_atl.h. Определить, какой метод использовать и какой заголовочный файл подключать, можно из таблицы:
Другие преобразования, кроме указанных в таблице, не поддерживаются. Однако, метод и заголовочный файл можно определить и без таблицы, ответив на два вопроса:
Например, мы хотим преобразовать std::wstring в System::String^. Результат преобразования (System::String^) имеет деструктор (если быть более точным, удалением этого объекта занимается сборщик мусора, т.к. это управляемый тип), следовательно используем метод marshal_as(). Тип std::wstring относится к стандартной библиотеке C++, значит нужный нам заголовочный файл – marshal_cppstd.h. Тем не менее, из этого правила есть два исключения, а именно:
Как использовать методы marshal_as() и marshal_context::marshal_as()? # ▲ Подключаем нужный заголовочный файл и не забываем, что оба этих метода расположены в пространстве имён msclr::interop. Метод marshal_as() достаточно вызвать, указав тип-назначение. Результат преобразования будет удалён автоматически сборщиком мусора.
Преобразование из char*, const char*, wchar_t* и const wchar_t* в System::String^ осуществляется методом marshal_as(), расположенном в заголовочном файле marshal.h. Рассмотрим это на примере получения имени локали с помощью функции setlocale()
Есть другой способ преобразования строк из стандартной библиотеки C в System::String^ - это использование конструктора, который принимает как обычные, так и широкие (wchar_t) строки. Предыдущий пример можно переписать так:
Преобразование System::String^ в std::string, std::wstring и обратно # ▲ Для маршалинга строки из стандартной библиотеки C++ в System::String^ требуется минимум усилий – вызов метода marshal_as(). В данном примере показан разворот строки на месте.
10
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 12.03.2016, 21:03 | |
|
Ответы с готовыми решениями:
1
Преобразование System::String^ в std::string Преобразование из System::String в wchar_t*
|
|
Администратор
|
|||||||||||
| 12.03.2016, 21:03 [ТС] | |||||||||||
|
Преобразование System::IntPtr в HANDLE и обратно # ▲
Методы для маршалинга также позволяют преобразовать управляемое представление указателя – System::IntPtr в неуправляемое – HANDLE и обратно. Особенностью является тот факт, что использовать контекст маршалинга для такого преобразования не нужно – вся работа выполняется через встроенные в System::IntPtr методы. Ниже приведён пример преобразования System::IntPtr в HANDLE для получения количества GDI-объектов, используемых проводником:
Использование P/Invoke для автоматического маршалинга # ▲ Во многих приложениях строки используются очень часто и перевод каждой строки из одного типа в другой может быть утомительным занятием. Его можно автоматизировать, если использовать технологию P/Invoke. Рассмотрим пример
7
|
|||||||||||
| 12.03.2016, 21:03 | |
|
Помогаю со студенческими работами здесь
2
Преобразование char в System::String ^ Преобразование System::String^ в const char * Преобразование System::String в Char* и наоборот Конфузы с русскими буквами при переводе из System::String^ в std::string Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|