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方法执行