用ATL做了一个exe的服务(a.exe)让其它应用程序调用,但有时这些应用程序因为自身的原因非法关闭了(例如内存出错等),这时候,ATL服务还在被占用(表现为在任务管理器中,a.exe程序并没有退出.),请问我该如何在这种情况下退出a.exe程序.
目前已经可以正确检测到其它应用程序的非法关闭,但就是释放不了服务对象,a.exe程序老是退不出来.请高手指点,谢谢.

解决方案 »

  1.   

    a也是个进程,TerminateProcess应该可以
      

  2.   

    我没有把问题讲清楚,问题是这样的:服务是在单机上使用的.
    在提供服务的时候,客户程序创建一个对象时,服务需要分配一定数量的内存,当客户程序删除该对象时,服务释放相关的内存.
    但是,现在有的客户程序因为访问内存出错等非法操作异常关闭了,对应的对象就没有删除,那么服务就会一直占用内存,在服务长时间运行后,服务就会占用大量的内存.
    现在想找一个方法,把这些异常关闭的客户对象删除掉,释放占用的内存.正常来说是应该要求客户程序保证删除这些对象的,但是每个人编写程序的质量都不一样,当把这个服务以SDK的方式提供给第三方开发商的时候,就会遇到问题,所以想更加完善这个服务,使其更智能化,适合不同的用户.强行关闭进程是可以,不过同时也令正在正常使用服务对象的客户程序失去服务对象而出现异常.还有其它更好的方法吗?
    谢谢各位.
      

  3.   

    哦,那么你的问题其实就是服务器检测到客户端断线后,释放内存的意思?想做到这样,只要保证分配内存时能够给每块内存标明所属对象就行了,比如在对应数据结构里加个客户端ID就OK了
      

  4.   

    谢谢各位的意见.对象建立时额外分配的内存可以释放,事实上在检测到客户程序非法关闭的同时服务进程也释放了该客户程序所引用对象的额外分配内存,但是对象引用计数却不会释放,所以到最后服务进程是不会退出的,因为服务对象引用计数不为0.lianglp() 提到"调用释放对象的函数",您所指的"对象"是什么对象呢? 能否在服务进程内释放由客户程序创建的服务对象呢? 如果可以的话,请给出办法,可能会解决问题, 谢谢.
    希望大家可以多多讨论, 谢谢.
      

  5.   

    真是,已检测到所有客户退出了,这时给服务进程发消息,让它退出不就成了吗,还管什么引用记数啊。对于客户引用的对象,如果没有删除,则在进程退出时,对每个对象进行特别删除处理(每建立对象实例时还要保存该对象的一个接口指针备用,这个备用指针不需要增加引用记数,不过这破坏了com技术规范)。所有客户都也退出时,则服务进程只要收到消息WM_QUIT就退出了,在你检测到户客都也退了,调用PostQuitMessage就成了。