2011-10-05 2 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

일부 디버거에서는 API 호출을 중단 할 수 있습니다 (예 : CreateMessageBoxW). 적절한 API에서 디버거가 중단 될 때까지 응용 프로그램을 실행 한 다음 호출 스택을 확인하십시오. OllyDbg이 당신을 속일 수 있다고 생각합니다. –

+0

메시지 상자를 닫지 않고 첨부 된 디버거에 스택이 표시되면 관심있는 스레드를 찾아야합니다. Spy ++와 같은 SDK 도구도이를 지원합니다. –

관련 문제