有没有办法通过解析注册表中可用的信息来确定注册的 COM 组件是否可创建为独立组件?特别是通过在 HKCR/ClsId 中找到的信息?
我的系统在此键中有超过 12,000 个条目,并且我已经排除了任何没有 InProcServer32 或 LocalServer32 键的项目,但这仅消除了大约一半的项目。我相信还有几千个不是可创建的对象。我真的不想尝试对它们中的每一个都执行 CreateObject() 来区分可以创建的对象和不能创建的对象。有没有更有效的方法?
有没有办法通过解析注册表中可用的信息来确定注册的 COM 组件是否可创建为独立组件?特别是通过在 HKCR/ClsId 中找到的信息?
我的系统在此键中有超过 12,000 个条目,并且我已经排除了任何没有 InProcServer32 或 LocalServer32 键的项目,但这仅消除了大约一半的项目。我相信还有几千个不是可创建的对象。我真的不想尝试对它们中的每一个都执行 CreateObject() 来区分可以创建的对象和不能创建的对象。有没有更有效的方法?
我 为此目的使用了 Oleview (过去 :))
如果我没记错的话(附近没有 Windows PC):
coclass(不是interface或source;还有我认为也可以创建的全局模块:我只是不确定它们是否被定义为 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 组件提供了一个良好的起点
取决于您所说的“可创建”是什么意思。如果它有一个LocalServer32orInprocServer32键,它应该是本地可创建的。AppID如果它有一个并且 AppID 有一个LocalService或一个RemoteServer键,它也可以远程创建。
然而,咨询注册表只会回答“它看起来应该是可创建的”这个问题。
您可能仍然无法创建它:
您可能还可以创建其他组件:
所以我想答案是你应该能够使用注册表获得一个几乎完整的列表,但这个列表是做什么用的?
如果不知道您想要列表的用途,就不可能知道列表是否足够好。