随笔 - 41  文章 - 2 评论 - 0 阅读 - 52537
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

        最近做了一个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

posted on   lazybee  阅读(541)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示