勇芳软件工作室.汉化:  Windows Management Instrumentation > COM API for WMI > Interfaces > IWbemClassObject >

Put Method

Previous pageReturn to chapter overviewNext page

描述

 

IWbemClassObject.Put方法将named属性设置为新值。该方法总是用新的值覆盖当前值。当IWbemClassObject指向CIM类定义时,创建或更新属性值。当IWbemClassObject指向CIM实例时,仅更新属性值。无法创建属性值。

 

用户无法创建名称以下划线(_)开头或结尾的属性。这是为系统类和属性保留的。

 

C++ 语法

 

HRESULT Put(

[in]  LPCWSTR wszName,

[in]  LONG lFlags,

[in]  VARIANT *pVal,

[in]  CIMTYPE vtType

);

 

PowerBASIC 语法

 

METHOD Put ( _

BYREF wszName AS WSTRINGZ, _

BYREF lFlags AS LONG, _

BYREF pVal AS VARIANT, _

BYVAL vtType AS LONG _

) AS LONG

 

参数

 

wszName

 

必须指向有效属性名称的参数。此参数不能为NULL。

 

lFlags

 

保留。该参数必须为0(零)。

 

pVal

 

必须指向有效的VARIANT的参数,这将成为新的属性值。如果PVAL为NULL或指向VT_NULL类型的VARIANT,则该属性设置为NULL,即没有值。

 

vtType

 

VARIANT指向的VARIANT类型。

 

由VT_NULL类型的VARIANT指定的属性的NULL值与具有0(零)值的VT_I4类型的属性区分开。

 

创建新属性时,如果PVAL为NULL或指向VT_NULL,则属性的类型将从vtType参数确定。

 

如果PVAL包含嵌入式IWbemClassObject,则呼叫者必须调用IWbemClassObject.QueryInterface为IID_IUnknown,并将结果指针放在VARIANT中,使用一种类型的VT_UNKNOWN。在操作期间复制原始嵌入对象,因此无法通过操作进行修改。

 

指针被视为只读。

 

仅当在CIM类定义中创建新属性并且pVal为NULL或者指向VT_NULL类型的VARIANT时才使用此参数。在这种情况下,vtType参数指定属性的CIM类型。在其他情况下,vtType必须为0(零)。此外,当底层对象是一个实例时(即使PVAL为NULL),vtType必须为0(零)),因为属性的类型是固定的,不能被更改。换句话说,如果只有PVAL为NULL或指向VT_NULL VARIANT,并且底层对象是CIM类,则使用vtType.

 

当使用IWbemClassObject.Put将空数组值赋给属性时,不需要指定确切的VT类型;您可以为具有VT_ARRAY或VT_VARIANT变体类型的VARIANT分配值PVAL.

 

返回值

 

此方法返回一个HRESULT,指示方法调用的状态。下表列出了HRESULT中包含的值。

 

退货代码

描述

WBEM_E_FAILED

已经有一般的失败。

WBEM_E_INVALID_PARAMETER

指定了NULL或其他无效参数。

WBEM_E_INVALID_PROPERTY_TYPE

属性类型无法识别。创建类实例时,如果类已经存在,则返回此类实例。

WBEM_E_OUT_OF_MEMORY

没有足够的内存来完成操作。

WBEM_E_TYPE_MISMATCH

对于实例,此错误代码表示pVal参数指向属性的错误类型的VARIANT.对于类定义,如果属性已经存在于父类中,则返回此类,并且新的COM类型与旧的COM类型不同。这些属性对于派生类是只读的。

WBEM_S_NO_ERROR

通话成功。

 

示例代码

 

以下代码示例显示了如何为新的CIM类设置类名。

 

// pObj is an empty object from IWbemServices::GetObject

// Set up the property value.

VARIANT v;

VariantInit(&v);

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"MyClass");

 

// Write it.

LPCWSTR strClassProp = L"__CLASS";

pObj->Put(strClassProp, 0, &v, 0);

 

// Clean up.

VariantClear(&v);

 

PowerBASIC

 

DIM v AS VARIANT

v = "MyClass" AS WSTRING

DIM strClassProp AS WSTRINGZ

strClassProp = "__CLASS"

pObj.Put(strClassProp, 0, v, 0)

 

以下代码示例显示如何设置SomeUint64属性的值。请注意,BSTR值必须为十进制格式,而不是十六进制格式。

 

// pObj is an instance containing a uint64 property

// Set up the property value.

VARIANT v;

VariantInit(&v);

V_VT(&v) = VT_BSTR;

V_BSTR(&v) = SysAllocString(L"1033"); // - decimal format, not hex

 

// Write it.

LPCWSTR strClassProp = L"SomeUint64";

pObj->Put(strClassProp, 0, &v, CIM_UINT64);

 

// Clean up.

VariantClear(&v);

 

PowerBASIC

 

DIM v AS VARIANT

v = "1033" AS WSTRING

DIM strClassProp AS WSTRINGZ

strClassProp = "SomeUint64"

pObj.Put(strClassProp, 0, v, %CIM_UINT64)

 

备注

 

如果父类中存在由IWbemClassObject.Put方法设置的属性,则属性的默认值将更改,除非属性类型与父类类型不匹配。如果属性不存在,并且它不是类型不匹配,则会创建该属性。

 

当在一个实例上执行此方法时,始终会出现覆盖,因为该属性始终存在。

 

创建新类时,属性的底层类型是对象引用,日期/时间字符串或其他特殊类型,您可能需要修改属性的CIM类型参数以指示特殊的新类。实例属性上的CIMType限定符是只读的,并从类对象继承。

 

如果pVal中指定的变体类型与属性的CIM类型不匹配,则WMI将使用正常变体强制规则尝试将变体更改为适当的变体类型。如果不能强制变体,则返回WBEM_E_TYPE_MISMATCH。当属性为UINT32类型时,下表列出了正常变体胁迫规则的例外。

 

通过变体类型

结果

VT_I4

S_OK

VT_I2

WBEM_TYPE_MISMATCH

VT_R8

S_OK

 

但是,将VT_ARRAY或VT_R8传递给类型为UINT32[]的属性将失败。

 

__CLASS系统属性只能在类创建期间写入,而不能留空。所有其他系统属性都是只读的。

 

要求

 

客户

需要Windows Vista,Windows XP,Windows 2000 Professional,Windows NT Workstation 4.0 SP4及更高版本,Windows Me,Windows 98或Windows 95。

服务器

需要Windows Server 2008,Windows Server 2003,Windows 2000 Server或Windows NT Server 4.0 SP4及更高版本。

在Wbemcli.inc中声明。

DLL

需要Cimwin32.dll。

需要Esscli.dll。

需要Evntrprv.dll。

需要Fastprox.dll。

需要Framedyn.dll。

需要Krnlprov.dll。

需要Ncprov.dll。

需要Wbemcore.dll。

需要Wbemess.dll。

需要Wmipiprt.dll。