自动化与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接口关联起来;
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);
}