Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 嗯。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。您必须使用WMI吗?是否使用卷管理API执行此操作。在MSDN中搜索“WMI驱动器_Windows_Visual C++_Com_Wmi - Fatal编程技术网

Windows 嗯。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。您必须使用WMI吗?是否使用卷管理API执行此操作。在MSDN中搜索“WMI驱动器

Windows 嗯。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。您必须使用WMI吗?是否使用卷管理API执行此操作。在MSDN中搜索“WMI驱动器,windows,visual-c++,com,wmi,Windows,Visual C++,Com,Wmi,嗯。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。您必须使用WMI吗?是否使用卷管理API执行此操作。在MSDN中搜索“WMI驱动器号”也很有用。这看起来不错,但我一直在用另一种方法执行此操作。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。 std:


嗯。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。您必须使用WMI吗?是否使用卷管理API执行此操作。在MSDN中搜索“WMI驱动器号”也很有用。这看起来不错,但我一直在用另一种方法执行此操作。。不一定是您建议的那个,我的应用程序在测试时崩溃了,因为某些系统缺少一些dll。。。使用WMI不会使应用程序崩溃,所以这就是我选择这种方式的原因,我还将尝试您建议的方式。
 std::vector<CString> GetPartitionsVector(bool bCoInit   = false  )
{
    std::vector<CString> partVect;
    HRESULT hres = NULL;
    if(bCoInit)
    {

        hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
        if (FAILED(hres))
        {
            goto end_routine;
        }

        hres =  CoInitializeSecurity(
            NULL, 
            -1,                          // COM authentication
            NULL,                        // Authentication services
            NULL,                        // Reserved
            RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
            RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
            NULL,                        // Authentication info
            EOAC_NONE,                   // Additional capabilities 
            NULL                         // Reserved
            );


        if (FAILED(hres))
        {
            goto end_routine;
        }
    }


    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0, 
        CLSCTX_INPROC_SERVER, 
        IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))
    {
        goto end_routine;
    }


    IWbemServices *pSvc = NULL;

    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
        NULL,                    // User name. NULL = current user
        NULL,                    // User password. NULL = current
        0,                       // Locale. NULL indicates current
        NULL,                    // Security flags.
        0,                       // Authority (e.g. Kerberos)
        0,                       // Context object 
        &pSvc                    // pointer to IWbemServices proxy
        );

    if (FAILED(hres))
    {
        goto end_routine;
    }

    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
        );

    if (FAILED(hres))
    {
        goto end_routine;
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_DiskPartition"),                // Win32_DiskPartition
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

    if (FAILED(hres))
    {
        pSvc->Release();
        pLoc->Release();

        goto end_routine;
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------

    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;

    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
            &pclsObj, &uReturn);

        if(0 == uReturn)
        {
            break;
        }

        VARIANT vtProp;

        // Get the value of the Name property
        hr = pclsObj->Get(L"BootPartition", 0, &vtProp, 0, 0);

        if(!vtProp.boolVal)     //if this is not boot partition, get some more
        {
            hr = pclsObj->Get(L"BootPartition", 0, &vtProp, 0, 0);
            if(FAILED(hr))
            {
                //log here
            }
            hr = pclsObj->Get(L"SystemName", 0, &vtProp, 0, 0);
          if(!FAILED(hr))
              partVect.push_back(vtProp.bstrVal);
        }




        VariantClear(&vtProp);
        pclsObj->Release();
    }

    // Cleanup
    // ========

    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();



end_routine:

    if(bCoInit)
    {
        CoUninitialize();
    }
    return partVect;
}