COM线程模型 - STA接口 (跨线程传递对象,消息循环)

本文详细探讨了在COM线程模型中,如何正确地将STA对象传递到另一个线程。通过示例代码,解释了违反STA规则导致的问题,强调了使用Marshal和Unmarshal的重要性,以及在STA线程中设置消息循环以确保串行执行的必要性。此外,还指出创建STA对象的线程必须拥有消息循环,以便处理COM系统发送的消息。
摘要由CSDN通过智能技术生成

前面一篇文章讲述了STA客户调用STA对象和MTA客户调用STA对象,其实并不难理解。

现在就来讲一下如何把一个COM对象传递到另外一个线程。

先来看看STA套间里面创建STA对象,并且传递到另外一个线程的情况。

STA客户创建STA对象,然后传递到另外一个线程

我们先改一下代码,这段代码很简单,只是修改上个文章里面的客户代码。其实就是主线程创建一个COM对象,然后传递到线程里面,起5个线程。

// TestCom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <atlbase.h>
#include <thread>
#include <vector>

#include "../MyCom/MyCom_i.h"
#include "../MyCom/MyCom_i.c"


void Test(CComPtr<ICircle>& spCircle)
{
	WCHAR temp[100] = { 0 };
	swprintf_s(temp, L"STA calling thread (used passed in com object): %d\n", ::GetCurrentThreadId());
	OutputDebugStringW(temp);

	CoInitialize(NULL);

	spCircle->Draw(CComBSTR(L"yellow"));

	CoUninitialize();
}

int _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize(NULL);
	WCHAR temp[100] = { 0 };
	swprintf_s(temp, L"Main thread: %d\n", ::GetCurrentThreadId());
	OutputDebugStringW(temp);

	{
		CComPtr<ICircle> spCircle;
		spCircle.CoCreateInstance(CLSID_Circle, NULL, CLSCTX_INPROC);

		spCircle->Draw(CComBSTR(L"red"));

		std::vector<std::thread> vThreads;
		for (int i = 0; i < 5; i++)
		{
			vThreads.push_back(std::thread(Test, spCircle));
		}

		for (auto& t: vThreads)
		{
			t.join();
		}
	}


	CoUninitialize();

	return 0;
}

运行了一下,得到:


好像每一次COM调用都是在客户线程里面。其实我也不知道为什么会这样,但是我觉得这是不对的,这样做的后果是不可预测的。而且根据STA的定义,STA对象应该是串行化的执行同一

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值