04/06/2016
Как можно передавать сообщения в Fusion 360 по-русски из C++
Когда я создал тестовое приложение для Fusion 360 на C++ я обратил внимание, что цифры и английские буквы показываются нормально, а вместо кириллицы я увидел абракадабру. При этом в приложении на JavaScript и Python русские буквы воспроизводятся нормально. В чем же проблема? Оказалось, что скрипты JavaScript и Python сохраняются в кодировке UTF8 (если сохранять их в другой кодировке, то русские буквы тоже заменяются на абракадабру), и строки передаются именно в этой кодировке. Значит и в C++ необходимо передавать строки в этой же кодировке. Это можно сделать следующим образом (спасибо за подсказку liujac с форума Autodesk):
Код - C++: [Выделить]
- // Функция преобразования строки в UTF8
- inline std::string toUTF8(std::wstring w)
- {
- std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
- return converter.to_bytes(w);
- }
Результирующий код:
Код - C++: [Выделить]
- #include <locale>
- #include <codecvt>
- #include <windows.h>
- #include <Core/CoreAll.h>
- #include <Fusion/FusionAll.h>
- #include <CAM/CAMAll.h>
- using namespace adsk::core;
- using namespace adsk::fusion;
- using namespace adsk::cam;
- // Функция преобразования строки в UTF8
- inline std::string toUTF8(std::wstring w)
- {
- std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
- return converter.to_bytes(w);
- }
- Ptr<Application> app;
- Ptr<UserInterface> ui;
- extern "C" XI_EXPORT bool run(const char* context)
- {
- app = Application::get();
- if (!app)
- return false;
- ui = app->userInterface();
- if (!ui)
- return false;
- HMODULE hdll = LoadLibraryW(L"C:\\test.dll");
- if (hdll) {
- ui->messageBox(toUTF8(L"Dll загружено"));
- } else {
- ui->messageBox(toUTF8(L"Dll не загружено"));
- }
- return true;
- }
- extern "C" XI_EXPORT bool stop(const char* context)
- {
- if (ui)
- {
- ui->messageBox(toUTF8(L"Выход "));
- ui = nullptr;
- }
- return true;
- }
- #ifdef XI_WIN
- #include <windows.h>
- BOOL APIENTRY DllMain(HMODULE hmodule, DWORD reason, LPVOID reserved)
- {
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
- #endif // XI_WIN
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7135
Опубликовано 04.06.2016