#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;    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.
    }    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.
    }
        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.
    }    IWbemServices *pSvc = NULL;
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), 
        NULL,
        NULL, 
        0, 
        NULL, 
        0, 
        0, 
        &pSvc
    );
    
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x" 
             << hex << hres << endl;
        pLoc->Release();
        pSvc->Release();     
        CoUninitialize();
        return 1;                // Program has failed.
    }    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;    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.
    }    BSTR MethodName = SysAllocString(L"Create");
    BSTR ClassName = SysAllocString(L"Win32_Process");    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 varCommand;
    varCommand.vt = VT_BSTR;
    varCommand.bstrVal = L"notepad.exe";
    hres = pClassInstance->Put(L"CommandLine", 0,
        &varCommand, 0);
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
    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.
    }
    VARIANT varReturnValue;
    hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0, 
        &varReturnValue, NULL, 0);
    VariantClear(&varCommand);
    VariantClear(&varReturnValue);
    SysFreeString(ClassName);
    SysFreeString(MethodName);
    pClass->Release();
    pInParamsDefinition->Release();
    pOutParams->Release();
    pLoc->Release();
    pSvc->Release();
    CoUninitialize();
    return 0;
}这个是MSDN上的代码 貌似 只是简单的说了下怎么用,可是怎么设置 Win32_ProcessStartup 这个参数类呢,
就高人解答

解决方案 »

  1.   

    一样的类似,先自己MSDN上查看Win32_ProcessStartup的对应方法,然后填入对应的参数调用VARIANT varCommand;
        varCommand.vt = VT_BSTR;
        varCommand.bstrVal = L"notepad.exe";
    --- 这里可以添加对应方法的参数
      

  2.   

    Win32_ProcessStartup  这个是参数类 没有对应的调用方法。
    楼上的 的可以查下  
    如果知道怎么用
    告诉我下 
      

  3.   

    方法都知道调用了,查询它的参数不是更容易...Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    Set objConfig = objStartup.SpawnInstance_这是VB的,VC的自己对应的改改,参考这里
    http://msdn.microsoft.com/en-us/library/aa394558(v=VS.85).aspx
      

  4.   

      晕死  这两个不一样啊  再说我也不大懂VB  
     那个 我都参考过了
     他直接就 申明这个 类了 但是在vc 中 行不通
     我比较笨 楼上还是 直接说怎么用吧
     VBS,vb,c#的 我都参考过的 
    但还是 没弄明白 VC中怎么用
      

  5.   

    // 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_OperatingSystem"),
            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
            NULL,
            &pEnumerator);
        
        if (FAILED(hres))
        {
            cout << "Query for operating system name failed."
                << " Error code = 0x" 
                << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            return 1;               // Program has failed.
        }    // 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"Name", 0, &vtProp, 0, 0);
            wcout << " OS Name : " << vtProp.bstrVal << endl;
            VariantClear(&vtProp);        pclsObj->Release();
        }
      

  6.   

    用WQL语句查询,得到结果集,然后pEnumerator枚举遍历..
    我给你的URL中第一个例子就是
      

  7.   

    我不是要查询他的参数 。
    晕死 题目 我就说是怎么设置的了
    设置Win32_ProcessStartup 这个参数类
    我要的目的 就是设置这个类当中的属性
    谢谢
      

  8.   

    SCODE sc;
        IWbemClassObject * pClass = NULL;
        sc = pNamespace->GetObject(
            pwcClassName, 0, pCtx, &pClass, NULL);
        if(sc != S_OK)
            return WBEM_E_FAILED;
        sc = pClass->SpawnInstance(0, pNewInst);
        pClass->Release();
        if(FAILED(sc))
            return sc;
        VARIANT v;    // Set the key property value.    v.vt = VT_BSTR;
        v.bstrVal = SysAllocString(pKey);
        if (!v.bstrVal)
            return WBEM_E_OUT_OF_MEMORY;    sc = (*pNewInst)->Put(L"MyKey", 0, &v, 0);
        VariantClear(&v);
        if(FAILED(sc))
            return sc;    // Set the number property value.    v.vt = VT_I4;
        v.lVal = lVal;
        sc = (*pNewInst)->Put(L"MyValue", 0, &v, 0);
        return sc;
      

  9.   

    Put等方法,但是不一定你的那个class能够支持你进行设置...
      

  10.   

    我也想知道,普通的參數MSDN上面有例子,但是如果參數的類型是一個 class這個就頭痛了...我試過返回值改成class,debug顯示varant的類型為 IUNKONW* .....直接轉換為  IWbemClassObject* 可以得到結果但是輸入的話.那個參數類型應該是什么?????
    如何構造那個參數