title: How to call WMI function correctly
body: <p>The following code fails when ExecMethod is called. Can anyone pinpoint what I am doing wrong?</p>
  
  <pre><code>#define _WIN32_DCOM
  
  #include &lt;iostream&gt;
  using namespace std;
  #include &lt;comdef.h&gt;
  #include &lt;Wbemidl.h&gt;
  
  # 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 &lt;&lt; "Failed to initialize COM library. Error code = 0x" 
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; 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 &lt;&lt; "Failed to initialize security. Error code = 0x" 
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; 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 *) &amp;pLoc);
  
      if (FAILED(hres))
      {
          cout &lt;&lt; "Failed to create IWbemLocator object. "
               &lt;&lt; "Err code = 0x"
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; 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-&gt;ConnectServer(
          _bstr_t(L"ROOT\\wmi"), 
          NULL,
          NULL, 
          0, 
          NULL, 
          0, 
          0, 
          &amp;pSvc
      );
  
      if (FAILED(hres))
      {
          cout &lt;&lt; "Could not connect. Error code = 0x" 
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; endl;
          pLoc-&gt;Release();     
          CoUninitialize();
          return 1;                // Program has failed.
      }
  
      cout &lt;&lt; "Connected to ROOT\\CIMV2 WMI namespace" &lt;&lt; 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 &lt;&lt; "Could not set proxy blanket. Error code = 0x" 
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; endl;
          pSvc-&gt;Release();
          pLoc-&gt;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-&gt;GetObject(ClassName, 0, NULL, &amp;pClass, NULL);
  
      IWbemClassObject* pInParamsDefinition = NULL;
      hres = pClass-&gt;GetMethod(MethodName, 0, 
          &amp;pInParamsDefinition, NULL);
  
      IWbemClassObject* pClassInstance = NULL;
      hres = pInParamsDefinition-&gt;SpawnInstance(0, &amp;pClassInstance);
  
       VARIANT var1;
       VariantInit(&amp;var1);
  
       V_VT(&amp;var1) = VT_BSTR;
       V_BSTR(&amp;var1) = SysAllocString(L"1000"); 
       hres = pClassInstance-&gt;Put(L"Timeout", 0, &amp;var1, CIM_UINT32); //CIM_UINT64
  
       VARIANT var2;
       VariantInit(&amp;var2);
  
       V_VT(&amp;var2) = VT_BSTR;
       V_BSTR(&amp;var2) = SysAllocString(L"30"); 
       hres = pClassInstance-&gt;Put(L"Brightness", 0, &amp;var2, CIM_UINT8); 
  
  
  
      // Execute Method
      IWbemClassObject* pOutParams = NULL;
      hres = pSvc-&gt;ExecMethod(ClassName, MethodName, 0,
      NULL, pClassInstance, &amp;pOutParams, NULL);
  
  
  
      if (FAILED(hres))
      {
          cout &lt;&lt; "Could not execute method. Error code = 0x" 
               &lt;&lt; hex &lt;&lt; hres &lt;&lt; endl;
          //VariantClear(&amp;varCommand);
          SysFreeString(ClassName);
          SysFreeString(MethodName);
          pClass-&gt;Release();
          pInParamsDefinition-&gt;Release();
          pOutParams-&gt;Release();
          pSvc-&gt;Release();
          pLoc-&gt;Release();     
          CoUninitialize();
          return 1;               // Program has failed.
      }
  
      // To see what the method returned,
      // use the following code.  The return value will
      // be in &amp;varReturnValue
      VARIANT varReturnValue;
      hres = pOutParams-&gt;Get(_bstr_t(L"ReturnValue"), 0, 
          &amp;varReturnValue, NULL, 0);
  
  
      // Clean up
      //--------------------------
     // VariantClear(&amp;varCommand);
      VariantClear(&amp;varReturnValue);
      SysFreeString(ClassName);
      SysFreeString(MethodName);
      pClass-&gt;Release();
      pInParamsDefinition-&gt;Release();
      pOutParams-&gt;Release();
      pLoc-&gt;Release();
      pSvc-&gt;Release();
      CoUninitialize();
      return 0;
  }
  </code></pre>