问题如下: 
我用个线程去执行操作时,第一次能够线程执行成功,但第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变量的地址值搞了半天不知道什么原因啊..高手就救救小弟吧。 

解决方案 »

  1.   

    EnumDevices 用完了以后
    mpIRapiDesktop->Release释放掉,下次进入线程,重新创建,再使用
      

  2.   

    mpIRapiDesktop->Release在我的函数里面已经释放了啊?我感觉不是这个原因吧
      

  3.   

    为什么要两段代码重复调用一次,只用一个不就可以了
    同时CoUninitialize() 对应CoInitialize()
      

  4.   

    哦!CoInitialize()调用1次就行了是吧?还有CoUninitialize() 对应CoInitialize()是什么意思?
      

  5.   

    调用了一次CoInitialize,你最后使用完了的时候需要 CoUninitialize 释放一下
      

  6.   

    2段相同代码是我多写1个··!我用程序结束前用了CoUninitialize();hr = mpIRapiDesktop->EnumDevices(&mpIRapiEnumDevices)返回的hr还是E_INVALIDARG,真是晕了!
      

  7.   

    回复oyljerry :
     分不够我开个帖子再给你,这个问题实在是困挠我2天多哦
      

  8.   

    我用到的工作线程代码如下: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: 在此添加控件通知处理程序代码
    }不知道是不是线程有问题?
      

  9.   

    在程序类的 InitInstance 中调用:AfxOleInit() 就可以了,好像无需再使用 CoCreateInstance。