多线程调用com接口
大家都知道调用任何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,程序也没有任何异样??我想知道是为什么??高手在哪里??快来快来!!