多线程调用com接口

EasonTG 2014-05-15 09:40:51
大家都知道调用任何COM组件之前,你必须首先初始化COM套件环境,即调用CoInitialize或CoInitializeEx;COM套件分为两种模式,单线程套件(STA)和多线程套件(MTA)。
进入注册表我发现我调用的com接口的ThreadingModel=both,虽然我自己的程序没有错误,但是我很疑惑,不是说要在不同的线程中进行CoInitialize吗?为什么我在另一个线程中没有使用CoInitialize 程序也没有问题呢??具体程序如下:
在主线程的构造函数中初始化
CFaceRecognizeCtrl::CFaceRecognizeCtrl()
: m_ZkFace(NULL)
{
CoInitialize(NULL);

HRESULT hr = S_OK;
hr = m_ZkFace.CreateInstance(__uuidof(CZKEM));//创建com对象

if(hr==S_FALSE||NULL==m_ZkFace)
{
AfxMessageBox(_T("初始化失败!"));
}
}

LONG CFaceRecognizeCtrl::StartLoadUserFace(LONG m_lMachineNum)//在函数中开启另一个线程
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());


if(NULL==m_ZkFace)
{
m_lErrorCode=1000;
return FALSE;
}

m_lMachineNumber=m_lMachineNum;

// 开启线程
if (m_hThread == NULL)
{
DWORD dwThreadId = 0;
m_hThread = CreateThread(NULL, 0, &__ThreadReadUserFace, this, CREATE_SUSPENDED, &dwThreadId);
}
if(m_hThread!=NULL)
{
ResumeThread(m_hThread);
return TRUE;
}
else
return FALSE;
}

//线程函数
DWORD WINAPI ThreadReadUserFace(LPVOID lpParam)
{
CFaceRecognizeCtrl* pCRC = static_cast<CFaceRecognizeCtrl*>(lpParam);

while(1)
{
if (pCRC != NULL)
{
pCRC->__ReadUserFace();
}
}
return TRUE;
}

void CFaceRecognizeCtrl::__ReadUserFace()
{
if(NULL==m_ZkFace)
{
return;
}

if(!m_ZkFace->EnableDevice(m_lMachineNumber,FALSE {
return;
}

}


在_ReadUserFace()函数中我依然使用的主线程的com对象m_ZkFace,程序也没有任何异样??我想知道是为什么??高手在哪里??快来快来!!
...全文
496 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
EasonTG 2014-05-15
  • 打赏
  • 举报
回复
哎 高手哪里去了??怎么没人回复呢

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧