检查COM接口是否还活着?

Ton*_*ion 10 c++ com

在COM中如何验证指向COM对象的指针在另一端是否仍然具有有效对象?

我有一个问题,下面的一些代码试图检查m_pServer指针是否仍然存活,但是当该应用程序暴露该接口时,这段代码会崩溃应用程序.任何人都可以建议如何在使用之前检查指针?

if (FAILED(m_pServer->StillAlive())) { // do something }
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

CALL STACK:

    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 
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 6

你想在这里做什么根本不可能.因为m_pServer生活在另一个过程中,你真的会问下面的问题

流程XXX仍在运行吗?

这在Windows(或linux/unix)世界中根本不是一个可回答的问题.您永远无法可靠地回答问题,因为在问题得到解答的那一刻,它的结果可能会失效.进程可以在任何时间点终止,包括检查和COM对象的访问.

然而,这个问题略有不同的版本是可以回答的

流程XXX仍在运行吗?

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

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