ActiveQt OLE inProc not registred + MTA Threading both + SolidWorks PDM

Home »  Development »  Programming »  ActiveQt OLE inProc not registred + MTA Threading both + SolidWorks PDM

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

Всем привет!

Возникла проблема при которой созданная с помощью 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) ), а вместо этого просто указывают это в реестре.

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

 

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

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

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.