none
com CreateInstance() COleServerDoc的派生类 多文档 RRS feed

  • 问题

  •       现在做了一个多文档的应用程序,文档类CXXXDoc继承于COleServerDoc。我又做了一个com组件,com组件成员有一个文档类CXXXDoc的智能指针,通过调用CreateInstance函数来打开一个文档。当单独使用应用程序打开一个文档,然后又使用OA调用com组件打开一个文档,然后就死机。这是什么问题?仔细调试了一下程序 ,发现单独启动应用程序打开一个文档的文档计数器为1,OA打开文档的计算器为2,但是关闭文档的时候,都是1,(OA使用的是relese())
    2014年11月17日 10:10

答案

  • 我解决了,是我程序的问题,OA上打开文件的时候,设置自动删除为false,所以文档对象delete不掉。导致不能关闭应用程序。
    2014年11月19日 6:03

全部回复

  • 你好,

    根据你的描述,目前很难判断具体是什么问题导致的。建议你用调试工具进行调试。最好用VS集成的调试工具去调试,下面提供一个教程帮助你方便的调试OLE程序,你可以学习到如何兼顾server 和 client 去调试和发现问题点。

    How To  Debug OLE Applications

    http://support.microsoft.com/kb/154116

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年11月18日 8:37
  • 程序的调用关系如上图,网页加载一个com组件,com组件中启动xxx.exe。

    当点击xxx.exe的关闭按钮时,通过CXXXDoc文档对象发送一个关闭事件,com组件接收到这个事件,进行转发。最终网页会接收这个事件。当网页监听到这个事件时,调用com组件的关闭文档接口函数com1.closeFile(),com组件再调用文档接口智能指针IXXXDoc->CloseFile();

    当com中调用CreateInstance实例化IXXXDoc的智能指针时,调用了CXXXDoc的构造函数,这时候AfxOleLockApp(),文档计数+1;同时调用了COleServerItem*CXXXDoc::OnGetEmbbedItem()函数,这时候AfxOleLockApp(),文档计数再+1。但是调用com1.closeFile()函数时,并没有调用CXXXDoc的析构函数,只是delete COleServerItem对象,这是AfxOleUnlockApp()。

    这时候就出现了一个问题,应用程序主框架点击关闭按钮,由于文档计数器不为0,所以应用程序不能关闭的错误。

    2014年11月18日 9:48
  • 我解决了,是我程序的问题,OA上打开文件的时候,设置自动删除为false,所以文档对象delete不掉。导致不能关闭应用程序。
    2014年11月19日 6:03