Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Мультимедиа устройства


Автор: TomSoyer 21.2.2006, 20:21
Кто нибудь подскажите как получить список Мультимедиа устройств в Visual C++. Покажите на примере.
Заранее благодарен. smile

Автор: AndreySol 21.3.2006, 07:46
Понятие Мультимедиа-устройств включает наверно все от звуковой карты заканчивая джойстиками. Универсальной ф-ции не знаю, вот пример получения устройств звука на DirectShow (нужные хедеры и либы я думаю сам разберешся), добавляет найденные в ListBox:
Код

IEnumMoniker *pEnumCat = NULL;
ICreateDevEnum *pSysDevEnum = NULL;
    
// получаем список доступных устройств записи звука
if(CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **)&pSysDevEnum) != S_OK)
    bReturn = FALSE;
else
{    // Enumerate all filters of the selected category  
    if(pSysDevEnum->CreateClassEnumerator(*clsid, &pEnumCat, 0) == S_OK)
    {
        IMoniker *pMoniker = 0;
        ULONG cFetched = 0;
        VARIANT varName = {0};
        int nFilters = 0;

        // If there are no filters of a requested type, show default string
        if (!pEnumCat)
        {
            m_listenumdev.AddString(TEXT("<< No entries >>\0"));
            return FALSE;
        }
        else
            m_listenumdev.EnableWindow(TRUE);

        // Enumerate all items associated with the moniker
        while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
        {
            IPropertyBag *pPropBag;

            // Associate moniker with a file
            if(pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag) == S_OK)
            {    // Read filter name from property bag
                varName.vt = VT_BSTR;
                if(pPropBag->Read(L"FriendlyName", &varName, 0) == S_OK)
                {
                    // Get filter name (converting BSTR to a CString)
                    CString str(varName.bstrVal);
                    SysFreeString(varName.bstrVal);
                    nFilters++;

                    // Add the category name and a pointer to its CLSID to the list box
                    int nSuccess  = m_listenumdev.AddString(str);
                    int nIndexNew = m_listenumdev.FindStringExact(-1, str);

                    nSuccess = m_listenumdev.SetItemDataPtr(nIndexNew, pMoniker);
       
                    // Cleanup interfaces
                    if(pPropBag)
                    {
                            pPropBag->Release();
                            pPropBag = NULL;
                    }
                }
            }
        }
        if(pEnumCat)
        {
            pEnumCat->Release();
            pEnumCat = NULL;
        }
    }
    else
        bReturn = FALSE;
    pSysDevEnum->Release();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)