调用com对象的坑

1、谏言

最近我在弄64位调用32位dll的问题,在几种IPC之间,最后考虑了调用COM 毕竟我们只在windows平台

2、第一坑–修改编译后都需要重新注册,注册表

一直以为只需要编译就好了,结果调用没反应、报错什么的,需要先撤销注册再进行注册

3、第二坑–多线程调用问题

由于我编写的一个操作 是主线程 创建了 com对象后,有个子线程会一直在后台死循环调用最后回调

我最开始按照传入COM指针去进行调用结果是 没反应 也不报错

反复测试后发现是
主线程调用就有反应
子线程调用就没反应

超级奇怪的问题 最后发现是COM多线程调用会出现问题需要一点操作

IGlobalInterfaceTable* GIT = nullptr;// 初始化(通常在主线程)
CoCreateInstance(CLSID_StdGlobalInterfaceTable, nullptr, CLSCTX_INPROC_SERVER,IID_IGlobalInterfaceTable, (void**)&GIT);// 注册接口
GIT->RegisterInterfaceInGlobal(read, IID_Name, &Cookie);

首先我们需要一个IGlobalInterfaceTable 的对象,然后注册具体的com对象,我们再在子线程里面进行的查找COM对象
去调用

HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
IICRead* pICRead = nullptr;
/*DWORD cookie = cookie;*/
reinterpret_cast<IGlobalInterfaceTable*>(GIT)->GetInterfaceFromGlobal((DWORD)Cookie, IID_Name, (void**)&pICRead);

这里 pICRead 就是我们查找出来的COM对象 这个对象和主线程是一样的

而我们要传递给子线程的 一个是IGlobalInterfaceTable 、 一个是 DWORD cookie 这个值很重要

是我们 RegisterInterfaceInGlobal 注册COM时的唯一标识符

子线程结束了需要调用COM的Release 与 CoUninitialize函数清除COM环境

当不再需要GIT时 我们一样需要Release 当然 之前我们还需要取消注册 RevokeInterfaceFromGlobal 参数是之前的那个cookie

4、第四坑–COM很多函数都是成对存在的


CoInitializeEx 与 CoUninitialize

RegisterInterfaceInGlobal 与 RevokeInterfaceFromGlobal

CoCreateInstance 与 Release

等等 只要用到COM对象 就需要清理

5、第五坑–COM读取数据块时

比如 现在我需要读取COM对象的函数 其中是返回一个数据块内部的数据的

我之前直接传入指针,发现返回出来的都是错误信息,一查才知道,有专门的手段

BYTE* pData = NULL;// 用于存储读取的数据
SAFEARRAY* p = SafeArrayCreateVector(VT_UI1, 0, 16);
read->Read_IC_Com(&p); // 读取数据到 SafeArray
SafeArrayAccessData(p, (void**)&pData); // 访问 SafeArray 数据
_memccpy(pDataBuff, pData, 0, 16); // 将 SafeArray 数据复制到 pDataBuff
SafeArrayUnaccessData(p);
SafeArrayDestroy(p);

我们需要使用 SafeArray 相关的东西 进行中转才可以

6、第六坑–多个线程同时调用COM对象可能会导致死锁,程序直接卡死

我写了一个这样的情况

我在com对象中写了个函数内部是死循环 条件 是可以通过另一个函数进行修改 从而达到可以结束的条件

问题就在这里了

我在子线程里面去调用这个COM跑死循环的函数

在主线程里面去调用这个可以结束COM死循环的条件函数

然后程序直接卡死

最后我修改死循环来到COM的调用方解决这个问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92226.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】PyQt 实现 TreeWidget 多级联动选择逻辑,打造素材搜索自定义树形控件!

在开发自己的写作素材管理工具时,我遇到了一个非常典型但又略显棘手的 UI 问题: 💡 如何实现一个“可自由勾选分类标签”的树形结构界面,支持父子节点自动联动勾选,提升用户体验? 虽然 PyQt 的 QTreeWidget 是构建多层分类结构的好帮手,但默认却不具备父子节点的自动级…

27-数据仓库与Apache Hive-2

1.数仓开发语言概述 理论上来说&#xff0c;任何一款编程语言只要具备读写数据、处理数据的能力&#xff0c;都可以用于数仓的开发。比如大家耳熟能详的C、java、Python等&#xff1b; 关键在于编程语言是否易学、好用、功能是否强大。遗憾的是上面所列出的C、Python等编程语言…

软件测试——接口自动化

测试中的自动化分为两类&#xff1a; 1.ui自动化&#xff08;web、移动端&#xff09;2.接口自动化 前面的博客中&#xff0c;我们已经讲解了web端的ui自动化&#xff0c;感兴趣的同学可以去看看&#xff1a;软件测试——自动化测试常见函数_自动化测试代码编写-CSDN博客 今…

Flask一个用户同时只能在一处登录实现

场景&#xff1a;web页面如果多人用同一账号同时登录操作&#xff0c;可能会导致数据等的混乱甚至出现故障。并且可能损害开发者的利益。为此&#xff0c;本篇文章就讲下如何实现同一账户同时仅能一个地方登录操作。 思路&#xff1a;1. 用户登陆时生成token&#xff08;uuid.u…

联发科芯片组曝高危漏洞:越界写入缺陷危及智能手机与物联网设备安全

漏洞概况全球领先的芯片组制造商联发科&#xff08;MediaTek&#xff09;近日发布最新产品安全公告&#xff0c;披露了影响其智能手机、物联网设备及其他嵌入式系统芯片的多项安全漏洞。高危漏洞分析CVE-2025-20696 作为公告披露的首个且最严重的漏洞&#xff0c;该高危缺陷源于…

Android与Flutter混合开发:页面跳转与通信完整指南

Android与Flutter混合开发&#xff1a;页面跳转与通信完整指南 一、Android跳转Flutter页面的实现方式 1. 基础跳转方法 &#xff08;1&#xff09;使用全新引擎跳转&#xff08;每次新建&#xff09; startActivity(FlutterActivity.withNewEngine().initialRoute("/home…

Web存储技术详解:sessionStorage、localStorage与Cookie

一、核心特性对比特性CookielocalStoragesessionStorage存储大小4KB左右5-10MB5-10MB生命周期可设置过期时间永久存储&#xff08;除非手动清除&#xff09;会话期间有效&#xff08;标签页关闭即清除&#xff09;作用域同源的所有窗口同源的所有窗口仅当前标签页自动发送每次H…

3. 为什么 0.1 + 0.2 != 0.3

总结 底层是二进制实现概述 在 JavaScript 中&#xff0c;0.1 0.2 的结果并不是精确的 0.3&#xff0c;而是 0.30000000000000004。这个现象并不是 JavaScript 的“bug”&#xff0c;而是由于浮点数在计算机底层的二进制表示方式导致的精度丢失问题。一、计算机如何表示小数&a…

股票数据接口哪家好?专业评测各主流接口的优势与不足

Python股票接口实现查询账户&#xff0c;提交订单&#xff0c;自动交易&#xff08;1&#xff09; Python股票程序交易接口查账&#xff0c;提交订单&#xff0c;自动交易&#xff08;2&#xff09; 股票量化&#xff0c;Python炒股&#xff0c;CSDN交流社区 >>> 股票…

如何用分布式架构视角理解宇宙稳定性?从精细调参到微服务的类比思考

在调试一段多线程分布式代码时&#xff0c;我忽然意识到一个不合理的事实&#xff1a;为什么现实世界这么稳定&#xff1f;为什么没有“宇宙蓝屏”或“感知崩溃”&#xff1f;为什么每天醒来&#xff0c;我们还能看到同样的物理规律、感知同一个自我&#xff1f;站在程序员的角…

游戏画面总是卡顿怎么办 告别延迟畅玩游戏

玩游戏最让人头疼的问题之一就是画面卡顿&#xff0c;影响操作流畅度与游戏体验。卡顿可能由硬件性能、系统设置、网络延迟等多种因素导致。本文将从不同角度出发&#xff0c;为你提供五个有效解决方法&#xff0c;帮助你快速提升游戏流畅度。 一、降低游戏画质设置 高画质虽然…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码

在现代Web应用中&#xff0c;密码重置功能是用户账户安全体系中不可或缺的一部分。本文将详细介绍如何使用Vue.js前端框架和SpringBoot后端框架实现一个基于邮箱验证的密码重置功能。功能概述本密码重置功能包含以下核心流程&#xff1a;用户输入注册邮箱系统发送验证码到该邮箱…

华为云云产品的发展趋势:技术创新驱动数字化未来

近年来&#xff0c;随着5G、人工智能&#xff08;AI&#xff09;、大数据、物联网&#xff08;IoT&#xff09;和边缘计算等新兴技术的快速发展&#xff0c;全球云计算产业正迎来新一轮变革。作为中国领先的云服务提供商&#xff0c;华为云依托华为集团在ICT&#xff08;信息与…

防御保护07-08

CIDR 可变长子网掩码 VLSM 无类域间路由NET 用少量的私有地址替换大量的共有地址私网地址不能再互联网上去使用、去分配。这里的互联网指的是公网。服务器映射--用来使外部用户能访问私网服务器。静态映射--公网地址和私网地址进行一对一的映射。地址池--中存在多个公网IP地址时…

PDF转图片工具技术文档(命令行版本)

PDF转图片工具技术文档&#xff08;命令行版本&#xff09; 1. 功能概述 本工具是一个基于PyMuPDF库的PDF转图片命令行工具&#xff0c;能够&#xff1a; 通过命令行参数接收PDF文件路径将PDF的每一页转换为PNG格式的图片自动创建输出目录&#xff08;./static&#xff09;保存…

k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC

为响应政策&#xff0c;最近在捣鼓国产化云原生平台的搭建。在搭建过程中遇到了问题记录下来&#xff0c;以备后续查找。 我选用了中国电子云的云平台来搭建K8S集群&#xff0c;选用的技术栈是华为开源的openeulerk8sisulad框架&#xff0c;参考官网文档资料&#xff1a;iSula…

chatgpt plus简单得,不需要求人,不需要野卡,不需要合租,不需要昂贵的价格

ChatGPT Plus&#xff1a;开启智能对话的新纪元 引言&#xff1a;AI助手的时代已经到来 在当今信息爆炸的时代&#xff0c;人工智能助手已经成为我们工作、学习和生活中不可或缺的伙伴。作为AI领域的佼佼者&#xff0c;ChatGPT自问世以来就以其强大的语言理解和生成能力赢得了…

鸿蒙OS 系统安全

鸿蒙OS 系统安全 在搭载 HarmonyOS 的分布式终端上&#xff0c;可以保证“正确的人&#xff0c;通过正确的设备&#xff0c;正确地使用数据”。 • 通过“分布式多端协同身份认证”来保证“正确的人”。 • 通过“在分布式终端上构筑可信运行环境”来保证“正确的设备”。 • …

【Dify学习笔记】:保留原所有数据,升级Dify版本

【Dify学习笔记】&#xff1a;保留原所有数据&#xff0c;升级Dify版本原版本1.4.0 升级最新版1.7.1由于是升级成功后才记录的笔记&#xff0c;没法获取旧页面的版本了&#xff0c;先看下镜像信息&#xff0c;上面的拉取的新容器&#xff0c;下面的之前的旧容器1、关闭旧docker…

微信小程序功能实现:页面导航与跳转

1. 声明式导航&#xff08;navigator组件&#xff09;声明式导航通过在WXML页面中使用 <navigator> 组件来实现页面跳转&#xff0c;使用起来较为直观简便&#xff0c;语法格式如下&#xff1a;<navigator url"目标页面路径" open-type"跳转类型"…