COM组件IDispatch操作

2023-10-10 08:23:17 浏览数 (1)

IDispatch

组件接口,继承IUnkown,实现了反射机制,可以通过invoke调用dll函数

一般执行过程需要GetIDsOfNames、InvokeHelper函数执行,queryinterface查询获取对象

检查GetIDsOfNames返回的dispid是否正确

COleDispatchDriver

单独类实现,m_lpDispatch成员GetIDsOfNames方法获取dispid,或者通过classward(vc类向导,从文件tlb实现接口定义)

vs2022,添加新建项,选择更多,选择MFC->typelib类弹出如上窗口

类向导生成的函数枚举等类型使用long替换,函数原始格式可以参考tlb生成的tlh文件描述(#import tlb自动生成的tlh)

代码语言:javascript复制
CTable0 table = tables.Add(sel.get_Range(), RowCount, ColCount,  vTrue, vOpt);//创建表格
CBorders borders = table.get_Borders();
borders.put_InsideColor(Word::wdColorPaleBlue);//设置表格边框颜色
CCell CellTemp = table.Cell(1, 1);
CShading shading = CellTemp.get_Shading();
shading.put_BackgroundPatternColor(Word::wdColorPaleBlue);  //设置单元格背景色

使用类向导自动生成的类,继承COleDispatchDriver,用户可以不操作IDispatch接口


用户操作IDispatch的调用方式

代码语言:javascript复制
COleDispatchDriver borders(table.get_Borders());
BSTR propName = L"OutsideColor";   //put_OutsideColor会提示未知名称
borders.m_lpDispatch->GetIDsOfNames(IID_NULL, &propName, 1, LOCALE_SYSTEM_DEFAULT, &ids);
BYTE param_data[] = { VTS_PVARIANT };
borders.InvokeHelper(ids, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, param_data, Word::wdColorSkyBlue);

CComDispatchDriver

CComDispatchDriver智能指针,COleDispatchDriver是单独的类实现

代码语言:javascript复制
borders.GetIDsOfNames(L"OutsideColor", &ids);//put_OutsideColor会提示未知名称
borders.PutProperty(ids, &CComVariant(Word::wdColorSkyBlue, VT_I4));

CComDispatchDriver执行函数Invoke0、Invoke1和属性PutProperty、GetProperty是分开的 COleDispatchDriver执行更接近idispatch的原生接口

异常

  • 未知名称

函数名称包含put_、get_的需要去掉后查询

  • 找不到指定方法

CComDispatchDriver是否是property使用了invoke方法执行

0 人点赞