微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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?

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

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

原文地址:https://www.jb51.cc/c/112370.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐