Нашей программе необходимо использовать COM-сервер, который также сделан нами. Сценарий следующий: установщик будет копировать файлы программы и файлы COM-сервера в одну и ту же папку при каждой установке.
В настоящее время мы используем regsvr32 для регистрации COM-сервера, но это не очень хорошо - если мы разрабатываем другую несвязанную программу, которая также использует тот же COM-сервер (вероятно, другой версии), мы можем столкнуться с проблемами - так как CLSID неизменны сервер, зарегистрированный позже, будет использоваться обеими программами, и первая программа может работать неправильно.
Так что нам нужен рег-свободный COM. Мы могли бы использовать манифесты, но я поиграл с ними некоторое время и нашел их не очень удобными для использования в ночной сборке. Мы также могли бы переписать программу так, чтобы вместо вызова CoCreateInstance()
она вызывала LoadLibraryEx()
, затем GetProcAddress()
, чтобы найти DllGetClassObject()
, а затем просто извлекать фабрику классов и использовать ее.
Я сразу вижу некоторые недостатки:
- программа будет зависеть от точного имени файла COM-сервера
- Дополнительный код должен быть написан для вещей, обычно управляемых Windows
- COM-сервер должен быть внутрипроцессным, и сортировка никогда не будет использоваться
и эти недостатки, как правило, могут показывать заглушки, но совсем не выглядят плохо в нашем конкретном сценарии.
Есть ли другие недостатки в использовании LoadLibraryEx()
/ DllGetClassObject()
по сравнению с CoCreateInstance()
?