ActiveQt OLE inProc не регистрируется + MTA multi-поточность + SolidWorks PDM

Главная »  Разработка »  Программирование »  ActiveQt OLE inProc не регистрируется + MTA multi-поточность + SolidWorks PDM

  Сентябрь 21, 2017, Автор: , Рубрика: Программирование,  Нет комментариев

Всем привет!

Возникла проблема при которой созданная с помощью ActiveQt Add-In библиотека отказывалась добавляться в PDM. Ругалось на отсутствие реализованного интерфейса. Путём разбирания исходников и напихивания их отладочными МессаджБоксами было выявлено что загрузка не происходит из за того что после выполнения функции DllRegisterServer не происходит выполнение функции DllGetClassObject.

Как я понимаю схема работы такая:

После регистрации сервера (DllRegisterServer) клиент получает имеющиеся у сервера классы и начинает опрашивать их передавая в функцию DllGetClassObject.

Соответственно если функция DllGetClassObject не выполняется значит проблема с записями в реестре которые сервер делает в качестве регистрации в функции DllRegisterServer. Вот тут то и было потрачено большее количество времени и выделенных на эту проблему. Дело в том что все записи создаются. В итоге причину проблемы выяснить не удалось, но решается она ручной перезаписью значения ветки HKCR\CLSID\{НАШ UUID}\InProcServer32

После этого загрузка пошла дальше и ошибка изменилась и звучала она примерно так: «Эта библиотека имеет однопоточную модель STA (Single threading), а нам нужна мультипоточная MTA (Multi threading). Слава богу хоть в этот раз сайт документации майкрософт не подвёл и выдал страницу In-Process Server Threading Issues на которой было написано что InProcess OLE серверы не производят программных манипуляций для указания своей модели поточности (например с помощью функций CoInitializeEx(0, COINIT_MULTITHREADED) ), а вместо этого просто указывают это в реестре.

В итоге получился такой вот патч-костыль для личного пользования:

 

По всем вопросам пишите в комментариях или на почту.

Спасибо за внимание!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *