2

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

我的系统在此键中有超过 12,000 个条目,并且我已经排除了任何没有 InProcServer32 或 LocalServer32 键的项目,但这仅消除了大约一半的项目。我相信还有几千个不是可创建的对象。我真的不想尝试对它们中的每一个都执行 CreateObject() 来区分可以创建的对象和不能创建的对象。有没有更有效的方法?

4

2 回答 2

4

奥利维尤

我 为此目的使用了 Oleview (过去 :))

手动/编程

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

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

给我看代码

可以使用 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 文件供下载,其中包含:

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

(snip)和 15499 行更多

结束语

我希望这为您扫描系统以查找已安装、可创建的 COM 组件提供了一个良好的起点

于 2011-07-12T21:28:34.537 回答
1

取决于您所说的“可创建”是什么意思。如果它有一个LocalServer32orInprocServer32键,它应该是本地可创建的。AppID如果它有一个并且 AppID 有一个LocalService或一个RemoteServer键,它也可以远程创建。

然而,咨询注册表只会回答“它看起来应该是可创建的”这个问题。

您可能仍然无法创建它:

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

您可能还可以创建其他组件:

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

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

如果不知道您想要列表的用途,就不可能知道列表是否足够好。

于 2012-02-28T11:12:29.340 回答