Обнаружение зарегистрированных компонентов COM - PullRequest
2 голосов
/ 13 июля 2011

Есть ли способ определить, является ли зарегистрированный COM-компонент доступным для создания как отдельный компонент, просто анализируя информацию, имеющуюся в реестре? В частности, по информации, найденной в HKCR / ClsId?

В моей системе более 12 000 записей в этом ключе, и я уже исключаю любые элементы, у которых нет ключа InProcServer32 или LocalServer32, но это исключает только около половины элементов. Я верю, что есть еще пара тысяч, которые не являются объектами, которые можно создать. Я действительно не хочу пытаться выполнить CreateObject () для каждого из них, чтобы отличить те, которые могут быть созданы, от тех, которые не могут. Есть ли более эффективный способ?

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Oleview

Я использовал Oleview для этой цели (назад в тот день:))

Ручной / программный

Если я правильно помню (поблизости нет ПК с Windows):

  • класс должен ссылаться на библиотеку типов
  • typelib будет указывать на двоичный файл (dll, ocx, exe)
  • этот двоичный файл содержит физическую библиотеку типов, которую вы должны проанализировать
    • это может сделать midl-компилятор (генерировать заглушки / заголовки C)
    • oleview может это сделать (извлечь IDL)
    • tlbimp может это сделать
    • вы можете сделать это с Win32 API
    • любые создаваемые объекты должны быть помечены coclass (не interface или source; были также глобальные модули, которые, я полагаю, тоже можно создавать: я просто не уверен, определены ли они как коклассы

Покажите мне код

Можно прочитать информацию в библиотеке типов с помощью интерфейсов ITypeLib и ITypeInfo. Они могут быть созданы с помощью интерфейсов ICreateTypeLib и ICreateTypeInfo. Однако компилятор Microsoft IDL (MIDL), вероятно, является единственным приложением, которое когда-либо использовало ICreateType и ICreateTypeInfo.

Быстрый гугл открыл эту полезную страницу: Чтение библиотек типов с C ++ .

Он содержит просто код для начала работы. Чтобы узнать, стоило ли это чего-нибудь, я запустил облачный экземпляр Windows, взял все исходники и скомпилировал его.

В отличие от опций, упомянутых на сайте, я просто скомпилировал на windows с

cl.exe *.cpp /EHs ole32.lib oleaut32.lib

Ради интереса я скомпилировал материал для Linux (64 бит), используя MingW:

i586-mingw32msvc-g++ *.cpp -loleaut32 -lole32 -o Typelib.exe

Чтобы сохранить вам работу, я поместил zip-файл для скачивания , содержащий:

win32_Unicode.cpp     - sources by René Nyffenegger
win32_Unicode.h
TestTypelib.cpp
Typelib.cpp
Typelib.h
VariantHelper.cpp
VariantHelper.h
TestTypelib.exe       - binary compiled on windows

Тестовый прогон:

# linux: ./a.exe ~/.wine/drive_c/windows/system32/msxml6.dll
C:\Games\Stacko>TestTypelib.exe c:\Windows\System32\msxml6.dll

MSXML2: Microsoft XML, v6.0
Nof Type Infos: 149

IXMLDOMImplementation
----------------------------
  Interface: Dispatch
  functions: 8
  variables: 0

  Function     : QueryInterface
    returns    : VT_VOID
    flags      : 
    invoke kind: function
    params     : 2
    params opt : 0
    Parameter  : riid type = VT_PTR (VT_USERDEFINED (GUID)) in
    Parameter  : ppvObj type = VT_PTR (VT_PTR) out

  Function     : AddRef
    returns    : VT_UI4
    flags      : 
    invoke kind: function
    params     : 0
    params opt : 0

(отрывок) и еще 15499 строк

Заключительный

Надеюсь, это станет хорошей отправной точкой для сканирования вашей системы на наличие установленных, создаваемых COM-компонентов

1 голос
/ 28 февраля 2012

Зависит от того, что вы подразумеваете под «создаваемым». Если он имеет ключ LocalServer32 или InprocServer32, он должен быть создан локально. Он также может быть создан удаленно, если он имеет AppID и AppID имеет либо LocalService, либо RemoteServer ключи.

Однако обращение к реестру ответит только на вопрос «похоже ли это, что его можно создать».

Возможно, вы все еще не сможете его создать:

  • Регистрация может быть повреждена, или «ископаемые» записи реестра от неустановленных компонентов.
  • Компонент может быть внутренним компонентом Windows, который вы не знаете, как использовать, поскольку он намеренно не задокументирован.
  • Компонент может быть внутренним компонентом установленного приложения, к которому предъявляются дополнительные требования, не задокументированные.
  • Возможно, у вас нет разрешения.

Могут быть и другие компоненты, которые вы можете создать:

  • Там могут быть COM-компоненты, не требующие регистрации, такие как скриптлеты WSC.
  • там могут быть COM-библиотеки без регистрации. Нет закона, согласно которому вы должны быть зарегистрированы, чтобы быть компонентом COM. Регистрация - это дополнительная услуга, которую выбирают большинство людей.

Итак, я полагаю, что ответ заключается в том, что вы сможете получить в основном полный список с использованием реестра, но для чего этот список?

Не зная, для чего нужен список, невозможно узнать, достаточно ли хорош этот список.

...