【发布时间】:2011-11-21 21:19:55
【问题描述】:
在 COM 中,如何验证指向 COM 对象的指针在另一端仍然具有有效对象?
我有一个问题,以下代码尝试检查m_pServer 指针是否仍然存在,但是当暴露该接口的应用程序被终止时,这段代码会使应用程序崩溃。任何人都可以建议在使用之前如何检查指针吗?
if (FAILED(m_pServer->StillAlive())) { // do something }
如果 m_pServer 不再在内存中,此代码将失败。
编辑:
异常: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
【问题讨论】:
-
应用程序究竟是如何崩溃的?
-
在上面提到的那一行抛出如下异常: 0x800706BA: RPC 服务器不可用。我可以防止这种情况吗?
-
不清楚为什么会抛出异常。进入代码 (F11) - 也许有一些包装器代码会引发异常。你是#import .tlb 还是 .dll 文件?
-
当我杀死暴露这个 m_pServer 接口的应用程序时抛出异常,现在这个应用程序试图调用一个不再可用的方法。我正在尝试防止引发此异常。
-
客户端进程中某些代码抛出异常。我在问你该代码是什么以及它究竟是如何引发异常的,因为这对于解决你的问题至关重要。