Windows — выполнение метода WMI из C ++ завершается неудачно с помощью WBEM_E_INVALID_METHOD_PARAMETERS

Я пытаюсь вызвать метод из WMI, используя C ++. Но pNamespace-> callMethod (..) завершается с ошибкой WBEM_E_INVALID_METHOD_PARAMETERS (0x8004102F).

Я пытаюсь вызвать метод из ..
Пространство имен: ROOT \ WMI
Класс: CLEVO_GET
Метод: SetKBLED (Статический = Ложный)
В параметрах:
ID: 0 / Имя: Данные / Тип: uint32
Out Params:
Никто

MOF:
[WmiMethodId (103), реализовано, чтение, запись, описание («SetKBLED»)] void SetKBLED ([in, Description («SetKBLED»)]] uint32 Data);

Это мой код, но, как уже было сказано, функция callMethod никогда не работает и возвращает ошибку 0x8004102F. Кто-нибудь знает, что не так?

#include <Windows.h>
#include <iostream>
#include <string>
#include <WbemCli.h>

#pragma comment(lib, "wbemuuid.lib")

int main()
{
IWbemLocator *pLocator = NULL;
IWbemServices *pNamespace = 0;
IWbemClassObject * pClass = NULL;
IWbemClassObject * pOutInst = NULL;
IWbemClassObject * pInClass = NULL;
IWbemClassObject * pInInst = NULL;

BSTR path = SysAllocString(L"root\\wmi");
BSTR ClassPath = SysAllocString(L"CLEVO_GET");
BSTR MethodName = SysAllocString(L"SetKBLED");
BSTR ArgName = SysAllocString(L"Data");

// Initialize COM and connect to WMI.

HRESULT hr = CoInitialize(0);
hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *)&pLocator);
hr = pLocator->ConnectServer(path, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace);

// Get the class object for the method definition.
hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);
std::cout << "NAMESPACE-CLASS:: " << std::hex << hr << std::endl;

// Get the input-argument class object and
// create an instance.
hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);
std::cout << "GET METHOD:: " << std::hex << hr << std::endl;
hr = pInClass->SpawnInstance(0, &pInInst);
std::cout << "SPAWN INSTANCE:: " << std::hex << hr << std::endl;

// Set the property.
VARIANT var;
var.vt = VT_I4;
var.iVal = 4096;
//var.iVal = std::stoul("0x00001000", NULL, 16);

hr = pInInst->Put(ArgName, 0, &var, 0);
std::cout << "ADD VARIABLE:: " << std::hex << hr << std::endl;
VariantClear(&var);

// Call the method.
//hr = pNamespace->ExecMethod(L"CLEVO_GET", L"SetKBLED", 0, NULL, NULL, NULL, NULL);
hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, pInInst, NULL, NULL);
//hr = pNamespace->ExecMethod(ClassPath, MethodName, 0, NULL, NULL, NULL, NULL);
std::cout << "EXEC RESULT:: " << std::hex << hr << std::endl;

// Free up resources.
SysFreeString(path);
SysFreeString(ClassPath);
SysFreeString(MethodName);
SysFreeString(ArgName);
pClass->Release();
pInInst->Release();
pInClass->Release();
pLocator->Release();
pNamespace->Release();
CoUninitialize();// Wait for finish
std::cout << "DONE! :)";
std::cin.ignore();

return 0;
}

Я пытаюсь добиться этого с помощью C ++ (этот фрагмент кода написан на Powershell, и он работает):

$clevo = get-wmiobject -query "select * from CLEVO_GET" -namespace "root\WMI"$clevo.SetKBLED( [Convert]::ToUInt32("00001000", 16)  )

Надеюсь, кто-нибудь может мне помочь. Любая помощь высоко оценена.
Благодарю.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]