提问者悬赏: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命名空间之前使用了CoInitialize
和CoInitializeSecurity
函数来初始化COM库和安全性。这是正确的做法。
然而,您的代码中有几个问题可能导致您无法启用UWF_Filter
类中的Enable
方法。
请确保您的WMI命名空间路径正确。在代码中,您将路径设置为root\standardcimv2\embedded
。但是,路径中的反斜杠字符需要进行转义,所以您应该将路径设置为"root\\standardcimv2\\embedded"
。
在连接到WMI服务器后,您应该检查ConnectServer
函数的返回值hr
,以确保连接成功。如果连接失败,可能是由于权限问题或者WMI服务未运行等原因。
在执行方法之前,您需要获取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
。在实际处理方法调用结果时,您可能需要进一步编写代码来提取返回值或处理任何错误。