2010-10-26 185 views
0

我正在嘗試調用wmisetbrightness,但它需要兩個輸入。如何將多個輸入傳遞給ExecMethod?下面的代碼片段顯然是錯誤的。將多個變量傳遞給ExecMethod

// 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); 

// Create the values for the in parameters 
VARIANT varCommand; 
varCommand.vt = VT_UI8; 
varCommand.ullVal = 30; 
//// Store the value for the in parameters 
hres = pClassInstance->Put(L"CommandLine", 0, &varCommand, 0); 

// Execute Method 
IWbemClassObject* pOutParams = NULL; 
hres = pSvc->ExecMethod(ClassName, MethodName, 0, 
NULL, pClassInstance, &pOutParams, NULL); 

編輯: WmiSetBrightness需要兩個變量:

UINT32 WmiSetBrightness( UINT64超時, UINT8亮度 );

上面的代碼只傳遞第一個輸入參數,我不知道如何修改它來傳遞兩個參數。

全部代碼在這裏:

#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"0"); 
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; 
} 
+0

請幫助我們來幫助您:確切的問題是什麼?它是否編譯?如果沒有,編譯器輸出什麼? – ereOn 2010-10-26 15:28:40

回答

2

試試這個,每個信息here據稱工作。顯然這些文檔在這個API上有誤導性。

VARIANT var1; 
VariantInit(&var1); 

V_VT(&var1) = VT_BSTR; 
V_BSTR(&var1) = SysAllocString(L"0"); 
hr = 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"); 
hr = pClassInstance->Put(L"Brightness", 0, &var2, CIM_UINT8); 
+0

由於某種原因,這也不適用於我。 ExecMethod失敗。 – aCuria 2010-10-26 16:23:28

+0

@aCuria - 錯誤是什麼?你是否遵循了其他所謂的工作代碼的結構(最後一節)? – 2010-10-26 16:25:32

+0

現在它編譯並運行,我已經把所有的代碼。問題是,ExecMethod失敗(不執行)我不知道如果我傳遞錯誤的東西,或者如果theres一些其他問題。 – aCuria 2010-10-27 01:29:36

1

我通過右鍵單擊代碼中的內容並選擇「搜索Google for ...」來搜索Google。

即吐出SWbemServices.ExecMethoddocumentation

很明顯,第三個參數是指定輸入參數的方法。

無論如何,學習文檔。

嘗試一下(也許在腳本中?)。

乾杯& hth。

+0

根據此http://msdn.microsoft.com/en-us/library/aa392103(VS.85).aspx第三個參數確定它是否是同步呼叫。 – aCuria 2010-10-27 14:10:37