是否有任何特定的参考或标准方法来定位OLE自动化/ COM接口的接口ID?例如,IWebBrowser2接口的ID为D30C1661-CDAF-11D0-8A3E-00C04FC9E26E
,如here所示。但是,我能找到这个的唯一方法是因为我在这个特殊情况下已经有了GUID。这里的用例是CoCreateInstance函数,它具有:
HRESULT CoCreateInstance(
_In_ REFCLSID rclsid,
_In_ LPUNKNOWN pUnkOuter,
_In_ DWORD dwClsContext,
_In_ REFIID riid,
_Out_ LPVOID *ppv
);
每MSDN
但正如您在该页面上看到的那样,无法知道给定OLE接口需要什么样的riid。我在这里谈的是Win API接口,而不是第三方。 CLSID也有点难以找到,但它们可以在注册表中找到,也可以通过一个函数从我认为的进程ID中找到它。我正在试图找出我的选项与COM / CoCreateInstance一起使用。
答案 0 :(得分:0)
您通常不会查找IID和CLSID,而是查找接口。
IID只有IID_ISomeInterface
99%的时间,如果您使用的是Microsoft工具链,则可以使用__uuidof(ISomeInterface)
。大多数CLSID和IID存储在uuid.lib中,如果您需要链接其他内容,MSDN会告诉您.LIB的名称。
找到所需的界面后,您必须弄清楚如何创建/获取此界面的实例。有时您拨打CoCreateInstance
,有时在另一个已有实例的界面上拨打QueryInterface
或QueryService
。
如果我们以IWebBrowser2
为例,如果您查看its page on MSDN,则表明您应该使用CoCreateInstance
作为CLSID调用CLSID_InternetExplorer
。 RIID可以是CLSID_InternetExplorer
实现的任何接口,MSDN会在页面上列出继承的接口:
IWebBrowser2接口间接来自IDispatch;也就是说,IWebBrowser2派生自IWebBrowserApp,后者又从IWebBrowser派生而来,最终派生自IDispatch。
它可能会实现其他接口,但您通常会为其他任何接口创建“主”接口和QueryInterface
。
其他一些界面如IShellFolder
和IShellItem
可以通过多种方式创建,包括现有的shell对象和shell32.dll中的“creator”函数。
如果你甚至不知道你正在寻找哪个接口,那么你可以搜索属于SDK的.idl文件,它们应该包含Windows中大多数记录的接口的声明。
如果您想知道GUID是什么,但大部分时间不在乎,您可以在IID上拨打StringFromIID
。另一方面,如果你正在处理未记录的接口,那么GUID可能就是你所拥有的全部,你必须使用OleView,注册表和互联网来试图弄清楚接口的名称是什么以及它是什么宣言看起来像。