多线程中使用COM 的注意事项
最近做了一个TCP Server的程序,其中需用使用COM组件,但是tcp 的部分是阻塞的,所以开了一个线程用来专门接收来自客户端的信号,当接收到信号后,再根据情况处理。
按照这个思路,在程序的一开始就调用了CoInitialize(NULL); 来初始化COM 环境。然后开了线程。但是接收完信号后,由主线程去读写变量(调用COM的函数),但是变量怎么读写都不成功。然而函数返回的结果却显示成功了。经过多番查找才发现,是初始化COM环境的函数CoInitialize(NULL); 的问题。使用单线程的时候使用该函数是没有问题的。但是如果使用多线程就需要在主线程里使用CoInitializeEx(NULL , COINIT_MULTITHREADED); 来初始化COM环境。
以下是网上的搜到的:
CoInitialize指明以单线程方式创建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
CoInitialize(NULL)的使用是以线程作为划分的,一个线程里如果使用了组件,这个线程在使用组件之前就要调用这句;
换言之如果在线程1调用了CoInitialize(NULL),但是线程2没有调用,则线程2使用组件的时候就会出问题;
例如,操作A要用到组件
线程1调用了CoInitialize(NULL),操作A成功,获得了正确的结果;
线程2没有调用CoInitialize(NULL),操作A也成功了,但是没有得到正确的结果,用GetLastError获得的是“操作正常完成”的结果;
后线程2在操作A之前调用了CoInitialize(NULL),操作A成功,获得了正确的结果。
因此注意组件使用的线程中是否调用了CoInitialize(NULL)初始化了组件。
参考:
https://blog.csdn.net/haizhongyun/article/details/7625625?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
https://blog.csdn.net/lobster_wang/article/details/118330864
https://blog.csdn.net/qinuo_2010/article/details/104760303?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
多线程中使用COM 的注意事项的更多相关文章
- iOS多线程中,队列和执行的排列组合结果分析
本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...
- VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
目录 目录 前文列表 多线程注意事项 多线程中的 VixDiskLib 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化 ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- 解决DataGridView在多线程中无法显示滚动条的问题
在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...
- iOS开发——多线程OC篇&多线程中的单例
多线程中的单例 #import "DemoObj.h" @implementation DemoObj static DemoObj *instance; // 在iOS中,所有对 ...
- c#语言-多线程中的锁系统(一)
介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. ...
- [C#学习]在多线程中如何调用Winform[转]
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...
- Java多线程中易混淆的概念
概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...
- Java多线程中变量的可见性
之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...
- iOS多线程中的单例
#import "MyHandle.h" static MyHandle *handle = nil; @implementation MyHandle // 传统写法 // 此时 ...
随机推荐
- React脚手架的使用
初始化项目 npx create-react-app my-app // 或 npm init react-app my-app // 或 yarn create react-app my-app 启 ...
- JavaSE——面向对象(类与对象)
package com.zhao.test1; public class GirlFriend { //属性 String name; int age; String gender; //行为 pub ...
- openwrt从gitee pull代码并编译go项目
安装ssh opkg update # openssh-keygen 可以用来生产密钥 opkg install openssh-keygen # 连接其他服务器 opkg install opens ...
- vue-webpack代理
baseUrl 改为 '/api'
- demo----日常报错
yolov5:报错1:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized ...
- QT窗口显示的风格设置
在main.cpp中添加头文件#include <QStyleFactory> 然后在QApplication a(argc, argv);后添加 a.setStyle(QStyleFac ...
- Windows server 2016 域服务1之创建域
谁知道以后会不会用到呢,总不能现学不是,写下来以后也许用的上. 本文为自己实验操作,工作环境是否与之相同本人并不清楚,步骤中详略参半,原理不会在这里说,因为我也不清楚. 1.首先安装域服务,选择添加角 ...
- DCS-WORLD 数据获取
任务: 获取DCS-World的姿态数据,发送到6自由度平台. 过程: 1.获取dcs-bios https://github.com/DCSFlightpanels/dcs-bios 2.复制DCS ...
- Jetpack compose初尝试
2021/07/29 Jetpack compose1.0正式发布,已经可以在生产环境中使用了. 下面的内容为根据官方教程尝试的总结,上手没难度,而且也不需要配置什么环境. Android 开发者 ...
- 【LeetCode_15】——三数之和
今天做了力扣中的一道经典题:三数之和.这题思路倒是很快想到,调逻辑可把我调得够呛,这也正说明我的刷题思维远远不够,比起我室友半个月刷300多题的思维差远了...革命尚未成功,同志仍需努力. 原题链接: ...