調用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
英文地址,請注明出處:http://en.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"跳轉類型"…