如何禁止系统使用当前Excel打开文档?

g_feng 2008-05-28 09:20:06
我通过Excel的自动化接口,控制导出数据,现在出现的情况,如果在导出过程中,用户如果双击打开一个Excel文档,系统就会默认用当前的Excel打开,这时候就会导致自动化接口异常,我如何禁止我操作的这个Excel进程,不接受系统打开文档的指令,而产生一个新的Excel进程打开文档?
...全文
203 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
g_feng 2008-06-03
  • 打赏
  • 举报
回复
今天再研究了一下,根据楼上人提供的资料,写了这个
STDMETHODIMP CAppEventListener::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr)
{
switch(dispIdMember){
case 0x00622:
if(pDispParams->cArgs !=2)
return E_INVALIDARG;
else
{
if(pDispParams->rgvarg[1].vt & VT_BYREF)
{
HandleBeforeWorkbookClose( // Call the function.
*(pDispParams->rgvarg[1].ppdispVal),
pDispParams->rgvarg[0].pboolVal);
}
else
{
HandleBeforeWorkbookClose( // Call the function.
(pDispParams->rgvarg[1].pdispVal),
pDispParams->rgvarg[0].pboolVal);
}
}

case 0x0061c:
{
if(pDispParams->rgvarg[1].vt & VT_BYREF)
{
HandleSheetChange( // Call the function.
*(pDispParams->rgvarg[1].ppdispVal),
*(pDispParams->rgvarg[0].ppdispVal));
}
else
{
HandleSheetChange( // Call the function.
pDispParams->rgvarg[1].pdispVal,
pDispParams->rgvarg[0].pdispVal);
}
}
break;
case 0x0061f:
{
if(pDispParams->rgvarg[0].vt & VT_BYREF)
{
HandleWorkbookOpen(*(pDispParams->rgvarg[0].ppdispVal));
}
else
{
HandleWorkbookOpen(pDispParams->rgvarg[0].pdispVal);
}
}
break;
}

return S_OK;
}

STDMETHODIMP CAppEventListener::HandleWorkbookOpen(IDispatch* IWorkBook)
{
//OutputDebugString("HandleSheetChange\n");
CExcelWorkbook WorkBook;
WorkBook.AttachDispatch(IWorkBook);

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant vtSave = VARIANT_FALSE;
//AfxMessageBox(WorkBook.get_FullName());
CString strFileName = WorkBook.get_FullName();
WorkBook.Close(vtSave,covOptional,covOptional);

CExcelApp ExcelApp;
ExcelApp.CreateDispatch(_T("Excel.Application"),NULL);

CExcelWorkbooks WorkBooks;
//Create a new work books and work book
WorkBooks.AttachDispatch(ExcelApp.get_Workbooks(),true);

// OLE Variant for Optional.
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

VARIANT var;
var.vt=VT_NULL ;
WorkBooks.Open(strFileName,var,var,var,var,var,var,var,var,var,var,var,var);
ExcelApp.put_Visible(TRUE);
HRESULT hr = S_FALSE;
return hr;
}

cnp11 2008-06-03
  • 打赏
  • 举报
回复
mark ~~~ 关注
sam88888 2008-06-02
  • 打赏
  • 举报
回复
up
g_feng 2008-05-30
  • 打赏
  • 举报
回复
谁能提供事件ID啊?
  • 打赏
  • 举报
回复
不是有打开事件么?
Excel.Application的WorkbookOpen事件
g_feng 2008-05-29
  • 打赏
  • 举报
回复
晕,没人回复?
g_feng 2008-05-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20071219/10/6269954f-b716-4975-a0df-f588a89a42d4.html
是个好的建议,我会检查程序,谢谢
不过谁能提供,我还是需要excel的事件ID,谁能提供?
g_feng 2008-05-29
  • 打赏
  • 举报
回复
如果在导出过程中,用户如果双击打开一个Excel文档,系统就会默认用当前的Excel打开,这时候就会导致自动化接口异常
====
我想知道这个异常是在手工关闭excel之后出现的还是手工打开excel后立即出现?
====
是手工打开excel文件的时候出现,打开这个excel文件的时候我的程序正在往excel进程里面写入数据
Elysium 2008-05-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20071219/10/6269954f-b716-4975-a0df-f588a89a42d4.html
Elysium 2008-05-29
  • 打赏
  • 举报
回复
如果在导出过程中,用户如果双击打开一个Excel文档,系统就会默认用当前的Excel打开,这时候就会导致自动化接口异常
====
我想知道这个异常是在手工关闭excel之后出现的还是手工打开excel后立即出现?
Elysium 2008-05-29
  • 打赏
  • 举报
回复
这种问题我在delphi下解决过,不过正好相反,是共用一个excel,否则任务管理器里会出现多个excel.exe
g_feng 2008-05-29
  • 打赏
  • 举报
回复
楼上的,我要的不是这个啊
Elysium 2008-05-29
  • 打赏
  • 举报
回复
http://www.excelpx.com/home/show.aspx?id=4338&cid=15
g_feng 2008-05-29
  • 打赏
  • 举报
回复
关于WorkbookOpen的帮助在那里可以找到?我invoke方法需要知道他的id,谁能告诉我?
scq2099yt 2008-05-29
  • 打赏
  • 举报
回复
WorkbookOpen参数中有一个是表示在新窗口中打开
g_feng 2008-05-29
  • 打赏
  • 举报
回复
创建新的容器?能否详细点?
g_feng 2008-05-29
  • 打赏
  • 举报
回复
sorry,我不明白这个WorkbookOpen如何阻止我的excel进程打开excel文件
菜牛 2008-05-29
  • 打赏
  • 举报
回复
怎么会呢,你不要使用诸如ActiveWorkbook之类和当前打开工作簿相关的调用就没有问题。
mr.zhoux 2008-05-29
  • 打赏
  • 举报
回复
需要创建新的容器和服务器,那样就没影响了.
g_feng 2008-05-29
  • 打赏
  • 举报
回复
通过这个事件,如何控制呢?好像又不能返回个什么东西,然后系统就不打开了。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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