IWbemServices::GetObjectAsync 方法 (wbemcli.h)

IWbemServices::GetObjectAsync 方法根据其路径检索对象(类定义或实例)。 这类似于 IWbemServices::GetObject ,只不过调用会立即返回,并将对象提供给提供的对象接收器。

目前,此方法仅从与 IWbemServices 指针关联的命名空间检索对象。

语法

HRESULT GetObjectAsync(
  [in] const BSTR      strObjectPath,
  [in] long            lFlags,
  [in] IWbemContext    *pCtx,
  [in] IWbemObjectSink *pResponseHandler
);

参数

[in] strObjectPath

要检索的对象的路径。 对于实例提供程序, StrObjectPath 可以采用以下格式:

  • Namespace:Class.Key = “Value”
  • Namespace:Class = “Value”
  • Namespace:Class.Key = “Value”, Key2 = “Value2”
在 类之前指定命名空间是可选的。 没有命名空间的对象路径引用当前命名空间中的实例。 如有必要,可以将单引号字符 (') 替换为双引号字符 (“) 来分隔字符串属性类型的开头和结尾。

如果此值为 NULL,则返回一个空对象,该对象可成为新类。 有关详细信息,请参阅创建类

[in] lFlags

以下标志会影响此方法的行为。

WBEM_FLAG_USE_AMENDED_QUALIFIERS

如果设置了此标志,WMI 将检索存储在当前连接区域设置的本地化命名空间中的修改限定符。 如果未设置,则仅检索存储在直接命名空间中的限定符。

WBEM_FLAG_DIRECT_READ

此标志导致直接访问指定的类的提供程序,而不考虑其父类或子类。

WBEM_FLAG_SEND_STATUS

通过客户端实现 的 IWbemObjectSink::SetStatus 注册接收中间状态报告的请求。 提供程序实现必须支持此标志的中间状态报告才能更改行为。

[in] pCtx

通常 为 NULL。 否则,这是指向 IWbemContext 对象的指针,生成所请求的类或实例的提供程序可以使用该对象。 上下文对象中的值必须在相关提供程序的文档中指定。 有关此参数的详细信息,请参阅 调用 WMI

[in] pResponseHandler

指向调用方实现 IWbemObjectSink 的指针。 此处理程序通过 IWbemObjectSink::Indicate 方法获取请求的对象时接收该对象。 pObjParam 参数包含 对象。 如果返回任何错误代码,则不使用提供的 IWbemObjectSink 指针。 如果返回 WBEM_S_NO_ERROR ,则调用用户的 IWbemObjectSink 实现来指示操作的结果。 Windows 管理仅在 返回WBEM_S_NO_ERROR 的情况下调用指向指针的 AddRef。 在错误代码返回的情况下,引用计数与输入时相同。 有关此参数的详细信息,请参阅 调用方法

返回值

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

失败时,可以从 COM 函数 GetErrorInfoGetErrorInfo 获取任何可用信息。

如果网络问题导致你失去与 Windows 管理的远程连接,也可以返回特定于 COM 的错误代码。

注解

实现实例提供程序时,应使用 PSDK 的 WMI 部分中的对象路径分析器示例代码来分析对象路径,以识别客户端请求的对象。 此外,支持派生类的提供程序只需提供类的本地属性的值,而不是继承的属性。 WMI 请求基类的提供程序处理继承的属性。

实现类提供程序时, GetObjectAsync 必须通过分析 strObjectPath 参数中存储的类名对象路径来确定请求哪个类。 然后 ,GetObjectAsync 方法会动态生成类,或者从专用缓存中获取类。 然后,GetObjectAsync 使用 pResponseHandler 参数指向的 IWbemObjectSink 指针将类发送到 WMI。 调用 IWbemObjectSink::SetStatus 方法以指示结果集的结束。 还可以调用它,而无需对 IWbemObjectSink::指示 是否发生错误条件。

由于回调可能不会在客户端所需的相同身份验证级别返回,因此建议使用半同步而不是异步通信。 如果需要异步通信,请参阅 调用方法

有关以半同步方式使用方法的详细信息,请参阅 IWbemServices::GetObject调用方法

示例

以下示例介绍如何为实例提供程序实现 GetObjectAsync

SCODE CInstPro::GetObjectAsync (BSTR ObjectPath, 
                                long lFlags, IWbemContext *pCtx,
                                IWbemObjectSink FAR* pHandler)
{
    ULONG cRef;         // Reference count
    SCODE sc;
    BOOL bOK = FALSE;

    IWbemServices *  m_pNamespace;
    IWbemClassObject FAR* pObj;

    // Check arguments.

    if(ObjectPath == NULL || pHandler == NULL ||
        m_pNamespace == NULL)
        return WBEM_E_INVALID_PARAMETER;

    
    // Based on the object path, produce an empty instance
    // of the class and gather required data,
    // setting the instance's property values accordingly.
    // This example assumes that GetByPath is implemented
    // by the provider to do this.
    // The IWbemPath interface can be used to parse
    // the object path, separating the namespace and class name.

    sc = GetByPath (ObjectPath, &pObj, pCtx);
    if(sc == S_OK) 
    {
        pHandler->Indicate (1, &pObj);
        pObj->Release();
        bOK = TRUE;
    }

    sc = (bOK) ? S_OK : WBEM_E_NOT_FOUND;

    // Set status.

    pHandler->SetStatus(0,sc, NULL, NULL);

    // Free memory resources.

    SysFreeString(ObjectPath);
    m_pNamespace->Release();
    pObj->Release();

    return sc;
  
}

以下示例演示典型的类提供程序如何实现 GetObjectAsync

HRESULT CStdProvider::GetObjectAsync( 
            /* [in] */ BSTR strObjectPath,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{

    IWbemClassObject *pClass = 0;

// Assume there is an IWbemServices pointer available.
// Retrieve an 'empty' object which is built up
// into the class definition.

    HRESULT hRes = m_pSvc->GetObject(NULL, 0, NULL, &pClass, 0);
    if (hRes)
        return hRes;

// Parse the object path and determine which class is   
// required. The path string is the required class name.
// Fill in the properties required for the class definition
// using pClass->Put(...), and so on.

    
    // ...

    // Send the class definition back to WMI.
    pResponseHandler->Indicate(1, &pClass);

// Indicate that it is now finished.

    pResponseHandler->SetStatus(0, WBEM_S_NO_ERROR, 0, 0);
    SysFreeString(strObjectPath);
    m_pSvc->Release();
    pClass->Release();  // This is no longer needed.
    return WBEM_S_NO_ERROR;
}

要求

要求
最低受支持的客户端 Windows Vista
最低受支持的服务器 Windows Server 2008
目标平台 Windows
标头 wbemcli.h (包括 Wbemidl.h)
Library Wbemuuid.lib
DLL Fastprox.dll;Esscli.dll;FrameDyn.dll;FrameDynOS.dll;Ntevt.dll;Stdprov.dll;Viewprov.dll;Wbemcomn.dll;Wbemcore.dll;Wbemess.dll;Wbemsvc.dll;Wmipicmp.dll;Wmidcprv.dll;Wmipjobj.dll;Wmiprvsd.dll

另请参阅

调用方法

创建类

描述 WMI 对象的位置

IWbemServices

IWbemServices::GetObject