WMI: How to access the data in the package class?

EDN Admin

Well-known member
Joined
Aug 7, 2010
Messages
12,794
Location
In the Machine
MOF file has below definistions.
[WMI,<br/>
Locale("MS\0x409"),<br/>
Description("This class contains the definition of the package used in other classes"),<br/>
guid("{ABBC0F60-8EA1-11d1-00A0-C90629100000}")<br/>
]<br/>
class Package<br/>
{<br/>
<br/>
[WmiDataId(1),<br/>
read, write,<br/>
Description("16 bytes of data")<br/>
] uint8 Bytes[16];<br/>
};<br/>
<br/>
<br/>
[WMI,<br/>
Dynamic,<br/>
Provider("WmiProv"),<br/>
Locale("MS\0x409"),<br/>
Description("Class to test Query/Set a package"),<br/>
guid("{ABBC0F6a-8EA1-11d1-00A0-C90629100000}")<br/>
]<br/>
class Test_QSPackage<br/>
{<br/>
[key, read]<br/>
string InstanceName;<br/>
[read] boolean Active;<br/>
<br/>
[WmiDataId(1),<br/>
read, write,<br/>
Description("description")<br/>
] Package Data;<br/>
<br/>
};

->From the application, I want to access the data : Uint8 Bytes[16] of the package.
Here is the code:
HRESULT hRes;<br/>
BSTR strQuery = (L"Select * from Test_QSPackage");<br/>
BSTR strQL = (L"WQL");<br/>
hRes = pWbemServices->ExecQuery(strQL, strQuery,WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumObject);<br/>
<br/>
if(hRes != S_OK)<br/>
{<br/>
MessageBox("Could not execute Query ");<br/>
return;<br/>
}<br/>
<br/>
<br/>
<br/>
ULONG uCount = 1, uReturned;<br/>
IWbemClassObject * pClassObject = NULL;<br/>
<br/>
hRes = pEnumObject->Reset();<br/>
<br/>
if(hRes != S_OK)<br/>
{<br/>
MessageBox("Could not Enumerate Reset");<br/>
return;<br/>
}<br/>
<br/>
hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);<br/>
if(hRes != S_OK)<br/>
{<br/>
MessageBox("Could not Enumerate Next");<br/>
return;<br/>
}
VARIANT v;<br/>
BSTR strClassProp = SysAllocString(L"Data");
<br/>
hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0); <br/>
if(hRes != S_OK)<br/>
{<br/>
MessageBox("Could not Get Value");<br/>
return;<br/>
}<br/>
<br/>
SysFreeString(strClassProp);<br/>
<br/>
if(V_VT(&v)== VT_UNKNOWN ){<br/>
<br/>
IUnknown* pElem =v.punkVal;<br/>
// IUnknown* pElem =(IUnknown*)v;<br/>
IWbemClassObject *obj = NULL;<br/>
<br/>
pElem->QueryInterface(IID_IWbemClassObject, (void **)&obj);<br/>
if (obj == NULL) {<br/>
<br/>
return ;<br/>
<br/>
}<br/>
<br/>
// ...<br/>
VARIANT vt;<br/>
BSTR strClsProp = SysAllocString(L"Bytes"); //<br/>
<br/>
obj->Get(strClsProp,0,&vt,0,0); // from debugger, the returned VT contains unkown&invalid data. Why not the Byte[16] data here? <br/>
<br/>
if(V_VT(&vt) ==(VT_ARRAY|VT_I1)){<br/>
MessageBox("VT_ARRAY VT_I1");<br/>
}<br/>
<br/>
SysFreeString(strClsProp);<br/>
VariantClear( &v );<br/>
obj->Release();<br/>
<br/>
}

VariantClear( &v );
...
The final result is invalid data, which return by Obj->Get(...);
// obj->Get(strClsProp,0,&vt,0,0); // from debugger, the returned VT contains unkown&invalid data. Why not the Byte[16] data //here?
Could anybody help me to figure out the issue? Thanks in advance!<br/>


View the full article
 
Back
Top