跟踪调试 COM 组件的接口
----Edit by hklzt
刚一开始,对于 COM 组件的接口,真的不知如何下手,就更谈不上调试 IE 里的某个
ActiveX 控件了。在 Snake 的熏陶下,我经过一翻努力,终于找到了一种方法可以跟踪调试
COM 组件的接口。
为了跟踪调试 COM 组件的接口,这里需要先了解一些基本知识。
Idispatch 接口如下:
interface IDispatch : IUnknown
{
virtual HRESULT GetTypeInfoCount(UINT* pctinfo) = 0;
virtual HRESULT GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) = 0;
virtual HRESULT GetIDsOfNames (REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid) = 0;
virtual HRESULT Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT*
puArgErr ) = 0;
}
1、 GetTypeInfoCount():用于获取自动化组件支持的 ITypeInfo 接口的数目。
2、 GetTypeInfo():用于获取指针 ITypeInfo 接口的指针,通过该指针将能够判断自动
化服务程序所提供的自动化支持。
3、 GetIDsOfNames():读取一个函数的名称并返回其调度 ID(DISPID)。
DISPID* rgdisped :是一个 long 类 型 的 数 据 , 对 于 IDispatch 的 一 个 特 定 实 现 , 此
DISPID 值应该是唯一的。
REFIID riid:为保留参数,必须设置为 IID_NULL,在 rgszNames 中指定了成员的函数
名及其参数,由 cNames 标识了名字的个数, lcid 参数用于指定本地化标识,得到的
DISPID 将保存到 rgdispid 中。
4、 Invoke():提供了访问自动化对象暴露出来的方法和属性的方法。
将 DISPID 作为函数指针数组的索引传入 dispidMember 参数,Invoke()将实现一组按
此索引来访问的函数。
riid 和 lcid 的含义与在 GetIDsOfNames()中的定义相同,分别为保留参数和本地化标
识。
WORD wFlags:指定了要访问的是接口的属性还是方法
DISPPARMS* pdispparams:包括了方法和属性调用的参数数组、DISPID 数组以及数组
中参数个数等信息。
VARIANT* pvarResult:保存返回值信息。
EXCEPINFO* pexcepinfo:指向一个有效的异常信息结构
UINT * PuArgErr:包含了第一个产生错误的参数指针。