|
Администратор
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Преобразование между типами System::String, char*, wchar_t*, std::string и др.12.03.2016, 21:03. Показов 53278. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|