VC++里实现ActiveSheet.IOLEObjects.Add时,程序崩溃

hechunhu2008 2017-12-07 09:26:27
VS2010开发环境的ATL开发,Excel2010版本,利用Excel.thl里的接口实现相应功能。
pExcel->get_ActiveSheet((IDISPATCH**)&pWorkSheet);
pWorkSheet->OLEObjects(vtMissing,0,(Excel::OLEObjects**)&pIOLEObjects);
_pIOLEObjects->Add("MyChart.Document",vtMissing,varFalse,varFalse,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,(Excel::_OLEObject**)&pIOLEObject);

当执行Add这句话时,程序就挂了。提示RPC服务器问题,内存问题。检查了RPC服务器没问题,不知道怎么回事,就是不行。


那位大神知道如何解决不????????感谢。。。。。。。。。。
...全文
381 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hechunhu2008 2017-12-20
  • 打赏
  • 举报
回复
感谢各位大神,问题已经解决!还是自己的代码问题!
赵4老师 2017-12-14
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll
hechunhu2008 2017-12-13
  • 打赏
  • 举报
回复
@zhao4zhong1 大神,你好!进入不了调试。是不是这个office2010版本不支持这么弄哦。暂时没有用C#去测试,只是用C++做。
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
hechunhu2008 2017-12-10
  • 打赏
  • 举报
回复
@zgl7903 直接报错,提示RPC服务器问题,内存问题。大神有无解决办法?
zgl7903 2017-12-09
  • 打赏
  • 举报
回复
catch _com_error 看看提示什么错误
zgl7903 2017-12-08
  • 打赏
  • 举报
回复
参考MSDN的例子

// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Visual C++ Language  Reference and related
// electronic documentation provided with Microsoft Visual C++.
// See these sources for detailed information regarding the
// Microsoft Visual C++ product.

// NOTE: This example will only work with Excel8 in Office97
// Compile with cl /GX comexcel.cpp
// TO DO: Edit the #import paths
#import "MSO9.DLL"  rename("RGB", "RBGMSO") rename("SearchPath", "SearchPathMSO") \
  rename("DocumentProperties", "DocumentPropertiesMSO") no_auto_exclude
#import "VBE6EXT.OLB" no_namespace no_auto_exclude  
#import "EXCEL9.OLB" rename("RGB", "RBGXL") rename("DialogBox", "DialogBoxXL") \
  rename("CopyFile", "CopyFileXL") rename("ReplaceText", "ReplaceTextXL") rename("IPicture", "IPictureXL") \
  rename("IFont", "IFontXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces no_auto_exclude 



#include <stdio.h>
#include <tchar.h>

void dump_com_error(_com_error &e)
{
    _tprintf(_T("Oops - hit an error!\n"));
    _tprintf(_T("\a\tCode = %08lx\n"), e.Error());
    _tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    _tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);
    _tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription);
}

// If this is placed in the scope of the smart pointers, they must be
// explicitly Release(d) before CoUninitialize() is called.  If any reference
// count is non-zero, a protection fault will occur.
struct StartOle {
    StartOle() { CoInitialize(NULL); }
    ~StartOle() { CoUninitialize(); }
} _inst_StartOle;


void main()
{
  using namespace Office;
  using namespace Excel;
  
  _ApplicationPtr pXL;
  
  try 
  {
    pXL.CreateInstance(L"Excel.Application");
    
    pXL->Visible = VARIANT_TRUE;
    
    WorkbooksPtr pBooks = pXL->Workbooks;
    _WorkbookPtr pBook  = pBooks->Add((long)xlWorksheet);
    
    _WorksheetPtr pSheet = pXL->ActiveSheet;
    
    try {
      // This one will fail
      pSheet->Name = "Market Share?";
    } catch (_com_error &e) {
      dump_com_error(e);
    }
    
    pSheet->Name = "Market Share!";

    Excel::ShapesPtr pShapes = pSheet->Shapes;
    RangePtr range = pSheet->Range["H1:O10"];
    float l = range->Left, t = range->Top;
    float w = range->Width, h = range->Height;
    Excel::ShapePtr pShape = pShapes->AddPicture( "C:\\tt.jpg", 
      msoFalse, msoTrue, l, t, w, h);
    
    
    pSheet->Range["A2"]->Value = "Company A";
    pSheet->Range["B2"]->Value = "Company B";
    pSheet->Range["C2"]->Value = "Company C";
    pSheet->Range["D2"]->Value = "Company D";
    
    pSheet->Range["A3"]->Value = 75.0;
    pSheet->Range["B3"]->Value = 14.0;
    pSheet->Range["C3"]->Value = 7.0;
    pSheet->Range["D3"]->Value = 4.0;
    
    Sleep(1000);
    
    RangePtr  pRange  = pSheet->Range["A2:D3"];
     _ChartPtr  pChart  = pBook->Charts->Add();
    
    pChart->ChartWizard((Range*) pRange, (long) xl3DPie, 7L, (long) xlRows,
      1L, 0L, 2L, "Market Share");
    
    Sleep(6000);
    
    pBook->Saved = VARIANT_TRUE;
    pXL->Quit();
  } 
  catch(_com_error &e) 
  {
    dump_com_error(e);
  }
}


hechunhu2008 2017-12-08
  • 打赏
  • 举报
回复
@zgl7903 我之前也利用shapes实现过,如下: pExcel->get_ActiveSheet((IDispatch**)&pWorksheet); pWorksheet->get_Shapes((Excel::Shapes**)&pIShapes); pIShapes->AddOLEObject“MyChart.Document”,vtMissing,varFalse,varFalse,vtMissing,vtMissing,vtMissing,varL,varT,varW,varH,(Excel::Shape**)&pIShape); 到这一步,OLEObject已经创建成功。但是问题来了,我选中该对象,去Activate的时候,程序就挂了,挂了的原因和之前一样。 pIShape->Select(); pIShape->get_OLEFormat((Excel::OLEFormat**)&pIOLEFormat); pIOLEFormat->Activate(); 执行这句话的时候挂了,pIOLEFormat是有值的。搞不明白是什么原因。忘大神指教。 VB代码可以实现,没有报错: Dim shpSheet As Shape Set shpSheet = ActiveSheet.Shapes.AddOLEObject(ClassType:="MyChart.Document") shpSheet.OLEFormat.Activate

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧