COM + 等待单对象

2024-02-11

在过去的几天里,我一直在努力为一个应用程序找到一个好的架构,经过一番研究后,我终于陷入困境,原因就是 COM。

相关应用程序将有多个 GUI 线程,它们将为工作线程安排工作项。工作线程将通过 CoInitialize(NULL); 初始化 COM,创建一些 COM 组件,然后进入一个等待 WaitForMultipleObjects(2, ...) 的循环(ExitEvent - 指示应用程序正在关闭,ManualResetEvent - 指示实际上有工作项需要处理),并且在成功等待后,将处理这些项并将它们发送回 GUI 线程。如果队列为空,ManualResetEvent 将在工作线程内部重置,并将发生在队列关键部分内。

问题是,像往常一样,COM 让一切都变得困难 1000 倍……

如果我理解正确的话,CoInitialize(NULL);创建一个隐藏窗口,在 WaitForSingle/MultipleObject/s 期间发布的任何消息都可能导致死锁。

因此,我需要调用 MsgWaitForMultiple 对象。如果消息没有正确泵送,这反过来可能会失败。不幸的是,我不太明白如何以正确的方式泵送它们。我必须创建自己的消息循环吗?如果 COM 决定创建消息框,应用程序会崩溃吗?

到目前为止,我似乎必须这样进行?

HANDLE hEvents[2] = {};

int ThreadProc(LPVOID lpParam) {
    int nRetVal = 0;

    CoInitialize(NULL);

    CComPtr<ISomething> smthn;
    smthn.CoCreateInstance(...);

    MSG msg = {};

    bool bRun = true;

    while(bRun) {
        while(PeekMessage(&msg, ??NULL/-1??, 0, 0, PM_REMOVE)) { /*Which one here?*/
            if(msg.Message == WM_QUIT) {
                bRun = false;
                nRetVal = msg.wParam;
                break;
            }
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if(MsgWaitForMultipleObjects(2, &hEvents, ...)) {
            if(exitevent) { bRun = false; nRetVal = 0; }
            else if(processevent) { [processdata] }
        }
    }

    smthn.release();

    CoUninitialize();
    return nRetVal;
}

但是隐藏窗口、消息框呢?我是否走在正确的道路上?


只需使用CoWaitForMultipleHandles http://msdn.microsoft.com/en-us/library/ms680732%28v=vs.85%29.aspx并且它将在隐藏的 COM 窗口上进行必要的消息泵送以实现线程间同步。

隐藏的窗户是一流的OleMainThreadWndClass with OleMainThreadWndName作为标题,但在 win9x 上它的类是WIN95 RPC Wmsg。它是隐藏的,这意味着你不能直接使用EnumThreadWindows找到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

COM + 等待单对象 的相关文章

随机推荐

  • 无法将“mysql2/promise”导入 Node.js 13 / 14 上的 ES 模块 (MJS)

    从 CommonJS 迁移时 cjs 到 ES 模块 mjs 我遇到了将命名空间 CJS 导入 MJS 的问题 import mysqlPromise from mysql2 promise 返回错误 错误 ERR MODULE NOT F
  • R 集群导出错误“未找到对象”

    有人可以帮助我理解为什么我的程序会产生此错误吗 从这里可以看出 pay freq 显然是环境的一部分 那么为什么找不到它呢 语法与 ts 相同 可以毫无问题地找到它 大圆圈部分覆盖了单词功能 小圆圈部分覆盖了单词情节 cf pro lt f
  • ASP.NET requestValidation 4.5 和 WIF

    我有一个 ASP NET MVC 应用程序 启用了 Windows Identity Foundation 身份验证 并使用 ADFS 作为 STS 该应用程序现在位于带有 MVC 4 的 NET 4 5 上 当我将 ASP NET req
  • 如何实现 boost::variant 派生类?

    我已经尝试了几个小时来编写一个派生类boost variant 但我不明白问题是什么 我不明白编译错误意味着什么 实施清洁的规则是什么boost variant派生类 include
  • 如何批量分割numpy数组?

    听起来很容易 但我不知道该怎么做 我有 numpy 二维数组 X 1783 30 我想将它们分成 64 个批次 我这样编写代码 batches abs len X BATCH SIZE 1 It gives 28 我正在尝试批量预测结果 所
  • 如何使用rank函数获取hive中的最新记录

    我在配置单元中有下表 其中包含列 ID 名称和时间戳 根据下面的时间戳应该输出最新记录 你不需要为此排名 您的输出描述如下 select t from t order by t transaction time desc limit 3 E
  • mingw64 下 GetACP 链接错误 (mingw-builds)

    我试图构建 gdal 1 10 0 http trac osgeo org gdal wiki DownloadSource http trac osgeo org gdal wiki DownloadSource 使用 mingw64 来
  • android.database.sqlite.SQLITeException:没有这样的表:编译时管理:INSERT INTO ...等

    我正在尝试在数据库中添加另一个表 第一个表已成功创建 并且数据也已成功插入 但是当我尝试添加另一个表 然后插入数据时 我收到此错误 在将 INSERT 编译到 等时没有这样的表 我在 google 和 stackoverflow 中进行了搜
  • 只为一个页面设置cookie,如果用户浏览其他页面,则不会发送回服务器

    cookie 只能设置 获取一页吗 如果我浏览与该页面位于同一根域上的其他页面 则 cookie 不会发送到服务器 或者只是根本不发送 但仍然可以通过 jQuery cookie 插件访问 我的意思是cookie仅在客户端 最好不要将它们发
  • ios6.0上ZxingWidget存档错误

    我尝试存档 ZxingWedget 演示 scanTest 编译就ok了 它可以在模拟器上运行 但在ios6 0上不能完全存档 这是错误 Stripping Users ganguo Library Developer Xcode Deri
  • 如何在 tkinter 中自动换行小部件?

    几年前我在android中看到过这个函数 布局 但我记不起这个函数名是什么 我需要一个自动替换小部件 如果新小部件的宽度与窗口末尾相交 我想将该小部件移至新行 以下是我的预期输出 我认为 获取宽度并计算新的小部件位置就可以解决这个问题 但是
  • JavaFX 实时时间和日期

    我当前正在使用 JavaFx 构建一个应用程序 该应用程序具有额外的功能 可以在场景的右上角显示当前日期和时间 由于我是 JavaFX 新手 我不知道如何实现这一点 我尝试在 swing 中使用旧代码 但出现 IllegalStateExc
  • 一次对多个 YuvImage 使用 compresstojpeg 时内存不足

    我正在构建一个缓冲应用程序N相机帧 当用户点击按钮时 它会使用所有保存的帧应用效果来保存照片 我正在保存照片并在异步任务 当我执行它时 我会从屏幕上删除所有内容 只留下一个TextView显示保存照片的进度 目前异步任务 doInBackg
  • 使用 useState 和 useContext React Hooks 持久化 localStorage

    我已经设置了一个提供程序来为用户共享一些状态useContext 因此 我试图利用本地存储来保存用户图像 头像等 的一些状态 首先 我尝试保留用户的头像 本质上是从 Express 中保存他们的 ID 然后在调用 Cloudinary 一种
  • 返回 PostgreSQL 中插入的行

    我目前正在开发一个报告生成 servlet 它聚合来自多个表的信息并生成报告 除了返回结果行之外 我还将它们存储到报告表中 以便以后不需要重新生成它们 并且如果擦除它们所提取的表 它们将持续存在 为了执行后者 我有一个以下形式的语句 注意
  • C# 中是否有存储优化的稀疏矩阵实现?

    有没有优化过的存储稀疏矩阵 http en wikipedia org wiki Sparse matrix在C 中的实现 有Math NET http www mathdotnet com 它有一些备用矩阵实施 http nmath so
  • 在Python中将微秒增量转换为各自转换的最佳方法?

    我目前有一个预定义的字典 忽略字母 不过 我希望转换更加稳健 假设输入 33000000 微秒并知道转换为 33 秒 然后 一分钟以上但一小时以下的任何微秒输入都会显示为分钟等 是否可以在不需要此预定义字典的情况下获得此编码 最好是一个函数
  • 如何解决python中pydicom的编码问题

    这是代码 import dicom ds dicom read file FILE PATH print ds Error LookupError unknown encoding ISO 2022 IR 100 当使用 pydicom 查
  • 冻结 EPPlus 中的列(Excel 拆分函数)

    我一直在使用 EPPlus 来生成 Excel 文件 以满足我的项目要求我进行的导出数量 他们想要的大多数导出往往与他们遗留系统中已有的导出完美匹配 然而 其中之一 他们想要不同 他们希望它看起来与遗留系统的导出之一一模一样在他们完成一些典
  • COM + 等待单对象

    在过去的几天里 我一直在努力为一个应用程序找到一个好的架构 经过一番研究后 我终于陷入困境 原因就是 COM 相关应用程序将有多个 GUI 线程 它们将为工作线程安排工作项 工作线程将通过 CoInitialize NULL 初始化 COM