2010-10-26 4 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

ответ

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

+0

@aCuria - какая ошибка? Вы следовали структуре остальной части якобы действующего кода там (последний раздел)? –

+0

Сейчас он компилируется и запускается, я поместил весь код. Проблема в том, что ExecMethod терпит неудачу (не выполняется). Im не уверен, что я передаю ему что-то не так, или если у вас есть другая проблема. – aCuria

1

Я искал google, щелкнув правой кнопкой мыши в вашем коде и выбрав «Поиск google для ...».

Что выплевывает documentation от SWbemServices.ExecMethod.

По-видимому, третий аргумент, в котором вы указываете 0, может быть SWbemObject, определяющий входные параметры для метода.

В любом случае изучите документацию.

Попробуйте все (возможно, сначала в скрипте?).

Cheers & hth.

+0

В соответствии с этим http://msdn.microsoft.com/en-us/library/aa392103(VS.85).aspx третий параметр определяет, является ли это синхронным вызовом. – aCuria