描述:
1:
这段是MFC插入ole对象的
COleInsertDialog dlg;
if (dlg.DoModal(COleInsertDialog:ocObjectsOnly) != IDOK)
return;
BeginWaitCursor();
CRptDesginCntrItem* pItem = NULL;
TRY
{
// 创建与此文档相连接的新项
CRptDesginDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new CRptDesginCntrItem(pDoc);
ASSERT_VALID(pItem);
// 通过对话框数据初始化该项
if (!dlg.CreateItem(pItem))
AfxThrowMemoryException(); // 任何异常都将导致该结果
ASSERT_VALID(pItem);
pItem->DoVerb(OLEIVERB_SHOW, this);
ASSERT_VALID(pItem);
// 作为任意用户界面设计,这会将选定内容
// 设置为插入的最后一项
// TODO: 重新实现选定内容,使其适合于您的应用程序
m_pSelection = pItem; // 将选定内容设置为插入的最后一项
pDoc->UpdateAllViews(NULL);
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
运行没问题,我修改为不弹出对象框,直接插入EXCEL
BeginWaitCursor();
CRptDesginCntrItem* pItem = NULL;
TRY
{
// 创建与此文档相连接的新项
CRptDesginDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new CRptDesginCntrItem(pDoc);
ASSERT_VALID(pItem);
CLSID clsid;
HRESULT hr=CLSIDFromProgID(OLESTR("Excel.Application.11"),&clsid);
if(S_OK != hr) return 0;
//*****************这里修改为直接调用
ASSERT_VALID(pItem);
pItem->CreateNewItem(clsid);
pItem->DoVerb(OLEIVERB_SHOW, this);
ASSERT_VALID(pItem);
// 作为任意用户界面设计,这会将选定内容
// 设置为插入的最后一项
// TODO: 重新实现选定内容,使其适合于您的应用程序
m_pSelection = pItem; // 将选定内容设置为插入的最后一项
pDoc->UpdateAllViews(NULL);
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
不同这处在于一个由于oledlg调用COleDocObjectItem::CreateNewItem()
修改的那段为
我直接调用pItem->CreateNewItem(clsid);
然后pItem->DoVerb(OLEIVERB_SHOW, this);就会抛出异常,对象链接段开。
我跟踪代码,没发现有什么不同啊?
2:如果excel作为ole插入后,能否在程序中控制它呢
CComQIPtr<MSExcel::_Application> pExcelApp;
//MSExcel::_ApplicationPtr;
m_pSelection->m_lpObject->QueryInterface(MSExcel::IID__Application,(void**) &pExcelApp);
ATLASSERT(pExcelApp);
这个得不到指针,如何能得到excel的指针呢
解决方案1:
1.
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Sheet",&clsid);
if( FAILED(hr) )
return;
2.
找IDispatch接口,msdn有例子