SWbemObject.ExecMethodAsync_ 方法
SWbemObject 的 ExecMethodAsync_ 方法以异步方式执行方法提供程序导出的方法。 此方法类似于 SWbemServices.ExecMethodAsync,但直接对要执行的方法的对象运行。 Windows Management Instrumentation (WMI) 不实现此方法。 提供程序实现此方法。
有关此语法的说明,请参阅脚本 API 的文档约定。
语法
objOutParams = .ExecMethodAsync_( _
ByVal objWbemSink, _
ByVal strMethodName, _
[ ByVal objwbemInParams ], _
[ ByVal iFlags ], _
[ ByVal objwbemNamedValueSet ], _
[ ByVal objWbemAsyncContext ] _
)
parameters
-
objWbemSink [in]
-
必需。 这是接收方法调用结果的对象接收器。 出站参数将发送到提供的对象接收器的 SWbemSink.OnObjectReady 事件。 调用机制的结果将发送到提供的对象接收器的 SWbemSink.OnCompleted 事件。 请注意,SWbemSink.OnCompleted 不接收方法的返回代码。 但是,它接收实际调用返回机制的返回代码,并且仅用于验证调用是否发生,或者调用是否由于机制原因而失败。 从方法返回的结果代码在提供给 SWbemSink.OnObjectReady 的出站参数对象中返回。 如果返回了任何错误代码,则不会使用提供的 IWbemObjectSink 对象。 如果调用成功,则会调用用户的 IWbemObjectSink 实现以指示操作结果。
-
strMethodName [in]
-
必需。 这是对象的方法名称。
-
objwbemInParams [in, optional]
-
这是包含所执行方法的输入参数的 SWbemObject 对象。 默认情况下,此参数为未定义。 有关详细信息,请参阅构造 InParameters 对象和分析 OutParameters 对象。
-
iFlags [in, optional]
-
决定调用行为的整数。 此参数可以接受以下值。
-
wbemFlagSendStatus (128 (0x80))
-
导致异步调用将状态更新发送到对象接收器的 SWbemSink.OnProgress 事件处理程序。
-
wbemFlagDontSendStatus (0 (0x0))
-
防止异步调用将状态更新发送到对象接收器的 OnProgress 事件处理程序。
objwbemNamedValueSet [in, optional]
通常,此参数是未定义的。 如果已定义,此参数是一个 SWbemNamedValueSet 对象,其元素表示可供提供请求服务的提供程序使用的上下文信息。 支持或需要此类信息的提供程序必须记录已识别的值名称、值数据类型、允许的值和语义。
objWbemAsyncContext [in, optional]
这是一个 SWbemNamedValueSet 对象,它返回到对象接收器以标识原始异步调用的源。 如果使用同一对象接收器进行多个异步调用,请使用此参数。 若要使用此参数,请创建 SWbemNamedValueSet 对象,并使用 SWbemNamedValueSet.Add 方法添加值,该值标识即将进行的异步调用。 此 SWbemNamedValueSet 对象返回到对象接收器,并且调用的源可使用 SWbemNamedValueSet.Item 方法提取。 有关详细信息,请参阅调用方法。
返回值
此方法没有返回值。 如果调用成功,则会将 OutParameters 对象(也是 SWbemObject 对象)提供给 objWbemSink 中指定的接收器。 返回的 OutParameters 对象包含正在执行的方法的输出参数和返回值。
错误代码
ExecMethodAsync_ 方法完成后,Err 对象可能包含以下列表中的错误代码之一。
-
wbemErrFailed - 2147749889 (0x80041001)
-
错误。
-
wbemErrInvalidClass - 2147749904 (0x80041010)
-
指定的类无效。
-
wbemErrInvalidParameter - 2147749896 (0x80041008)
-
指定的参数无效。
-
wbemErrOutOfMemory - 2147749894 (0x80041006)
-
内存不足,无法完成此操作。
-
wbemErrInvalidMethod - 2147749934 (0x8004102E)
-
请求的方法不可用。
-
wbemErrAccessDenied - 2147749891 (0x80041003)
-
当前用户无权执行该方法。
备注
无法直接执行方法时,请使用 SWbemObject.ExecMethodAsync_ 方法替代直接访问以执行提供程序方法。 例如,如果方法具有 out 参数,请将 SWbemObject.ExecMethodAsync_ 方法与不支持输出参数的脚本语言结合使用。 否则,建议使用直接访问来调用方法。 有关详细信息,请参阅操作类和实例信息。
此调用会立即返回。 请求的对象和状态通过回调返回给调用方,该回调传递到 objWbemSink 中指定的接收器。 要在每个对象到达时对其进行处理,请创建 objWbemSink.OnObjectReady 事件子例程。 返回所有对象后,可在 objWbemSink.OnCompleted 事件的实现中执行最终处理。
通过异步回调,未经身份验证的用户可以向接收器提供数据。 这会给脚本和应用程序带来安全风险。 为消除风险,请使用半同步通信或同步通信。 有关详细信息,请参阅调用方法。
如果正在执行的方法具有输入参数,则必须按照构造 InParameters 对象和分析 OutParameters 对象中所述构造 InParameters 对象和 objWbemInParam 参数。
SWbemObject.ExecMethodAsync_ 方法假定由 SWbemObject 表示的对象包含要执行的方法。 SWbemServices.ExecMethodAsync 方法需要对象路径。
示例
以下示例演示 ExecMethodAsync 方法。 该脚本创建一个 Win32_Process 对象,该对象表示运行记事本的进程。 它显示了 InParameters 对象的设置以及如何从 OutParameters 对象获取结果。
有关演示同步执行的相同操作的脚本,请参阅 SWbemObject.ExecMethod。 有关使用直接访问的示例,请参阅在类 Win32_Process 中创建方法。 有关使用 SWbemServices 对象相同操作的示例,请参阅 SWbemServices.ExecMethodAsync。
On Error Resume Next
'Get a Win32_Process class description
Set oProcess = GetObject("winmgmts:Win32_Process")
' Create the SWbemMethod.InParameters object
' to hold the input parameter needed
' for the Win32_Process.Create method call.
' The oProcess.Methods_("Create") call
' obtains a class object that defines
' the correct input parameters
' for the Win32_Process.Create call.
' The InParameters object is an
' SWbemObject object so SWbemObject.SpawnInstance_
' can be called to create it.
Set oInParams = oProcess.Methods_("Create"). _
InParameters.SpawnInstance_
' Specify the name of the process to be run.
oInParams.CommandLine = "Notepad.exe"
' Create a sink to receive event resulting
' from the ExecMethodAsync call.
Set Sink = wscript.CreateObject( _
"WbemScripting.SWbemSink", "Sink_")
' Call the Win32_Process.Create method asynchronously. Set up a
' wait so the results of the method execution can be returned to
' the sink subroutines.
bDone = false
' Call SWbemObject.ExecMethodAsync on the oProcess object.
oProcess.ExecMethodAsync_ Sink, "Create", oInParams, 0
'
while not bDone
wscript.sleep 1000
wend
' Sink subroutines
sub Sink_OnObjectReady(oOutParams, oContext)
wscript.echo "Sink_OnObjectReady subroutine " _
& VBNewLine & "ReturnValue = " _
& oOutParams.ReturnValue & VBNewLine & _
"ProcessId = " & oOutParams.ProcessId
end sub
sub Sink_OnCompleted(HResult, LastErrorObj, oContext)
wscript.echo "Sink_OnCompleted subroutine, hresult = " _
& hex(HResult)
bdone = true
end sub
要求
要求 | 值 |
---|---|
最低受支持的客户端 |
Windows Vista |
最低受支持的服务器 |
Windows Server 2008 |
标头 |
|
类型库 |
|
DLL |
|
CLSID |
CLSID_SWbemObject |
IID |
IID_ISWbemObject |