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.он подсказывает нам «неверный номер порта», может кто-нибудь сказать мне, в чем причина?