Windows Embeded 8 WMI C++ 问题 ,好像是没找Enable到该方法,会是什么原因呢

提问者悬赏:10分 | ZW1988116 | 分类:C/C++ | 浏览5次
IWbemLocator pLocator = NULL;
IWbemServices *pNamespace = 0;
//IWbemClassObject * pClass = NULL;
// IWbemClassObject * pOutInst = NULL;
// IWbemClassObject * pInClass = NULL;
IWbemCallResult * ppCallResult = NULL;
//IWbemClassObject * pInst = NULL;
BSTR path = SysAllocString(L"root\standardcimv2\embedded");
BSTR ClassPath = SysAllocString(L"UWF_Filter");
BSTR MethodName = SysAllocString(L"Enable");
HRESULT hr = CoInitialize(0);
hr = CoInitializeSecurity(NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT,
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);

hr=pNamespace->ExecMethod(ClassPath,MethodName,0,NULL,NULL,NULL,&ppCallResult);
SysFreeString(path);
SysFreeString(ClassPath);
SysFreeString(MethodName);
pClass->Release();
//pInst->Release();
//pInClass->Release();
//ppCallResult->Release();
pNamespace->Release();
pLocator->Release();
CoUninitialize();

该回答引用ChatGPT-3.5

根据您提供的代码,我注意到您在连接到WMI命名空间之前使用了CoInitializeCoInitializeSecurity函数来初始化COM库和安全性。这是正确的做法。


然而,您的代码中有几个问题可能导致您无法启用UWF_Filter类中的Enable方法。

  1. 请确保您的WMI命名空间路径正确。在代码中,您将路径设置为root\standardcimv2\embedded。但是,路径中的反斜杠字符需要进行转义,所以您应该将路径设置为"root\\standardcimv2\\embedded"

  2. 在连接到WMI服务器后,您应该检查ConnectServer函数的返回值hr,以确保连接成功。如果连接失败,可能是由于权限问题或者WMI服务未运行等原因。

  3. 在执行方法之前,您需要获取UWF_Filter类的指针。您可以使用pNamespace->GetObject方法来获取该类的实例。然后,您可以使用该实例来调用Enable方法。

下面是更新后的代码示例:

IWbemLocator* pLocator = NULL;
IWbemServices* pNamespace = NULL;
IWbemClassObject* pClass = NULL;
IWbemClassObject* pInParams = NULL;
IWbemClassObject* pOutParams = NULL;
IWbemCallResult* pCallResult = NULL;
BSTR path = SysAllocString(L"root\\standardcimv2\\embedded");
BSTR className = SysAllocString(L"UWF_Filter");
BSTR methodName = SysAllocString(L"Enable");
HRESULT hr = CoInitialize(NULL);
hr = CoInitializeSecurity(NULL,
    -1,
    NULL,
    NULL,
    RPC_C_AUTHN_LEVEL_PKT,
    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);
hr = pNamespace->GetObject(className, 0, NULL, &pClass, NULL);
hr = pClass->GetMethod(methodName, 0, &pInParams, NULL);
hr = pNamespace->ExecMethod(className, methodName, 0, NULL, pInParams, &pOutParams, &pCallResult);

// 处理方法调用结果

SysFreeString(path);
SysFreeString(className);
SysFreeString(methodName);
pClass->Release();
pInParams->Release();
pOutParams->Release();
pCallResult->Release();
pNamespace->Release();
pLocator->Release();
CoUninitialize();

请注意,我添加了获取UWF_Filter类的指针,并创建了输入参数对象pInParams和输出参数对象pOutParams。在实际处理方法调用结果时,您可能需要进一步编写代码来提取返回值或处理任何错误。