最近做了一个TCP Server的程序,其中需用使用COM组件,但是tcp 的部分是阻塞的,所以开了一个线程用来专门接收来自客户端的信号,当接收到信号后,再根据情况处理。

按照这个思路,在程序的一开始就调用了CoInitialize(NULL); 来初始化COM 环境。然后开了线程。但是接收完信号后,由主线程去读写变量(调用COM的函数),但是变量怎么读写都不成功。然而函数返回的结果却显示成功了。经过多番查找才发现,是初始化COM环境的函数CoInitialize(NULL); 的问题。使用单线程的时候使用该函数是没有问题的。但是如果使用多线程就需要在主线程里使用CoInitializeEx(NULL , COINIT_MULTITHREADED); 来初始化COM环境。

以下是网上的搜到的:

CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化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 的注意事项的更多相关文章

  1. iOS多线程中,队列和执行的排列组合结果分析

    本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到 ...

  2. VMware 虚拟化编程(8) — 多线程中的 VixDiskLib

    目录 目录 前文列表 多线程注意事项 多线程中的 VixDiskLib 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VMware 虚拟化 ...

  3. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  4. 解决DataGridView在多线程中无法显示滚动条的问题

    在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...

  5. iOS开发——多线程OC篇&多线程中的单例

    多线程中的单例 #import "DemoObj.h" @implementation DemoObj static DemoObj *instance; // 在iOS中,所有对 ...

  6. c#语言-多线程中的锁系统(一)

    介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述.   目录 一:lock.Monitor        1:基础.        2: 作用域.       ...

  7. [C#学习]在多线程中如何调用Winform[转]

    问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如 ...

  8. Java多线程中易混淆的概念

    概述 最近在看<ThinKing In Java>,看到多线程章节时觉得有一些概念比较容易混淆有必要总结一下,虽然都不是新的东西,不过还是蛮重要,很基本的,在开发或阅读源码中经常会遇到,在 ...

  9. Java多线程中变量的可见性

    之所以写这篇博客, 是因为在csdn上看到一个帖子问的就是这个问题. 废话不多说, 我们先看看他的代码(为了减少代码量, 我将创建线程并启动的部分修改为使用方法引用). 1 2 3 4 5 6 7 8 ...

  10. iOS多线程中的单例

    #import "MyHandle.h" static MyHandle *handle = nil; @implementation MyHandle // 传统写法 // 此时 ...

随机推荐

  1. chrome 请停用以开发者

    链接:https://pan.baidu.com/s/1YhWINGlUVyTE5XyBVIGW_Q 提取码:23t2 转载至   https://www.cnblogs.com/it-tsz/p/9 ...

  2. 网络服务之DHCP与FTP

    目录 DHCP 一.DHCP是什么? 二.DHCP的优点 三.DHCP的分配过程 四.DHCP的工作原理 五.DHCP动态获取实验 FTP 一.FTP是什么? 二.FTP的数据连接模式 三.svftp ...

  3. 模态框:JavaScript+css

    solution one: JavaScript,单个模态框展示: modal_tools.js window.onload = function () { //js默认加载页面方法 // get m ...

  4. 你不知道的JavaScript--作用域

                                                              用简单的代码 展示代码的魅力 1.在浏览器里,在全局范围内,this等价于windo ...

  5. 专业家庭影音服务器-软件平台及安装-Ubuntu+Docker+Portainer+宝塔linux面板

    服务器安装什么系统呢? 如果说操作简单考虑和黑群晖(应为没有买群晖的硬件,自己没法装正版系统), 还是各种NAS系统,TrunNAS.URaidn OS,...一查种类还真的不少,简直是选择恐惧症,总 ...

  6. 创建Django项目的两种方式

    有两种方式可创建django项目: 方式一:命令行 1. cmd 命令行,进入到指定的目录,执行:django-admin startproject mydiary [mydiary 为项目名],创建 ...

  7. Java中File类

    File类是java.io包中唯一代表磁盘文件本身的对象.File类的对象主要用来获取文件本身的一些信息,如文件所在目录.文件长度.读写权限等. 一. 文件的创建与删除 通常使用以下三种方法来创建一个 ...

  8. vins-fusion(1)安装编译

    https://github.com/HKUST-Aerial-Robotics/VINS-Fusion https://blog.csdn.net/haner27/article/details/1 ...

  9. int 和vachar后面的数字代表的含义

    在创建数据表的时候,我们经常会给每一个字段设置一个长度,例如:int(5).varchar(10) 等等,但是他们代表的意思是什么呢?是该列允许存储值的最大宽度吗? 场景1:为什么我设置成 int(1 ...

  10. 20220718 第七组 陈美娜 java

    如果把变量直接声明在类里:成员变量(全局变量)成员变量->属性 如果把变量声明在某个方法里:局部变量 public:访问权限修饰符,后面讲 void:没有返回值 run():方法名,标识符 {} ...