Получить COM ProgID из exe без регистрации - PullRequest
5 голосов
/ 05 мая 2010

Справочная информация:

Я хотел бы извлечь данные COM из приложения VB6, чтобы я мог правильно зарегистрировать его (в соответствии с рекомендациями Microsoft) приложения. Я использую WiX 3.0 и heat.exe не будет извлекать данные (известная проблема с высокой температурой), и у меня нет готового доступа к связанному файлу TLB. В приложении VB6 не включена совместимость, поэтому он генерирует COM-идентификаторы COM при каждой сборке (они хотят, чтобы приложение могло работать бок о бок со старой версией.)

Я создал приложение C #, которое будет собирать информацию о TypeLib, интерфейсе и CoClass из приложения VB6 без регистрации, и создаю файл wxs для использования свечой. В моей компании есть несколько других старых приложений, подобных этой, и я хотел бы сделать это более универсальным решением.

Вопросы:

1. Есть ли способ получить «истинный» ProgID (предназначенный для программиста) из приложения без проекта или файла TLB и без его регистрации?

2. Есть ли способ узнать предполагаемую модель потоков из DLL, не регистрируя ее? (Я имею в виду, что он может обрабатывать все активные элементы COM, может быть завершен) Спасибо.

1 Ответ

1 голос
/ 05 мая 2010

Да и нет.

Насколько я знаю, нет никакого общего способа получить ProgIDs из typelib или COM-сервера.

Точкой входа для DLL является DllRegisterServer, которая должна записывать регистрационную информацию в реестр, а для серверов EXE они обычно имеют аргумент командной строки, который имеет то же значение.

Библиотеки типов содержат описание всех интерфейсов и коклассов в компоненте, но они редко содержат удобочитаемый ProgID.

Единственный ясный способ, который я могу видеть и рекомендовать, - это переопределить ключ HKCR \ CLSID, чтобы временно указать куда-нибудь, а затем вызвать DllRegisterServer. Поскольку переопределения разделов реестра являются локальными для процессов, это будет работать только для внутрипроцессных (DLL) серверов.

См. http://msdn.microsoft.com/en-us/library/ms724901(v=VS.85).aspx для получения информации о переопределении ключей реестра.

Затем проверьте рабочий реестр и посмотрите, какие изменения были внесены, например, CLSID <-> сопоставления ProgID, модель потоков и т. Д.

...