发现已注册的COM组件

时间:2011-07-12 20:18:01

标签: com registry createobject clsid

有没有办法通过解析注册表中可用的信息来确定注册的COM组件是否可以作为独立组件创建?特别是通过HKCR / ClsId中的信息?

我的系统在此密钥中有超过12,000个条目,我已经排除了没有InProcServer32或LocalServer32密钥的任何项目,但这只消除了大约一半的项目。我相信还有另外几千个不是可创造的物体。我真的不想尝试在每个上面创建一个CreateObject()来区分可以创建的那些不能创建的那个。有更有效的方法吗?

2 个答案:

答案 0 :(得分:3)

OLEVIEW

我使用了 Oleview 为了这个目的(回到当天:))

手动/方案

如果我没记错的话(附近没有Windows PC):

  • 该类应链接到类型库
  • typelib将指向二进制文件(dll,ocx,exe)
  • 此二进制文件包含您应解析的物理类型库
    • midl编译器可以做到这一点(生成存根/ C头)
    • oleview可以做到(提取IDL)
    • tlbimp可以做到这一点
    • 您可以使用Win32 API
    • 执行此操作
    • 任何可创建对象都应标记为coclass(不是interfacesource;还有全局模块,我认为它们也是可创建的:我只是不确定它们是否已定义作为coclasses

显示代码

可以使用ITypeLib和ITypeInfo接口读取类型库中的信息。可以使用ICreateTypeLib和ICreateTypeInfo接口创建它们。但是,Microsoft IDL编译器(MIDL)可能是唯一使用ICreateType和ICreateTypeInfo的应用程序。

快速谷歌出现了这个有用的页面: Reading Type Libraries with C++

它包含只是开始使用的代码。只是为了看看它是否值得,我启动了一个云端Windows实例,抓住所有源代码并编译它。

与网站上提到的选项相比,我只是使用

在Windows上编译
cl.exe *.cpp /EHs ole32.lib oleaut32.lib

为了好玩,我使用MingW编译了Linux(64位)的东西:

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

为了节省您的工作,我将 zip-file up for download 包含在内:

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 :(得分:1)

取决于“可创造”的含义。如果它具有LocalServer32InprocServer32密钥,则它应该是本地可创建的。如果它有AppID并且AppID有LocalServiceRemoteServer个密钥,它也可能是远程创建的。

然而,咨询注册管理机构只会回答“它看起来应该是否可以创建”的问题。

您可能仍然无法创建它:

  • 注册可能已被破坏,或者来自已卸载组件的“化石”注册表项。
  • 该组件可能是某种内部Windows组件,您不知道如何使用它,因为它是故意不记录的。
  • 该组件可能是已安装应用程序的内部组件,其中包含未记录的其他要求。
  • 您可能没有权限。

您可以创建其他组件:

  • 可能存在免注册的COM组件,例如WSC scriptlet。
  • 可能有免注册的COM DLL。没有法律规定您必须注册成为COM组件。注册是大多数人选择加入的可选服务。

所以我想答案是你应该能够使用注册表获得一个基本完整的列表,但列表是什么?

如果不知道列表的内容,就不可能知道列表是否足够好。