VC通过OLE/COM对象操作EXCEL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC通过OLE/COM对象操作EXCEL相关的知识,希望对你有一定的参考价值。

vc通过excel的COM接口来操作EXCEL时,功能比较强大,可以对EXCEL进行表格的几乎所有操作,在操作时如果利用SAFEARRAY数组,性能也会大幅度提升。

但是有一个问题,在操作完EXCEL后,资源释放以后,EXCEL进程怎么也关不掉!!!我尝试了很多种办法,都无效,最后无意间发现导致EXCEL进程不能关闭的原因是,EXCEL中加载了第三方的COM组件(我的是金山杀毒的EXCEL加载项引起的),查找EXCEL加载项的方法是(excel2010版本):

点击【文件】---【选项】---【加载项】,在右侧窗口就可以“查看和管理Microsoft Office加载项"。


但知道这个原因,在程序使用之前,先手动这样操作效果也非常不好!我写好的程序也不能一台电脑一台电脑的检查及这样处理,并且不可预知各个电脑到底是由哪个加载项引起!这个方法因此断不可行!

后面在查找EXCEL指针_Application中查应的函数时,发现有一个函数可以处理,具体操作原理是:

查找当前EXCEL应用程序窗口的句柄(hwnd),然后根据hwnd找到此程序的进程ID,最后根据进程ID结束进程。比如定义excel应用程序的指针是(_Application xlsApp),具体操作方法如下:

    long id=0;     //句柄标识

    long pid=0;    //进程pid

     HANDLE hProcess=NULL;    //进程的句柄

    1、long id=m_xlsApp.GetHwnd();    //根据GetHwnd()方法获取此应用程序的句柄id

    2、GetWindowThreadProcessId((HWND)id,&pid);然后由应用程序的句柄id,获取进程的pid
    3、HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid); //获取当前进程在系统中的句柄

 TerminateProcess(hProcess,1);    //根据hProcess结束当前应用程序的进程

    第3步的结束程序也可以用以下函数代替:

     1)  SendMessage(m_xlsApp.GetHwnd(),WM_CLOSE,0,0);

    2) str.Format(_T("cmd /c   tskill %d"),pid); winExec(str,SW_HIDE)

 


本文出自 “爱我所爱” 博客,请务必保留此出处http://tommy.blog.51cto.com/113624/1939631

以上是关于VC通过OLE/COM对象操作EXCEL的主要内容,如果未能解决你的问题,请参考以下文章

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

vs2012 Office2013 读写excel文件

ActiveX和OLE,COM的区别_择自网络

使用 VC++ 创建 Excel 自动化插件

如何在 VC++ 6 中跟踪某个对象

delphi 如何写入Excel