如何通过WMI COM获取BcdObject? [英] how can I get the BcdObject by WMI COM?

查看:75
本文介绍了如何通过WMI COM获取BcdObject?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

全部

感谢您的关注!!

我尝试通过Bcd API获取/设置启动配置,我使用WMI COM和c ++来完成它,我的工具是VC8,但我遇到了一个问题:

当我调用IWbemClassObject :: GetMethod时,返回的结果是WBEM_E_ILLEGAL_OPERATION,

when I call IWbemClassObject::GetMethod, it return result is WBEM_E_ILLEGAL_OPERATION ,

我想知道如何获得有效的BcdObject实例?

I want to know how can I get a valid BcdObject instance?

我的代码如下:

// init WMI COM

// init WMI COM

// init IWbemLocator,获取实例,pLoc

// init IWbemLocator, got the instance , pLoc

//连接到命名空间" root \\wmi"并得到了IWbemServices pSvc的实例;

// connect to namespace "root\\wmi" and got the instance of IWbemServices pSvc;

BSTR bstrClsName = SysAllocString(L" BcdStore");
IWbemClassObject * pWbmBcd = NULL;
hr = pSvc-> ; GetObject(bstrClsName,0,NULL,& pWbmBcd,NULL);
if(hr == WBEM_S_NO_ERROR)
{
VARIANT variant1;

IWbemClassObject * pInParamaterClass = NULL;
IWbemClassObject * pOutParamaterClass = NULL;
IWbemClassObject * pInParam = NULL;
IWbemClassObject * pOutParam = NULL;
IWbemCallResult * pCallResult = NULL;

BSTR bstrClsName = SysAllocString (L"BcdStore");
  IWbemClassObject *pWbmBcd = NULL;
  hr = pSvc->GetObject(bstrClsName, 0, NULL, &pWbmBcd, NULL);
  if (hr == WBEM_S_NO_ERROR)
  {
   VARIANT variant1;
  
   IWbemClassObject *pInParamaterClass = NULL;
   IWbemClassObject *pOutParamaterClass = NULL;
   IWbemClassObject *pInParam = NULL;
   IWbemClassObject *pOutParam = NULL;
   IWbemCallResult *pCallResult = NULL;

BSTR bstrMthdName = SysAllocString(L" OpenStore");

   BSTR bstrMthdName = SysAllocString (L"OpenStore");

hr = pWbmBcd-> GetMethod(bstrMthdName,0,& pInParamaterClass,NULL);

if( hr == WBEM_S_NO_ERROR)
{
if(NULL!= pInParamaterClass)
{
hr = pInParamaterClass-> SpawnInstance(0,& pInParam);
//创建实例副本< BR>如果(WBEM_S_NO _ERROR == hr)
{
//设置每个属性
VariantInit(& variant1);
V_VT(& variant1)= VT_BSTR;
V_BSTR(& variant1)= SysAllocString (L"");
hr = pInParam-> Put(L" File",0,& variant1,0);
VariantClear(& variant1);
}
}
}

   hr = pWbmBcd->GetMethod(bstrMthdName, 0, &pInParamaterClass, NULL);
   
   if (hr == WBEM_S_NO_ERROR)
   {
    if( NULL != pInParamaterClass)
    {
     hr=pInParamaterClass->SpawnInstance(0, &pInParam);
     // create instance copy
     if(WBEM_S_NO_ERROR ==  hr)
     {
      // set each property
      VariantInit(&variant1);
      V_VT(&variant1) = VT_BSTR;
      V_BSTR(&variant1) = SysAllocString(L"");
      hr = pInParam->Put(L"File", 0, &variant1, 0);
      VariantClear(&variant1);
     }
    }
   }

if(WBEM_S_NO_ERROR == hr&& pInParam!= NULL)




BSTR bstrObjectName = SysAllocString(L" \\\\\\\\\\\\\\\\\\\\\\\\\ ;
hr = pSvc-> ExecMethod(bstrObjectName,bstrMthdName,0
,NULL,pInParam,& pOutParam,& pCallResult);

   if (WBEM_S_NO_ERROR == hr && pInParam != NULL)
   {
    BSTR bstrObjectName = SysAllocString (L"
\\\\mypc\\ROOT\\WMI:BcdStore");
    hr = pSvc->ExecMethod(bstrObjectName, bstrMthdName, 0
     , NULL, pInParam, &pOutParam, &pCallResult);
    

long lResult = 0;
if(pCallResult!= NULL)
{
pCallResult-> GetCallStatus(WBEM_INFINITE,& lResult);
hr = pCallResult-> GetResultObject(0,& ; pOutParamaterClass);
pCallResult-> Release();
pCallResult = NULL;
}

    long lResult = 0;
    if (pCallResult != NULL)
    {
     pCallResult->GetCallStatus(WBEM_INFINITE, &lResult);
     hr = pCallResult->GetResultObject(0, &pOutParamaterClass);
     pCallResult->Release();
     pCallResult = NULL;
    }

pInParam-> Release();
pInParam = NULL;
pInParamaterClass - > Release();
pInParamaterClass = NULL;

    pInParam->Release();
    pInParam = NULL;
    pInParamaterClass ->Release();
    pInParamaterClass = NULL;

SysFreeString(bstrMthdName);

    SysFreeString(bstrMthdName);

if(pOutParamaterClass!= NULL&& hr == WBEM_S_NO_ERROR)
{
VariantI nit(& variant1);
hr = pOutParamaterClass-> Get(L" Store",0,& variant1,0,0);

if(variant1.punkVal!= NULL)< br> {
IWbemClassObject * pGotBcdStore = NULL;

 if (pOutParamaterClass != NULL && hr == WBEM_S_NO_ERROR)
    {
      VariantInit(&variant1);
     hr = pOutParamaterClass->Get(L"Store", 0, &variant1, 0, 0);
     
     if (variant1.punkVal != NULL)
     {
           IWbemClassObject *pGotBcdStore = NULL;


hr = variant1.punkVal - > QueryInterface(IID_IWbemClassObject,(void **)& pGotBcdStore);

 hr = variant1.punkVal->QueryInterface(IID_IWbemClassObject, (void **)&pGotBcdStore);     

if(SUCCEEDED(hr))

if (SUCCEEDED(hr))

{

hr = pGotBcdStore-> GetMethod(L" OpenObject",0& pInParamaterClass,NULL);

< font color ="#ff0000"> //返回结果是WBEM_E_ILLEGAL_OPERATION,

会发生什么?

我的代码中是否有错误?

Are there some error in my code upon?

非常感谢!

推荐答案

谁可以帮助我?


这篇关于如何通过WMI COM获取BcdObject?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆