Почти ничего не изменял в примере из MSDN. Программа должна выводить список vcm кодеков.
Вырабатывается исключение Access Violation Reading после вызова:
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnum, 0);
Visual Studio 2003.
BOOL CdialogDlg::OnInitDialog()
{
HRESULT hr;
ICreateDevEnum *pSysDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
IMoniker *pMoniker = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
(void**)&pSysDevEnum);
if (FAILED(hr))
{
// Handle the error.
}
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnum, 0);
if (hr == S_OK) // S_FALSE means nothing in this category.
{
while (S_OK == pEnum->Next(1, &pMoniker, NULL))
{
IPropertyBag *pPropBag = NULL;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
VARIANT var;
VariantInit(&var);
hr = pPropBag->Read(L"FriendlyName", &var, 0);
if (SUCCEEDED(hr))
{
int iSel = m_List.AddString((LPCSTR)var.bstrVal);
}
VariantClear(&var);
pPropBag->Release();
pMoniker->Release();
}
}
// SendDlgItemMessage(hDlg, IDC_CODEC_LIST,LB_SETCURSEL, 0, 0);
pSysDevEnum->Release();
pEnum->Release();
return TRUE; // return TRUE unless you set the focus to a control
}
Вот.
Проблема решилась вызовом:
CoInitialize ( NULL );