2011-10-05 74 views
-2
void CCaptureDlg::ListDevice() 
{ 
    ((CComboBox *)GetDlgItem(IDC_COMBO_DEVICE))->ResetContent(); 
    HRESULT hr; 
    IMoniker * pMoniker =NULL; 
    ULONG cFetched; 
    ICreateDevEnum * pDevEnum =NULL; 

    hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, 
     IID_ICreateDevEnum, (void **) &pDevEnum); 
    if (FAILED(hr)) 
    { 
     AfxMessageBox("Couldn't create system enumerator!"); 
     return ; 
    } 

    IEnumMoniker * pClassEnum = NULL; 

    hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0); 
    //hr = pDevEnum->CreateClassEnumerator (CLSID_LegacyAmFilterCategory, &pClassEnum, 0); 
    if (FAILED(hr)) 
    { 
     AfxMessageBox("Couldn't create class enumerator!"); 
     pDevEnum->Release(); 
     return ; 
    } 

    if (pClassEnum == NULL) 
    { 
     AfxMessageBox("No video capture device was detected."); 
     pDevEnum->Release(); 
     return ; 
    } 

    while(S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched))) 
    { 
     IPropertyBag *pBag; 
     hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag); 
     if(SUCCEEDED(hr)) 
     { 
      CString ss; 
      VARIANT var; 
      var.vt = VT_BSTR; 
      hr = pBag->Read(L"FriendlyName", &var, NULL); 
      if (SUCCEEDED(hr)) 
      {     
       ss.Format("%S",var.pbstrVal); 
       ((CComboBox *)GetDlgItem(IDC_COMBO_DEVICE))->AddString(ss); 
       SysFreeString(var.bstrVal); 
      } 
      pBag->Release(); 
     } 
     pMoniker->Release(); 
    } 

    pClassEnum->Release(); 
    pDevEnum->Release(); 

} 

上面是我们的应用程序的源代码,我们用它来列出所有的视频设备,但是这个应用程序在安装了windows xp的某台计算机上不起作用。它会提示我们“无效的端口号”,有人可以告诉我可能的原因是什么?什么可能导致我们的应用程序无法工作? C++

+2

当使用调试器进行调试时,哪条线路因端口号消息而失败? –

回答

1

我只能想到一个错误的视频捕获设备,它显示了这个错误信息,或者你没有提供的代码的另一部分。此代码片段中没有任何内容可以执行此类提示。

如果你有一个奇怪的消息框出来,你可以做的调试是打破调试器而不关闭盒子并检查窗口调用堆栈,以便识别弹出消息的DLL。 。

+0

在某些调试器中,您可以在Windows API调用中断开(例如CreateMessageBoxW)。只需运行你的应用程序,直到调试器在适当的API中断,然后检查调用堆栈。我认为OllyDbg可以帮你解决问题。 –

+0

有可能做一件更简单的事情 - 无需关闭消息框,连接的调试器显示堆栈,您只需找到您感兴趣的线程即可。像Spy ++这样的SDK工具也可以帮助您。 –

相关问题