描述
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。 |