c – 检查COM接口是否还活着?

在COM中,如何验证COM对象的指针在另一端仍然有一个有效的对象?

我有一个问题,下面这段代码试图检查m_pServer指针是否仍然存在,但是当该应用程序暴露该接口被杀死时,该位代码会使应用程序崩溃.在使用指针之前,有人可以咨询如何检查指针吗?

if (Failed(m_pServer->StillAlive())) { // do something }

如果m_pServer不再在内存中,则此代码将失败.

编辑:

EXCEPTION:Client40.exe中的0x7728fbae(kernel32.dll)的第一次异常:0x800706BA:RPC服务器不可用.

电话堆:

kernel32.dll!RaiseException()  + 0x58   
    rpcrt4.dll!RpcRaiseException()  + 0x3e  
    rpcrt4.dll!NdrProxyErrorHandler()  + 0x28   
    rpcrt4.dll!NdrProxySendReceive()  + 0xa4    
    rpcrt4.dll!NdrProxySendReceive()  + 0x119   
    rpcrt4.dll!NdrComplexArrayMarshall()  + 0x26d   
--> Client40.exe!SlaveDriver::run()  Line 97 + 0x14 C++  //Runs while loop,to handle requests
    Client40.exe!DThread::tfunc(void * thisptr=0x0047e694)  Line 56 + 0xd   C++
    Client40.exe!_threadstartex(void * ptd=0x01b20e00)  Line 241 + 0xd  C
    kernel32.dll!BaseThreadInitThunk()  + 0x12  
    ntdll.dll!RtlInitializeExceptionChain()  + 0x63 
    ntdll.dll!RtlInitializeExceptionChain()  + 0x36

解决方法

你想在这里做的是根本不可能的.因为m_pServer存在于另一个进程中,所以您确实提出以下问题

Is Process XXX still running?

这在windows(或linux / unix)世界上根本不是一个问题.你永远不能可靠地回答这个问题,因为问题的回答可能会导致无效.进程可以在任何时间点终止,包括您的检查和COM对象的访问之间.

但是这个问题的一个稍微不同的版本是有问题的

Was Process XXX still running?

处理这样的问题的唯一方法是执行有问题的操作,只是期望它失败.如果成功,那么很好,你已经回答了问题的修改版本.如果失败,那么您需要解释失败,以确定操作是否失败或过程消失.

这是正确处理这种情况的唯一办法.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...