首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

自动化与IDisaptc的差异

2013-01-09 
自动化与IDisaptc的区别1.自动化与IDisaptc的区别混淆很久了背景:开发office的时候,采用vc技术,使用各种接

自动化与IDisaptc的区别



1.


自动化与IDisaptc的区别

混淆很久了


背景:开发office的时候,采用vc技术,使用各种接口,

采用的是 加载mfc类型库的方式, 生成了很多类,

均继承COleDispatch.    是否说明了 这些提供给程序员的com类,

已经有了IDispatch接口?


2.


BeginWaitCursor();
COleVariant vTrue((short)TRUE), vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

_Application m_App;//定义Word提供的应用程序对象;
Documents m_Docs;//定义Word提供的文档对象;
Selection m_Sel;//定义Word提供的选择对象;
m_Docs.ReleaseDispatch();
m_Sel.ReleaseDispatch();
m_App.m_bAutoRelease=true;
if(!m_App.CreateDispatch("Word.Application"))

AfxMessageBox("创建Word2000服务失败!"); 
exit(1); 
}

//下面是定义VARIANT变量;
COleVariant varFilePath("word表格.doc");
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);

//关联接口Idispatch是什么意思??????? m_docs不是已经实现了该接口了吗,为什么要 关联???

m_Docs.AttachDispatch(m_App.GetDocuments());//将Documents类对象m_Docs和Idispatch接口关联起来;



[解决办法]
不过是个包装helper,否则手工调用IDispatch太麻烦,各种参数要传



void COleDispatchDriver::AttachDispatch(LPDISPATCH lpDispatch,
BOOL bAutoRelease)
{
ASSERT(lpDispatch != NULL);

ReleaseDispatch();  // detach previous
m_lpDispatch = lpDispatch;
m_bAutoRelease = bAutoRelease;
}

void AFX_CDECL COleDispatchDriver::InvokeHelper(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...)
{
va_list argList;
va_start(argList, pbParamInfo);

InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo, argList);

va_end(argList);
}

void COleDispatchDriver::GetProperty(DISPID dwDispID, VARTYPE vtProp,
void* pvProp) const
{
((COleDispatchDriver*)this)->InvokeHelper(dwDispID,
DISPATCH_PROPERTYGET, vtProp, pvProp, NULL);
}
void COleDispatchDriver::InvokeHelperV(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, va_list argList)
{
 //将各种参数转换成IDispatch识别的

// make the call
SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
&dispparams, pvarResult, &excepInfo, &nArgErr);

}

热点排行