描述
IWbemServices-PutInstanceAsync方法异步地创建或更新现有类的实例。通过由呼叫者实现的IWbemObjectSink接口提供更新确认或错误报告。
C++ 语法
HRESULT PutInstanceAsync( [in] IWbemClassObject *pInst, [in] LONG lFlags, [in] IWbemContext *pCtx, [in] IWbemObjectSink *pResponseHandler ); |
PowerBASIC 语法
METHOD PutInstanceAsync ( _ BYVAL pInst AS IWbemClassObject, _ BYVAL lFlags AS LONG, _ BYVAL pCtx AS IWbemContext, _ BYVAL pResponseHandler AS IWbemObjectSink _ ) AS LONG |
参数
pInst
指向要写入WMI存储库的实例的指针。呼叫者在完成此呼叫时不能对参考计数作出假设。
lFlags
指定调用者是否要在实例当前不存在的情况下创建实例。
实现实例提供者时,您可以选择通过返回WBEM_E_PROVIDER_NOT_CAPABLE来支持lFlags中有限数量的标志。
此属性可以具有以下一个或多个值。
旗 |
含义 |
WBEM_FLAG_CREATE_OR_UPDATE |
这个标志会导致如果实例不存在或被覆盖,如果它已经存在就会被创建。 |
WBEM_FLAG_UPDATE_ONLY |
更新现有实例。 |
WBEM_FLAG_CREATE_ONLY |
这个标志是例如创建的。如果类已经存在,则调用失败。 |
WBEM_FLAG_SEND_STATUS |
该标志向Windows Management注册通过客户端实施IWbemObjectSink.SetStatus接收中间状态报告的请求。提供商实施必须支持该标志的中间状态报告来改变行为。 |
WBEM_FLAG_USE_AMENDED_QUALIFIERS |
如果设置了此标志,则WMI不会存储具有修订风格的限定符。如果未设置此标志,则假定此对象未本地化,并且所有限定符都与此实例一起存储。 |
pCtx
描述客户端是否请求部分实例更新或全实例更新的指针。部分实例更新修改实例属性的子集。相反,全实例更新会修改所有属性。如果为NULL,则此参数指示调用者应用程序正在请求全实例更新。否则,这是指向生成类实例的动态类提供者所需的IWbemContext对象的指针。有关此参数的更多信息,请参阅拨打电话给WMI.
pResponseHandler
指向呼叫者执行IWbemObjectSink的指针。该处理程序在使用IWbemObjectSink.SetStatus方法可用时收到此呼叫的状态。如果返回任何错误代码,则不使用提供的IWbemObjectSink指针。如果返回WBEM_S_NO_ERROR,则调用用户的IWbemObjectSink实现来指示操作的结果。如果WBEM_S_NO_ERROR返回,Windows Management只会调用该指针的AddRef.在错误代码返回的情况下,引用计数与输入相同。有关如何进行异步调用的更多信息,请参阅调用方法.
返回值
此方法返回一个HRESULT,指示方法调用的状态。下表列出了HRESULT中包含的值。
请注意,如果PutInstanceAsync返回WBEM_S_NO_ERROR,则WMI将等待来自响应处理程序的SetStatus方法的结果。WMI在本地连接上无限期等待,或者直到发生远程连接超时。
如果网络问题导致您失去与Windows Management的远程连接,也可能会返回COM特定的错误代码。
退货代码 |
描述 |
WBEM_E_ALREADY_EXISTS |
指定了WBEM_FLAG_CREATE_ONLY标志,但实例已存在。 |
WBEM_E_FAILED |
这表示其他未指定的错误。 |
WBEM_E_ACCESS_DENIED |
用户没有权限添加或更新指定的实例。 |
WBEM_E_INVALID_OBJECT |
指定的实例无效。如果提供的对象不是实例对象,您将看到此错误。 |
WBEM_E_ILLEGAL_NULL |
为不为NULL的属性指定了NULL值,例如由索引或Not_Null限定符标记的属性。 |
WBEM_E_INVALID_CLASS |
指定的类无效。 |
WBEM_E_INVALID_PARAMETER |
指定了无效参数。 |
WBEM_E_NOT_FOUND |
指定了WBEM_FLAG_UPDATE_ONLY标志,但实例不存在。 |
WBEM_E_OUT_OF_MEMORY |
没有足够的内存来完成操作。 |
WBEM_E_SHUTTING_DOWN |
Windows管理服务可能已停止并重新启动。需要新的电话ConnectServer. |
WBEM_E_TRANSPORT_FAILURE |
这表示当前进程和Windows Management之间的远程过程调用(RPC)链接失败。 |
WBEM_S_NO_ERROR |
通话成功。 |
示例代码
以下示例介绍如何构造PutInstanceAsync.
HRESULT CStdProvider::PutInstanceAsync(
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{
// You must implement the InstanceIsValid method
// to check to see if the instance in the pInst variable
// is valid.
if (InstanceIsValid(lFlags, pInst))
{
return WBEM_S_NO_ERROR;
}
return WBEM_E_PROVIDER_NOT_CAPABLE;
}
备注
调用PutInstanceAsync的客户端必须始终期望使用其IWbemObjectSink.Indicate方法报告调用的结果。
当pInst指向的实例属于从其他类派生的类时,PutInstanceAsync的成功取决于负责父类的提供者的成功。例如,如果pInst属于ClassB和ClassB??派生自ClassA,由ClassA提供商实施的PutInstanceAsync方法的调用必须成功,否则ClassB上的更新操作将成功。有关详细信息,请参阅IWbemServices.PutInstance中的注释。
实现实例提供者时,如果实例的key属性设置为NULL,则PutInstanceAsync应该选择一个保证在类中唯一的值。当WMI服务使用NULL键属性更新实例的请求时,它会内部生成GUID并将其分配给key属性。此外,当正在更新的实例属于子类时,操作的成功取决于对层级中较高级别的每个提供者负责的PutInstanceAsync调用的成功。不要返回WBEM_S_NO_ERROR,直到您确定所有其他提供程序成功。有关详细信息,请参阅IWbemServices.PutInstance.
支持部分更新的实例提供者必须检查是否存在__PUT_EXTENSIONS上下文值。系统上下文值是由WMI定义的具有特定含义的值,由客户端应用程序设置,并由实例提供者支持。IWbemContext接口提供对系统上下文值和其他提供者特定上下文值的访问。下表列出了支持部分实例更新操作的上下文值。
调用IWbemObjectSink.SetStatus方法来指示结果集的结束。如果出现错误条件,也可以调用IWbemObjectSink.Indicate而不进行任何调用。
因为回调可能不会以与客户端所需的相同的身份验证级别返回,所以建议您使用半异步而不是异步通信。如果需要异步通信,请参阅调用方法.
有关半异步使用方法的更多信息,请参阅IWbemServices.PutInstance和调用方法.
系统上下文值 |
描述 |
__PUT_EXTENSIONS (VT_BOOL) |
客户端应用程序设置了一个或多个其他系统上下文值,以提供有关更新操作的更多信息。 |
__PUT_EXT_STRICT_NULLS (VT_BOOL) |
实例提供程序必须在必要时将属性的设置强制为VT_NULL,并在失败时引发错误。 |
__PUT_EXT_PROPERTIES (VT_ARRAY | VT_BSTR) |
包含要更新的属性列表。实例提供程序应该忽略所有其他属性。 |
__PUT_EXT_ATOMIC (VT_BOOL) |
所有更新必须成功或实例提供者必须还原。没有一部分成功。 |
在实现实例提供程序时,您应该按照以下方式响应pCtx中的NULL属性:
· | 如果属性类型为VT_NULL,则提供程序可以忽略该属性,而不进行更改或操作失败。 |
· | 如果属性类型不是VT_NULL并且属性不能被更新,则提供程序应返回错误,因为提供程序有义务使用新值更新属性。 |
如果pCtx不为NULL且指向有效的上下文信息,则呼叫者应用程序正在请求部分实例更新。如前所述,不支持部分实例更新的实例提供程序将通过返回WBEM_E_PROVIDER_NOT_CAPABLE来失败操作。
要求
客户 |
需要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 |
需要Fastprox.dll。 需要Esscli.dll。 需要Framedyn.dll。 需要Ntevt.dll。 需要Stdprov.dll。 需要Viewprov.dll。 需要Wbemcomn.dll。 需要Wbemcore.dll。 需要Wbemess.dll。 需要Wbemsvc.dll。 需要Wmipicmp.dll。 需要Wmidcprv.dll。 需要Wmipjobj.dll。 需要Wmiprvsd.dll。 |