The following code fails when ExecMethod is called. Can anyone pinpoint what I am doing wrong?

来源:互联网 发布:leetcode题解 java版 编辑:程序博客网 时间:2024/06/05 08:55
原文地址:http://stackoverflow.com/questions/4029494/how-to-call-wmi-function-correctly#define _WIN32_DCOM#include <iostream>using namespace std;#include <comdef.h>#include <Wbemidl.h># pragma comment(lib, "wbemuuid.lib")int main(int iArgCnt, char ** argv){    HRESULT hres;    // Step 1: --------------------------------------------------    // Initialize COM. ------------------------------------------    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);     if (FAILED(hres))    {        cout << "Failed to initialize COM library. Error code = 0x"              << hex << hres << endl;        return 1;                  // Program has failed.    }    // Step 2: --------------------------------------------------    // Set general COM security levels --------------------------    // Note: If you are using Windows 2000, you must specify -    // the default authentication credentials for a user by using    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----    // parameter of CoInitializeSecurity ------------------------    hres =  CoInitializeSecurity(        NULL,         -1,                          // COM negotiates service        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))    {        cout << "Failed to initialize security. Error code = 0x"              << hex << hres << endl;        CoUninitialize();        return 1;                      // Program has failed.    }    // Step 3: ---------------------------------------------------    // Obtain the initial locator to WMI -------------------------    IWbemLocator *pLoc = NULL;    hres = CoCreateInstance(        CLSID_WbemLocator,                     0,         CLSCTX_INPROC_SERVER,         IID_IWbemLocator, (LPVOID *) &pLoc);    if (FAILED(hres))    {        cout << "Failed to create IWbemLocator object. "             << "Err code = 0x"             << hex << hres << endl;        CoUninitialize();        return 1;                 // Program has failed.    }    // Step 4: ---------------------------------------------------    // Connect to WMI through the IWbemLocator::ConnectServer method    IWbemServices *pSvc = NULL;    // Connect to the local root\cimv2 namespace    // and obtain pointer pSvc to make IWbemServices calls.    hres = pLoc->ConnectServer(        _bstr_t(L"ROOT\\wmi"),         NULL,        NULL,         0,         NULL,         0,         0,         &pSvc    );    if (FAILED(hres))    {        cout << "Could not connect. Error code = 0x"              << hex << hres << endl;        pLoc->Release();             CoUninitialize();        return 1;                // Program has failed.    }    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;    // Step 5: --------------------------------------------------    // Set security levels for the proxy ------------------------    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))    {        cout << "Could not set proxy blanket. Error code = 0x"              << hex << hres << endl;        pSvc->Release();        pLoc->Release();             CoUninitialize();        return 1;               // Program has failed.    }    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////    // set up to call the WmiSetBrightness Method    BSTR MethodName = SysAllocString(L"WmiSetBrightness");    BSTR ClassName = SysAllocString(L"WmiMonitorBrightnessMethods");    IWbemClassObject* pClass = NULL;    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);    IWbemClassObject* pInParamsDefinition = NULL;    hres = pClass->GetMethod(MethodName, 0,         &pInParamsDefinition, NULL);    IWbemClassObject* pClassInstance = NULL;    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);     VARIANT var1;     VariantInit(&var1);     V_VT(&var1) = VT_BSTR;     V_BSTR(&var1) = SysAllocString(L"1000");      hres = pClassInstance->Put(L"Timeout", 0, &var1, CIM_UINT32); //CIM_UINT64     VARIANT var2;     VariantInit(&var2);     V_VT(&var2) = VT_BSTR;     V_BSTR(&var2) = SysAllocString(L"30");      hres = pClassInstance->Put(L"Brightness", 0, &var2, CIM_UINT8);     // Execute Method    IWbemClassObject* pOutParams = NULL;    hres = pSvc->ExecMethod(ClassName, MethodName, 0,    NULL, pClassInstance, &pOutParams, NULL);    if (FAILED(hres))    {        cout << "Could not execute method. Error code = 0x"              << hex << hres << endl;        //VariantClear(&varCommand);        SysFreeString(ClassName);        SysFreeString(MethodName);        pClass->Release();        pInParamsDefinition->Release();        pOutParams->Release();        pSvc->Release();        pLoc->Release();             CoUninitialize();        return 1;               // Program has failed.    }    // To see what the method returned,    // use the following code.  The return value will    // be in &varReturnValue    VARIANT varReturnValue;    hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,         &varReturnValue, NULL, 0);    // Clean up    //--------------------------   // VariantClear(&varCommand);    VariantClear(&varReturnValue);    SysFreeString(ClassName);    SysFreeString(MethodName);    pClass->Release();    pInParamsDefinition->Release();    pOutParams->Release();    pLoc->Release();    pSvc->Release();    CoUninitialize();    return 0;}
原创粉丝点击