c – 检查COM接口是否还活着?

c – 检查COM接口是否还活着?,第1张

概述在COM中,如何验证COM对象的指针在另一端仍然有一个有效的对象? 我有一个问题,下面这段代码试图检查m_pServer指针是否仍然存在,但是当该应用程序暴露该接口被杀死时,该位代码会使应用程序崩溃.在使用指针之前,有人可以咨询如何检查指针吗? if (FAILED(m_pServer->StillAlive())) { // do something } 如果m_pServer不再在内存中,则此 在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?

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

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

总结

以上是内存溢出为你收集整理的c – 检查COM接口是否还活着?全部内容,希望文章能够帮你解决c – 检查COM接口是否还活着?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存