CoCreateInstance的问题

xin_zzq1 2009-03-19 02:29:27
问题如下:
我用个线程去执行操作时,第一次能够线程执行成功,但第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变量的地址值

搞了半天不知道什么原因啊..高手就救救小弟吧。

...全文
220 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwx300 2009-03-19
  • 打赏
  • 举报
回复
不要调用 CoUninitialize。
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
AfxOleInit()貌似也不行
lwx300 2009-03-19
  • 打赏
  • 举报
回复
在程序类的 InitInstance 中调用:AfxOleInit() 就可以了,好像无需再使用 CoCreateInstance。
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
我用到的工作线程代码如下:

UINT CCESyncDlg::ThreadProc(LPVOID param) //线程函数
{
//数据库的初始化
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: 在此添加控件通知处理程序代码
}

不知道是不是线程有问题?
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
回复oyljerry :
分不够我开个帖子再给你,这个问题实在是困挠我2天多哦
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
2段相同代码是我多写1个··!我用程序结束前用了CoUninitialize();hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices)返回的hr还是E_INVALIDARG,真是晕了!
oyljerry 2009-03-19
  • 打赏
  • 举报
回复
调用了一次CoInitialize,你最后使用完了的时候需要 CoUninitialize 释放一下
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
哦!CoInitialize()调用1次就行了是吧?还有CoUninitialize() 对应CoInitialize()是什么意思?
oyljerry 2009-03-19
  • 打赏
  • 举报
回复
为什么要两段代码重复调用一次,只用一个不就可以了
同时CoUninitialize() 对应CoInitialize()
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
mpIRapiDesktop->Release在我的函数里面已经释放了啊?我感觉不是这个原因吧
oyljerry 2009-03-19
  • 打赏
  • 举报
回复
EnumDevices 用完了以后
mpIRapiDesktop->Release释放掉,下次进入线程,重新创建,再使用
xin_zzq1 2009-03-19
  • 打赏
  • 举报
回复
自己UP!快来人帮帮我呀

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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