Получить COM ProgID из exe без регистрации

Задний план:

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

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

Проблемы:

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

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


person mangelo    schedule 05.05.2010    source источник
comment
Программа просмотра объектов OLE-COM, поставляемая в комплекте с Visual Studio, может это сделать, так что это определенно возможно. Хороший вопрос! +1   -  person ParmesanCodice    schedule 05.05.2010
comment
Обычно это делается путем настройки перенаправления реестра и вызова саморегистрации. Компонент COM не регистрируется, и я не знаю, удовлетворяет ли это без регистрации часть вопроса. Я использую измененную версию сала: unicontsoft.com/upload/tallow   -  person wqw    schedule 06.05.2010
comment
Мое намерение состояло в том, чтобы посмотреть, не будет ли там никаких звонков в реестр. Я прочитаю о перенаправлении. Спасибо.   -  person mangelo    schedule 06.05.2010


Ответы (1)


И да и нет.

Насколько мне известно, универсального способа получить идентификаторы ProgID из библиотеки типов или COM-сервера не существует.

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

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

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

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

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

person Kim Gräsman    schedule 05.05.2010
comment
Я посмотрю в этом. Поскольку сейчас я сосредоточен на другом проекте, это может занять от нескольких дней до недели. - person mangelo; 06.05.2010
comment
Интересно, может быть, я сбил вас с пути ... Если присмотреться, RegOverridePredefKey переопределяет только текущий процесс (по понятным причинам), поэтому вы не можете использовать его для сбора регистрационных данных из исполняемого файла. Я редактирую свой ответ, чтобы отразить это. - person Kim Gräsman; 06.05.2010
comment
Есть новости по этому поводу по состоянию на июль 2021 года? Есть ли теперь API для этого? Я могу получить большинство других вещей из COM-DLL, используя LoadTypeLib, но не ProgID. - person Adrian S; 01.07.2021