MFC操作EXCEL向单元格写入数据崩溃,该如何解决

MFC操作EXCEL向单元格写入数据崩溃
本帖最后由 ljwxy900 于 2014-03-13 12:08:54 编辑

    InitExcelApp();
OpenExcelApp();
NewExcelBook();
CheckType();

m_ExlRge = m_ExlSheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("A1")));
m_ExlRge.put_Value2(COleVariant(_T("图片名称")));

调试时调用get_Range处崩溃,具体在下面这句
      SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
&dispparams, pvarResult, &excepInfo, &nArgErr);
完整代码见下方:
void COleDispatchDriver::InvokeHelperV(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, va_list argList)
{
if (m_lpDispatch == NULL)
{
TRACE(traceOle, 0, "Warning: attempt to call Invoke with NULL m_lpDispatch!\n");
return;
}

COleDispParams dispparams;
memset(&dispparams, 0, sizeof dispparams);

// determine number of arguments
if (pbParamInfo != NULL)
dispparams.cArgs = lstrlenA((LPCSTR)pbParamInfo);

DISPID dispidNamed = DISPID_PROPERTYPUT;
if (wFlags & (DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF))
{
ASSERT(dispparams.cArgs > 0);
dispparams.cNamedArgs = 1;
dispparams.rgdispidNamedArgs = &dispidNamed;
}
CVariantBoolConverter tempArgs; //Used to convert VARIANT_BOOL | VT_BYREF --> BOOL*.
if (dispparams.cArgs != 0)
{
// allocate memory for all VARIANT parameters
VARIANT* pArg = new VARIANT[dispparams.cArgs];
ASSERT(pArg != NULL);   // should have thrown exception
dispparams.rgvarg = pArg;
memset(pArg, 0, sizeof(VARIANT) * dispparams.cArgs);

// get ready to walk vararg list
const BYTE* pb = pbParamInfo;
pArg += dispparams.cArgs - 1;   // params go in opposite order

while (*pb != 0)
{
ASSERT(pArg >= dispparams.rgvarg);

pArg->vt = *pb; // set the variant type
if (pArg->vt & VT_MFCBYREF)
{
pArg->vt &= ~VT_MFCBYREF;
pArg->vt |= VT_BYREF;
}
switch (pArg->vt)
{
case VT_UI1:
pArg->bVal = va_arg(argList, BYTE);
break;
case VT_UI2:
pArg->uiVal = va_arg(argList, USHORT);
break;
case VT_UI4:
pArg->ulVal = va_arg(argList, ULONG);
break;
case VT_UI8:
pArg->ullVal = va_arg(argList, ULONGLONG);
break;
case VT_I1:
pArg->cVal = va_arg(argList, char);
break;
case VT_I2:
pArg->iVal = va_arg(argList, short);
break;
case VT_I4:
pArg->lVal = va_arg(argList, long);
break;
case VT_I8:
pArg->llVal = va_arg(argList, LONGLONG);
break;
case VT_R4:
pArg->fltVal = (float)va_arg(argList, double);
break;
case VT_R8:
pArg->dblVal = va_arg(argList, double);
break;
case VT_DATE:
pArg->date = va_arg(argList, DATE);
break;
case VT_CY:
//CY is always passed by ref
pArg->cyVal = *va_arg(argList, CY*);
break;
case VT_BSTR:
{
LPCOLESTR lpsz = va_arg(argList, LPOLESTR);
pArg->bstrVal = ::SysAllocString(lpsz);
if (lpsz != NULL && pArg->bstrVal == NULL)
{
AfxThrowMemoryException();
}
}
break;
#if !defined(_UNICODE)
case VT_BSTRA:
{
LPCSTR lpsz = va_arg(argList, LPSTR);
CStringW strMBToUnicode(lpsz);
pArg->bstrVal = ::SysAllocString(static_cast<LPCWSTR>(strMBToUnicode));
if (lpsz != NULL && pArg->bstrVal == NULL)
AfxThrowMemoryException();
pArg->vt = VT_BSTR;
}
break;
#endif
case VT_DISPATCH:
pArg->pdispVal = va_arg(argList, LPDISPATCH);
break;
case VT_ERROR:
pArg->scode = va_arg(argList, SCODE);
break;
case VT_BOOL:
V_BOOL(pArg) = (VARIANT_BOOL)(va_arg(argList, BOOL) ? -1 : 0);
break;
case VT_VARIANT:
//VARIANT is always passed by ref
*pArg = *va_arg(argList, VARIANT*);
break;
case VT_UNKNOWN:
pArg->punkVal = va_arg(argList, LPUNKNOWN);
break;

case VT_UI1|VT_BYREF:
pArg->pbVal = va_arg(argList, BYTE*);