在 COM 中,如何验证指向 COM 对象的指针在另一端仍然具有有效的对象?
我遇到一个问题,以下代码尝试检查是否m_pServer
指针仍然存在,但是当暴露该接口的应用程序被终止时,这段代码会使应用程序崩溃。有人可以建议如何在使用前检查指针吗?
if (FAILED(m_pServer->StillAlive())) { // do something }
如果 m_pServer 不再位于内存中,则此代码将失败。
EDIT:
例外: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
生活在另一个进程中,你实际上是在问以下问题
进程 XXX 是否仍在运行?
在 Windows(或 linux / unix)世界中,这根本不是一个可以回答的问题。您永远无法可靠地回答问题,因为问题一旦得到回答,其结果就可能无效。进程可以在任何时间点终止,包括在您检查和访问 COM 对象之间。
然而这个问题的一个稍微不同的版本是可以回答的
进程 XXX 仍在运行吗?
解决此类问题的唯一方法是执行有问题的操作并期望它失败。如果成功,那么很好,您已经回答了问题的修改版本。如果失败,那么您需要解释失败以确定操作是否失败或进程消失。
这是正确处理这种情况的唯一方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)