有没有办法通过解析注册表中可用的信息来确定注册的COM组件是否可以作为独立组件创建?特别是通过HKCR / ClsId中的信息?
我的系统在此密钥中有超过12,000个条目,我已经排除了没有InProcServer32或LocalServer32密钥的任何项目,但这只消除了大约一半的项目。我相信还有另外几千个不是可创造的物体。我真的不想尝试在每个上面创建一个CreateObject()来区分可以创建的那些不能创建的那个。有更有效的方法吗?
答案 0 :(得分:3)
我使用了 Oleview 为了这个目的(回到当天:))
如果我没记错的话(附近没有Windows PC):
coclass
(不是interface
或source
;还有全局模块,我认为它们也是可创建的:我只是不确定它们是否已定义作为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)
取决于“可创造”的含义。如果它具有LocalServer32
或InprocServer32
密钥,则它应该是本地可创建的。如果它有AppID
并且AppID有LocalService
或RemoteServer
个密钥,它也可能是远程创建的。
然而,咨询注册管理机构只会回答“它看起来应该是否可以创建”的问题。
您可能仍然无法创建它:
您可以创建其他组件:
所以我想答案是你应该能够使用注册表获得一个基本完整的列表,但列表是什么?
如果不知道列表的内容,就不可能知道列表是否足够好。