描述:
m_pipactive是word的ActiveDocument对象,工作正常。
现在想通过它,得到ActiveDocument.Application属性,然后设置Application.UserName的值。在正常加载文档后,点击按钮调用以下代码执行时,Word就死了。但如果下面的语句写的不是UserName,而是Cation(Application.Cation)时,就能正确执行。请各位高手分析一下原因,应该如何编写?
另注:在VB脚本中直接写ActiveDocument.Application.UserName = "aaa"是可以执行的。目前我必须通过ActiveDocument才能访问Application。
IDispatch *pdisp;
VARIANT vtT[3];
if ((m_pipactive) &&
(SUCCEEDED(m_pipactive->QueryInterface(IID_IDispatch, (void**)&pdisp))))
{
if (SUCCEEDED(AutoDispInvoke(pdisp,
L"Application", 0, DISPATCH_PROPERTYGET, 0, NULL, &vtT[0])))
{
ASSERT(vtT[0].vt == VT_DISPATCH);
vtT[1].vt = VT_BSTR; vtT[1].bstrVal = SysAllocString(L"web@web.com");
if (SUCCEEDED(AutoDispInvoke(vtT[0].pdispVal,
L"UserName", 0, DISPATCH_PROPERTYPUT, 1, &vtT[1], &vtT[2])))
{
MessageBox(NULL,"aaa","bbb",0);
VariantClear(&vtT[2]);
}
VariantClear(&vtT[1]);
VariantClear(&vtT[0]);
}
pdisp->Release();
}
函数:AutoDispInvoke
STDAPI AutoDispInvoke(LPDISPATCH pdisp, LPOLESTR pwszname, DISPID dspid,
WORD wflags, DWORD cargs, VARIANT* rgargs, VARIANT* pvtret)
{
HRESULT hr;
DISPID dspidPut = DISPID_PROPERTYPUT;
DISPPARAMS dspparm = {NULL, NULL, 0, 0};
CHECK_NULL_RETURN(pdisp, E_POINTER);
dspparm.rgvarg = rgargs;
dspparm.cArgs = cargs;
if ((wflags & DISPATCH_PROPERTYPUT) || (wflags & DISPATCH_PROPERTYPUTREF))
{
dspparm.rgdispidNamedArgs = &dspidPut;
dspparm.cNamedArgs = 1;
}
__try
{
if (pwszname)
{
hr = pdisp->GetIDsOfNames(IID_NULL, &pwszname, 1, LOCALE_USER_DEFAULT, &dspid);
RETURN_ON_FAILURE(hr);
}
hr = pdisp->Invoke(dspid, IID_NULL, LOCALE_USER_DEFAULT,
(WORD)(DISPATCH_METHOD | wflags), &dspparm, pvtret, NULL, NULL);
}
__except(EvalException(GetExceptionCode()))
{
hr = E_WIN32_ACCESSVIOLATION;
}
return hr;
}
解决方案1:
void CWebOfficeCtrl::SetTrackUser(LPCTSTR strTrackUser)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
LPDISPATCH lpDisp;
lpDisp=m_pWebOfficeFrame->m_pWebOfficeView->m_pSelection->GetIDispatch();
_Application_Word m_WordApp;
_Document_Word m_WordDoc;
m_WordDoc.AttachDispatch(lpDisp,TRUE);
//m_WordDoc.Activate();
m_WordApp=m_WordDoc.GetApplication();
m_WordApp.SetUserName(strTrackUser);
m_WordApp.ReleaseDispatch();
m_WordDoc.ReleaseDispatch();
}