问题如下:
我用个线程去执行操作时,第一次能够线程执行成功,但第2次继续执行到:hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);hr得到的值是E_INVALIDARG,如果关掉程序重新执行也是只能执行一次。
部分代码如下: HRESULT hr = S_OK;
clearSession();
addNewInfo(_T("Try to connect a device....."));
CoInitialize(NULL);
// Create an instance of the IRAPIDesktop interface.
hr = CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); if (hr ==0 && mpIRapiDesktop)
{
addNewInfo(_T("CoCreateInstance success"));
}else{
addNewInfo(_T("CoCreateInstance failure"));
return false;
} // Call EnumDevices to obtain an enumeration of connected devices.
hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices); HRESULT hr = S_OK;
clearSession();
addNewInfo(_T("Try to connect a device....."));
CoInitialize(NULL);
// Create an instance of the IRAPIDesktop interface.
hr = CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); if (hr ==0 && mpIRapiDesktop)
{
addNewInfo(_T("CoCreateInstance success"));
}else{
addNewInfo(_T("CoCreateInstance failure"));
return false;
} // Call EnumDevices to obtain an enumeration of connected devices.
hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);
昨天有位大哥说:你第二次调用mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices)的时候,是不是也同样调用了CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); 如果是,那么就有问题了
同一个ID你创建了两次,建议你只创建一次!但如果第2执行的不调用CoCreateInstance函数的话,得不到mpIRapiDesktop变量的地址值搞了半天不知道什么原因啊..高手就救救小弟吧。
我用个线程去执行操作时,第一次能够线程执行成功,但第2次继续执行到:hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);hr得到的值是E_INVALIDARG,如果关掉程序重新执行也是只能执行一次。
部分代码如下: HRESULT hr = S_OK;
clearSession();
addNewInfo(_T("Try to connect a device....."));
CoInitialize(NULL);
// Create an instance of the IRAPIDesktop interface.
hr = CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); if (hr ==0 && mpIRapiDesktop)
{
addNewInfo(_T("CoCreateInstance success"));
}else{
addNewInfo(_T("CoCreateInstance failure"));
return false;
} // Call EnumDevices to obtain an enumeration of connected devices.
hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices); HRESULT hr = S_OK;
clearSession();
addNewInfo(_T("Try to connect a device....."));
CoInitialize(NULL);
// Create an instance of the IRAPIDesktop interface.
hr = CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); if (hr ==0 && mpIRapiDesktop)
{
addNewInfo(_T("CoCreateInstance success"));
}else{
addNewInfo(_T("CoCreateInstance failure"));
return false;
} // Call EnumDevices to obtain an enumeration of connected devices.
hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices);
昨天有位大哥说:你第二次调用mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices)的时候,是不是也同样调用了CoCreateInstance(CLSID_RAPI,
NULL,
CLSCTX_INPROC_SERVER,
IID_IRAPIDesktop,
(void**)&mpIRapiDesktop); 如果是,那么就有问题了
同一个ID你创建了两次,建议你只创建一次!但如果第2执行的不调用CoCreateInstance函数的话,得不到mpIRapiDesktop变量的地址值搞了半天不知道什么原因啊..高手就救救小弟吧。
mpIRapiDesktop->Release释放掉,下次进入线程,重新创建,再使用
同时CoUninitialize() 对应CoInitialize()
分不够我开个帖子再给你,这个问题实在是困挠我2天多哦
{
//数据库的初始化
DBConnectionFactory* pFactory =NULL;
try
{
pFactory=DBConnectionFactory::getIntance();
pFactory->initPool();
}
catch(DatabaseException e)
{
TRACE(e.what());
}
CCESyncDlg* pThread=(CCESyncDlg*)param;
pThread->SyncFun();//实现部分
Sleep(1000);
DBConnectionFactory::releaseInstance();
AfxEndThread(RetThread);
return RetThread;
}void CCESyncDlg::OnBnClickedSync()
{
// TODO: 在此添加控件通知处理程序代码
ExitCode=0;
m_iThread=AfxBeginThread(ThreadProc,(LPVOID)this);
GetDlgItem(IDC_STOP)->EnableWindow(true);
return ;}
void CCESyncDlg::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码 GetDlgItem(IDC_STOP)->EnableWindow(false);
GetDlgItem(IDC_COMEBACK)->EnableWindow(true);
m_iThread->SuspendThread();//挂起线程
}void CCESyncDlg::OnBnClickedComeback()
{
m_iThread->ResumeThread();//恢复线程
GetDlgItem(IDC_STOP)->EnableWindow(true);
GetDlgItem(IDC_COMEBACK)->EnableWindow(false);
// TODO: 在此添加控件通知处理程序代码
}不知道是不是线程有问题?