(Russian) Создаём OLE Server с помощью ActiveQt из linux MinGW MXE на примере SolidWorks PDM AddIn

Home »  Development »  Programming »  (Russian) Создаём OLE Server с помощью ActiveQt из linux MinGW MXE на примере SolidWorks PDM AddIn

On September 21, 2017, Posted by , In Programming, With No Comments

Всем привет!

Оказалось что со сборкой OLE для Windows возникают сложности. Я и подумать не мог что на это уйдёт такое большое количество времени и сил. Надеждой что сиё усилие не бесполезно и способно хоть кому то помочь или избавить от лишних мучений и является эта статья.

Эта инструкция крайне далека от совершенства и является просто набором последовательных действий приводящих к рабочему результату.

Начнём с плохой новости. Нам понадобится виртуалка с Windows и установленной внутри VisualStudio. Всё это нужно для того что бы из .tlb файла сгенерировать заголовочный h файл с GUID ‘ами классов и интерфейсов. Скорее всего это можно сделать с помощью WIDL или какого то другого инструмента без лишних усилий, но я пока не знаю как, кто знает напишите в комментариях. Одно могу скачать точно, с помощью Qt‘шной dumpcpp у меня ничего не получилось. В общем вот как это делаю я: Создаём проект, пишем в cpp файле строку:

#import "E:\kirill\Documents\Visual Studio 2013\Projects\API\Edm.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search

После чего нажимаем Скомпилировать и получаем в конечной папке два файла edm.tlh и edm.tli, забираем их.

Затем их нужно подредактировать, рекомендую gedit по тому что знаю как в нём заменять 10+ вхождения.

gedit edm.tlh

Нажимает поиск и замена, включаем регулярные выражения и меняем всё что не компилируется в MinGW:

  1. Ищем: “^enum \w+;” меняем на “”
  2. Ищем: “struct __declspec\(uuid\(\”(\w+)-(‘w+)-(\w+)-(\w{2})(\w{2})-(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})\”))\r\n\/\*([\s\w]+)\*\/ (\w+);” меняем на “struct DECLSPEC_UUID(“\1-\2-\3-\4\5-\6\7\8\9\10\11”)\r\n/*\12*/ \13;\r\n__CRT_UUID_DECL(\13, 0x\1, 0x\2, 0x\3, 0x\4,0x\5, 0x\6,0x\7,0x\8,0x\9,0x\10,0x\11)
  3. Ищем: “struct __declspec\(uuid\(\”(\w+)-(‘w+)-(\w+)-(\w{2})(\w{2})-(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})(\w{2})\”))\r\n(\w+);” меняем на “struct DECLSPEC_UUID(“\1-\2-\3-\4\5-\6\7\8\9\10\11”)\r\n\12;\r\n__CRT_UUID_DECL(\12, 0x\1, 0x\2, 0x\3, 0x\4,0x\5, 0x\6,0x\7,0x\8,0x\9,0x\10,0x\11)

Примечание: Замена в виде 0x\10 именно так работает только в gedit на сколько я понял во всех других как то по другому, возможно 0x$10 или 0x\{10}

Ещё возможно придётся выкосить property ну и ещё что то что я забыл, но пункты 2 и 3 обязательно нужно сделать что бы работал __uuidof.

Создаём проект C++ библиотеки:

Дальше файлы взятые из примеров и иконка зачем то, наверное файл rc не нужен:

Файл main.cpp:

И ещё два файла:

Дальше устанавливаем MXE и всё что нам нужно:

Теперь фиксим непонятную ошибку в ActiveQt связанную с регистрацией OLE сервера и режимом поточности. Как вносить изменения в MXE можно посмотреть тут.

Заходим в папку с нашим проектом, создаём папку и пробуем в ней компилировать:

Видим ошибку: “..qt5/bin/idc: Команда не найдена” Это нормально. Копируем строку над ошибкой и выполняем через wine используя свои пути и имена. Генерируем PDMToolAddIn.idl: wine /mnt/second_drive/build/mxe_new/usr/x86_64-w64-mingw32.static/qt5/bin/idc release/PDMToolAddIn.dll /idl release//PDMToolAddIn.idl -version 1.0

Теперь открываем вновь сгенерированный файл и комментируем следующие строки:

Зоздаём файл PDMToolAddIn.tlb: x86_64-w64-mingw32.static-widl -t -o release//PDMToolAddIn.tlb release//PDMToolAddIn.idl

И лепим этот файл к нашей библиотеке: wine /mnt/second_drive/build/mxe_new/usr/x86_64-w64-mingw32.static/qt5/bin/idc release/PDMToolAddIn.dll /tlb release//PDMToolAddIn.tlb

Готово, наш AddIn модуль готов к использованию. Если будут вопросы, буду рад ответить на них в комментариях.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.