directX枚举系统设备类

简介: void CSysEnumDlg::DisplayFullCategorySet(void)<br>{<br>    USES_CONVERSION;<br><br><br>    HRESULT hr;<br>    IEnumMoniker *pEmCat = 0;<br>    ICreateDevEnum *pCreateDevEnum = NULL;<br>    int nClas
void CSysEnumDlg::DisplayFullCategorySet(void)
{
    USES_CONVERSION;


    HRESULT hr;
    IEnumMoniker *pEmCat = 0;
    ICreateDevEnum *pCreateDevEnum = NULL;
    int nClasses=0;


    // Create an enumerator
    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
                          IID_ICreateDevEnum, (void**)&pCreateDevEnum);
    ASSERT(SUCCEEDED(hr));
    if (FAILED(hr))
        return;


    // Use the meta-category that contains a list of all categories.
    // This emulates the behavior of GraphEdit.
    hr = pCreateDevEnum->CreateClassEnumerator(
                         CLSID_ActiveMovieCategories, &pEmCat, 0);
    ASSERT(SUCCEEDED(hr));


    if(hr == S_OK)
    {
        IMoniker *pMCat;
        ULONG cFetched;


        // Enumerate over every category
        while(hr = pEmCat->Next(1, &pMCat, &cFetched),
              hr == S_OK)
        {
            IPropertyBag *pPropBag;


            // Associate moniker with a file
            hr = pMCat->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
            if(SUCCEEDED(hr))
            {
                VARIANT varCatClsid;
                varCatClsid.vt = VT_BSTR;


                // Read CLSID string from property bag
                hr = pPropBag->Read(L"CLSID", &varCatClsid, 0);
                if(SUCCEEDED(hr))
                {
                    CLSID clsidCat;//枚举所有的设备类


                    if(CLSIDFromString(varCatClsid.bstrVal, &clsidCat) == S_OK)
                    {
                        // Use the guid if we can't get the name
                        WCHAR *wszCatName;
                        TCHAR szCatDesc[MAX_PATH];


                        VARIANT varCatName;
                        varCatName.vt = VT_BSTR;


                        // Read filter name
                        hr = pPropBag->Read(L"FriendlyName", &varCatName, 0);
                        if(SUCCEEDED(hr))
                            wszCatName = varCatName.bstrVal;
                        else
                            wszCatName = varCatClsid.bstrVal;


#ifndef UNICODE
                        WideCharToMultiByte(
                                CP_ACP, 0, wszCatName, -1,
                                szCatDesc, sizeof(szCatDesc), 0, 0);
#else
                        lstrcpy(szCatDesc, W2T(wszCatName));
#endif


                        if(SUCCEEDED(hr))
                            SysFreeString(varCatName.bstrVal);


                        // Add category name and CLSID to list box
                        AddFilterCategory(szCatDesc, &clsidCat);
                        nClasses++;
                    }


                    SysFreeString(varCatClsid.bstrVal);
                }


                pPropBag->Release();
            }
            else
            {
                break;
            }


            pMCat->Release();
        } // for loop


        pEmCat->Release();
    }


    pCreateDevEnum->Release();


    // Update listbox title with number of classes
    SetNumClasses(nClasses);
}
相关文章
|
4月前
|
存储 算法 数据安全/隐私保护
6.5 Windows驱动开发:内核枚举PspCidTable句柄表
在 Windows 操作系统内核中,PspCidTable 通常是与进程(Process)管理相关的数据结构之一。它与进程的标识和管理有关,每个进程都有一个唯一的标识符,称为进程 ID(PID)。与之相关的是客户端 ID,它是一个结构,其中包含唯一标识进程的信息。这样的标识符在进程管理、线程管理和内核对象的创建等方面都起到关键作用。
31 1
6.5 Windows驱动开发:内核枚举PspCidTable句柄表
|
4月前
|
存储 API 开发者
6.7 Windows驱动开发:内核枚举LoadImage映像回调
在笔者之前的文章`《内核特征码搜索函数封装》`中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核`LoadImage`映像回调,在Win64环境下我们可以设置一个`LoadImage`映像加载通告回调,当有新驱动或者DLL被加载时,回调函数就会被调用从而执行我们自己的回调例程,映像回调也存储在数组里,枚举时从数组中读取值之后,需要进行位运算解密得到地址。
32 1
6.7 Windows驱动开发:内核枚举LoadImage映像回调
|
10月前
|
存储 程序员 编译器
windows下的串口编程,串口操作类封装
windows下的串口编程,串口操作类封装
|
Android开发 图形学 网络虚拟化
单设备初始化多个poco与多设备初始化poco
单设备初始化多个poco与多设备初始化poco
387 0
服务开发+虚拟设备完成设备属性变更模拟
为了测试物联网平台数据分析的GIS组件,我们准备模拟一个设备随机在一定范围内(比如在(120±0.05,30±0.01)附近,避免一下子跑到非洲,一下子跑到南极)上报地理信息。由于物联网平台的虚拟设备推送只能定时推送+全取值范围随机数值,不能满足有一定数学表达式的推送策略。如果手上没有设备(尤其是正常设备无法通过热点WIFI接入测试环境),又想在云端持续的模拟设备行为,怎么办呢?通过服务开发+虚拟
1316 0