是否有任何特定的参考或标准方法可以找到OLE Automation/COM接口的接口ID?例如,IWEBBROWSER2接口的ID为D30C1661-CDAF-11D0-8A3E-00C04FC9E26E
,如下所示。但是,我什至能够找到这个问题的唯一方法是因为在这种特殊情况下我已经有了GUID。这里的用例是函数cocreateinstance,它采用:
HRESULT CoCreateInstance(
_In_ REFCLSID rclsid,
_In_ LPUNKNOWN pUnkOuter,
_In_ DWORD dwClsContext,
_In_ REFIID riid,
_Out_ LPVOID *ppv
);
PER MSDN
但是,正如您在该页面上看到的那样,没有办法知道给定的OLE接口需要什么riid。我说的是在这里赢得API接口,而不是第三方。CLSID也很难找到,但是可以在注册表中找到它们,也可以通过我相信的过程ID获取它的功能。我试图弄清楚我的选择是与com/cocreateinstance一起使用的。
您通常不寻找IID或CLSID,而是寻找界面。
IID只是IID_ISomeInterface
99%的时间,如果您使用的是Microsoft工具链,则可以使用__uuidof(ISomeInterface)
。大多数CLSID和IID都存储在uuid.lib和msdn中,如果您需要与其他东西链接,请告诉您.lib的名称。
找到接口后,您需要弄清楚如何创建/获取此接口的实例。有时您会调用CoCreateInstance
,有时您在一个已经有一个实例的另一个接口上调用QueryInterface
或QueryService
。
如果我们以IWebBrowser2
为例,则如果您在MSDN上查看其页面,则发现应使用CLSID_InternetExplorer
称CoCreateInstance
为CLSID。RIID可以是CLSID_InternetExplorer
和MSDN实现的任何接口,列出了页面上的继承接口:
iwebbrowser2接口从idispatch间接衍生;也就是说,iwebbrowser2源自iwebbrowserapp,这又来自iwebbrowser,最终来自idispatch。
。
它可能会实现其他接口,但通常您为其他任何东西创建"主"接口和QueryInterface
。
可以从现有的shell对象和shell32.dll中的"创建者"函数中创建其他一些其他接口,例如IShellFolder
和IShellItem
。
如果您甚至不知道要查找的界面,则可以搜索SDK一部分的.IDL文件,它们应包含Windows中大多数已记录的接口的声明。
如果您绝对想知道GUID是什么,则可以在IID上致电StringFromIID
,但大多数时候您不在乎。另一方面,如果您要处理无证件的接口,那么您可能拥有的全部是GUID,并且必须使用Oleview,注册表和Internet来弄清楚界面的名称是什么以及其声明是什么样。