在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?
处理这样的问题的唯一方法是执行有问题的操作,只是期望它失败.如果成功,那么很好,你已经回答了问题的修改版本.如果失败,那么您需要解释失败,以确定操作是否失败或过程消失.
这是正确处理这种情况的唯一办法.