Почему этот код работает, а этот нет?

258
29 октября 2017, 19:51

Вот код, который работает:

bool TestWMI::getBios(QQueue<QPair<QString, QString> > &records)
{
    HRESULT hres;
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres) && hres != -2147417850)
    {
        return false;                  // Program has failed.
    }
    hres =  CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
        RPC_C_IMP_LEVEL_IDENTIFY,    // Default Impersonation
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
        );

    if (FAILED(hres) && hres != -2147417831)
    {
        CoUninitialize();
        return false;                    // Program has failed.
    }
    IWbemLocator *pLoc_ = NULL;
    QSharedPointer<IWbemLocator> pLoc(pLoc_);
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);
    if (FAILED(hres))
    {
        CoUninitialize();
        return false;                 // Program has failed.
    }
    IWbemServices *pSvc = NULL;
    QSharedPointer<IWbemServices> smartPSvc(pSvc);

    QString str = "ROOT\\CIMV2";
    if (lpRemoteName != "")
        str = lpRemoteName + "\\" + str;
    BSTR bstr = QStringToBSTR(str);
    hres = pLoc->ConnectServer(
        bstr,
        NULL,    // User name
        NULL,     // User password
        NULL,                              // Locale
        NULL,                              // Security flags
        NULL,// Authority
        NULL,                              // Context object
        &pSvc                              // IWbemServices proxy
        );
    SysFreeString(bstr);
    if (FAILED(hres))
    {
        pLoc->Release();
        CoUninitialize();
        return false;                // Program has failed.
    }
    hres = CoSetProxyBlanket(
       pSvc,                           // Indicates the proxy to set
       RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
       COLE_DEFAULT_PRINCIPAL,         // Server principal name
       RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // 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))
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return false;               // Program has failed.
    }
    bstr = QStringToBSTR("WQL");
    BSTR bstr1 =  QStringToBSTR("Select * from Win32_BIOS");
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr,
        bstr1,
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
    SysFreeString(bstr);
    SysFreeString(bstr1);
    if (FAILED(hres))
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return false;               // Program has failed.
    }
    hres = CoSetProxyBlanket(
        pEnumerator,                    // Indicates the proxy to set
        RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
        COLE_DEFAULT_PRINCIPAL,         // Server principal name
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // 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))
    {
        pEnumerator->Release();
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return false;               // Program has failed.
    }
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
            &pclsObj, &uReturn);
        if(0 == uReturn)
        {
            break;
        }
        VARIANT vtProp;
        pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
        records.enqueue(QPair<QString, QString>("Имя БИОСа", QString::fromStdWString(vtProp.bstrVal)));
        VariantClear(&vtProp);
        pclsObj->Release();
        pclsObj = NULL;
    }
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    if( pclsObj )
    {
        pclsObj->Release();
    }
    CoUninitialize();
}

А вот этот код не работает (вылетает на ExecQuery):

bool TestWMI::getBios(QQueue<QPair<QString, QString> > &records)
{
    IWbemLocator *pLoc_ = NULL;
    QSharedPointer<IWbemLocator> pLoc(pLoc_);
    IWbemServices *pSvc_ = NULL;
    QSharedPointer<IWbemServices> pSvc(pSvc_);
    init(pLoc.data(), pSvc.data());
    BSTR bstr = QStringToBSTR("WQL");
    BSTR bstr1 =  QStringToBSTR("Select * from Win32_BIOS");
    IEnumWbemClassObject* pEnumerator = NULL;
    qDebug() << "test_1";
    HRESULT hres = pSvc->ExecQuery(
        bstr,
        bstr1,
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
    qDebug() << "test_2";
SysFreeString(bstr);
SysFreeString(bstr1);
if (FAILED(hres))
{
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return false;               // Program has failed.
}
hres = CoSetProxyBlanket(
    pEnumerator,                    // Indicates the proxy to set
    RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
    RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
    COLE_DEFAULT_PRINCIPAL,         // Server principal name
    RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // 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))
{
    pEnumerator->Release();
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    return false;               // Program has failed.
}
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
while (pEnumerator)
{
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
        &pclsObj, &uReturn);
    if(0 == uReturn)
    {
        break;
    }
    VARIANT vtProp;
    pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
    records.enqueue(QPair<QString, QString>("Имя БИОСа", QString::fromStdWString(vtProp.bstrVal)));
    VariantClear(&vtProp);
    pclsObj->Release();
    pclsObj = NULL;
}
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
if( pclsObj )
{
    pclsObj->Release();
}
CoUninitialize();
bool TestWMI::init(IWbemLocator *pLoc, IWbemServices *pSvc)
{
    HRESULT hres;
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres) && hres != -2147417850)
    {
        return false;                  // Program has failed.
    }
    hres =  CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
        RPC_C_IMP_LEVEL_IDENTIFY,    // Default Impersonation
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
        );

    if (FAILED(hres) && hres != -2147417831)
    {
        CoUninitialize();
        return false;                    // Program has failed.
    }
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);
    if (FAILED(hres))
    {
        CoUninitialize();
        return false;                 // Program has failed.
    }
    QString str = "ROOT\\CIMV2";
    if (lpRemoteName != "")
        str = lpRemoteName + "\\" + str;
    BSTR bstr = QStringToBSTR(str);
    hres = pLoc->ConnectServer(
        bstr,
        NULL,    // User name
        NULL,     // User password
        NULL,                              // Locale
        NULL,                              // Security flags
        NULL,// Authority
        NULL,                              // Context object
        &pSvc                              // IWbemServices proxy
        );
    SysFreeString(bstr);
    if (FAILED(hres))
    {
        pLoc->Release();
        CoUninitialize();
        return false;                // Program has failed.
    }
    hres = CoSetProxyBlanket(
       pSvc,                           // Indicates the proxy to set
       RPC_C_AUTHN_DEFAULT,            // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_DEFAULT,            // RPC_C_AUTHZ_xxx
       COLE_DEFAULT_PRINCIPAL,         // Server principal name
       RPC_C_AUTHN_LEVEL_PKT_PRIVACY,  // 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))
    {
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return false;               // Program has failed.
    }
}

Вот отсюда брал информацию: https://msdn.microsoft.com/ru-ru/library/aa390422(v=vs.85).aspx

READ ALSO
Не получается логическое условие

Не получается логическое условие

ЗдравствуйтеУ меня не получается реализовать логическое условие для двух переменных

237
Копирование контейнеров

Копирование контейнеров

Код взят из книги и отредактирован для использования со стандартными контейнерами, вместо собственных классовОшибка:

379
Перестали работать елементы после JQMIGRATE Wordpress

Перестали работать елементы после JQMIGRATE Wordpress

Всем приветНедавно на сайте перестали работать некоторые элементы - вот этот переключатель и гамбургер меню

310