检查 COM 接口是否还存在?

2023-11-23

在 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(使用前将#替换为@)

检查 COM 接口是否还存在? 的相关文章

随机推荐

  • UITableViewCell 抛出异常

    我正在将一个项目更新到 iOS 8 并且我的 UITableViewCell 实现之一遇到了这个问题 当前在模拟器上而不是设备上 并且它设置为 iPhone 6 Assertion failure in UITableViewCell se
  • 根据值拆分数组

    自从我不得不处理一些 javascript 代码以来已经很长时间了 我已经很生疏了 我需要像这样分割一个数组 Object 0 gt 2013 04 12 1 gt text 2 gt text 3 gt text 4 gt text 5
  • 如何解决“本地主机意外关闭连接”错误?

    我正在努力通过 Mean Machine JavaScript 堆栈初学者实用指南 作者 Chris Sevilleja 我的问题在第 60 页 根据本书的说明 我创建了一个小问题server js文件 以及package json 并使用
  • 远程跟踪分支和远程分支有什么区别?

    看来我可以从远程存储库上的分支中提取或推送到我正在处理的分支 如果是这样 那么远程跟踪分支的目的是什么 仅仅是为了检查分支并看看它是什么样子吗 看起来远程跟踪分支就像远程分支的镜子 仅供参考 我对 git 相当陌生 但是已经阅读并重新阅读了
  • TMemo 最大宽度

    有没有办法让TMemo将超过1024的文本显示为1行 看看这个简单的代码 procedure TForm1 Button2Click Sender TObject var s string i integer begin s for i 0
  • 了解非阻塞线程同步和Thread.MemoryBarrier

    在这本线程在线书中 http www albahari com threading part4 aspx 有一个例子Thread MemoryBarrier class Foo int answer bool complete void A
  • 欠定系统的非负最小二乘

    考虑以下问题 Find x 1 x 2 x 3 gt 0这样 67 5 60 x 1 90 x 2 120 x 3 60 30 x 1 120 x 2 90 x 3 有没有办法在Python中解这个方程 也许与scipy nnls 使用 s
  • 同时按总和聚合一列并按平均值聚合另一列

    我想在日期框架上使用聚合函数 但对一列求和并取另一列的平均值 这是一个示例数据框 Manager Category Amount SqFt Joe Rent 150 500 Alice Rent 250 700 Joe Utilities
  • 更改通用 Windows 平台中的按钮样式

    我尝试制作一个简单的 C UWP 应用程序 但我不知道当鼠标悬停在按钮上时如何删除灰色背景 我怎么做到这一点 请记住 它是适用于 Windows 10 平台的 UWP 而不是 Windows Phone 8 1 或 WPF 按着这些次序 在
  • Qt 检测计算机何时进入睡眠状态?

    如何检测用户计算机何时进入睡眠状态 笔记本电脑盖子关闭 由于不活动而进入睡眠模式等 我需要这样做来断开用户的 TCP 连接 基本上我们有一个简单的聊天应用程序 我们想让用户离线 Qt 无法检测计算机何时进入睡眠或休眠状态 但有一些依赖于平台
  • 对于数组,为什么会出现 a[5] == 5[a] 的情况?

    正如乔尔在书中指出的那样堆栈溢出播客 34 in C语言 又名 K R C 中提到了数组的这个属性 a 5 5 a Joel 说这是因为指针运算 但我还是不明白 为什么a 5 5 a C 标准定义了 运算符如下 a b a b 所以a 5
  • Django Rest框架-过滤多对多字段

    假设我有一个这样的模型 class Car models Model images models ManyToManyField Image class Image models Model path models CharField ty
  • ZF2 中的会话

    您能告诉我如何在 ZF2 中正确使用会话吗 到目前为止我有这个代码 session gt remember me seconds gt 2419200 use cookies gt true cookie httponly gt true
  • 在列表中创建重复的项目

    我有以下代码来复制列表的成员X times 虽然它有效 但感觉不是特别干净 实时代码示例 http rextester com UIVZVX7918 public static List
  • 如何通过方法参数加锁?

    string Get string key lock sync DoSomething 如果 DoSomething 仅依赖于密钥 我想要密钥依赖锁 我认为它可能是带有同步对象的字典 有没有完整的解决方案 就像真实的例子一样在 ASP NE
  • Instagram API 匹配代码未找到或已被使用

    我在使用 Instagram API 的实时服务器上看到此错误 Error true message Matching code was not found or was already used 我在这里阅读了一些清除缓存的建议 但这并不
  • Laravel:POST 方法返回 MethodNotAllowedHttpException

    我有一个POST路线在我的api php文件 它是这样的 Route group namespace gt api function Route post parent signup ParentController signUp 我正在尝
  • ejb 3.1 中的计时器服务 - 调度调用超时问题

    我使用 Singleton Schedule 和 Timeout 注释创建了简单的示例 以尝试它们是否能解决我的问题 场景是这样的 EJB 每 5 秒调用一次 检查 函数 如果满足某些条件 它将创建单个操作计时器 该计时器将以异步方式调用一
  • JavaFX:将控制台输出重定向到在 SceneBuilder 中创建的 TextArea

    EDIT 4 我创建了一个简单的示例 应该可以让您了解现在发生的情况 现在发生的情况是 每当我单击按钮将 HELLO WORLD 打印到 TextArea 时 程序就会挂起并使用 100 的 CPU Eclipse 控制台面板中也没有输出
  • 检查 COM 接口是否还存在?

    在 COM 中 如何验证指向 COM 对象的指针在另一端仍然具有有效的对象 我遇到一个问题 以下代码尝试检查是否m pServer指针仍然存在 但是当暴露该接口的应用程序被终止时 这段代码会使应用程序崩溃 有人可以建议如何在使用前检查指针吗