大家都知道呼叫任何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,程式也沒有任何異樣??我想知道是為什么??高手在哪里??快來快來!!
uj5u.com熱心網友回復:
哎 高手哪里去了??怎么沒人回復呢轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122236.html
上一篇:c++下載不了?
下一篇:我用Agent++寫的代理端,需要把MIB檔案生成C++代碼,需要用到AgenPro工具,但是需要Licenc誰有agenpro的licence,能否給個用用?
