IWbemServices::ExecQueryAsync-Methode (wbemcli.h)

Die IWbemServices::ExecQueryAsync-Methode führt eine Abfrage aus, um Objekte asynchron abzurufen.

Syntax

HRESULT ExecQueryAsync(
  [in] const BSTR      strQueryLanguage,
  [in] const BSTR      strQuery,
  [in] long            lFlags,
  [in] IWbemContext    *pCtx,
  [in] IWbemObjectSink *pResponseHandler
);

Parameter

[in] strQueryLanguage

GültigeS BSTR, das eine der Abfragesprachen enthält, die die Windows-Verwaltungsinstrumentation (WMI) unterstützt. Dies muss "WQL" sein.

[in] strQuery

Gültiger BSTR , der den Text der Abfrage enthält. Dies darf nicht NULL sein. Wenn Sie einen instance-Anbieter implementieren, kann Ihr Anbieter die Abfrage ablehnen, weil sie zu komplex ist. Wenn ein Anbieter feststellt, dass eine Abfrage zu komplex ist, kann WMI den Anbieter mit einer einfachen Abfrage wiederholen oder die Obermenge der Abfrageinstanzen abrufen und aufzählen.

Weitere Informationen zum Erstellen von WMI-Abfragezeichenfolgen finden Sie unter Abfragen mit WQL sowie in der Referenz zu WQL.

[in] lFlags

Dieser Parameter kann einen der folgenden Werte annehmen.

WBEM_FLAG_USE_AMENDED_QUALIFIERS

Wenn dieses Flag festgelegt ist, ruft WMI die geänderten Qualifizierer ab, die im lokalisierten Namespace des Gebietsschemas der aktuellen Verbindung gespeichert sind. Wenn nicht festgelegt, werden nur die im unmittelbaren Namespace gespeicherten Qualifizierer abgerufen.

WBEM_FLAG_BIDIRECTIONAL

Dieses Flag bewirkt, dass WMI Zeiger auf Objekte der Enumeration behält, bis der Client den Enumerator freigibt.

WBEM_FLAG_SEND_STATUS

Dieses Flag registriert eine Anforderung bei WMI, um zwischengeschaltete status Berichte über die Implementierung von IWbemObjectSink::SetStatus auf dem Client zu empfangen. Die Anbieterimplementierung muss zwischengeschaltete status Berichterstellung unterstützen, damit sich dieses Flag ändert.

WBEM_FLAG_ENSURE_LOCATABLE

Dieses Flag stellt sicher, dass zurückgegebene Objekte genügend Informationen enthalten, sodass die Systemeigenschaften wie __PATH, __RELPATH und __SERVER nicht NULL sind.

WBEM_FLAG_PROTOTYPE

Dieses Flag wird für das Erstellen von Prototypen verwendet. Die Abfrage wird nicht ausgeführt, sondern ein Objekt zurückgegeben, das wie ein typisches Ergebnisobjekt aussieht.

WBEM_FLAG_DIRECT_READ

Dieses Flag bewirkt den direkten Zugriff auf den Anbieter für die angegebene Klasse ohne Berücksichtigung der übergeordneten Klasse oder Unterklassen.

[in] pCtx

In der Regel NULL. Andernfalls ist dies ein Zeiger auf ein IWbemContext-Objekt , das der Anbieter verwenden kann, um die angeforderten Klassen oder Instanzen zurückzugeben. Die Werte im Kontextobjekt müssen in der Dokumentation für den Anbieter angegeben werden. Weitere Informationen zu diesem Parameter finden Sie unter Ausführen von Aufrufen an WMI.

[in] pResponseHandler

Zeiger auf die Implementierung von IWbemObjectSink des Aufrufers. Dieser Handler empfängt die Objekte im Abfrageresultset, sobald sie verfügbar sind. Wenn ein Fehlercode zurückgegeben wird, wird der angegebene IWbemObjectSink-Zeiger nicht verwendet. Wenn WBEM_S_NO_ERROR zurückgegeben wird, wird die IWbemObjectSink-Implementierung des Benutzers aufgerufen, um das Ergebnis des Vorgangs anzugeben. Windows-Verwaltungsinstrumentation (WMI) ruft IWbemObjectSink::Indicate mit den Objekten beliebig oft auf, gefolgt von einem einzelnen Aufruf von IWbemObjectSink::SetStatus, um die endgültige status anzugeben.

WMI ruft nur AddRef auf den Zeiger auf, wenn WBEM_S_NO_ERROR zurückgibt. Wenn ein Fehlercode zurückgegeben wird, ist die Verweisanzahl identisch mit der beim Eintrag. Eine ausführliche Erläuterung der Methoden des asynchronen Aufrufens finden Sie unter Aufrufen einer Methode.

Rückgabewert

Diese Methode gibt ein HRESULT zurück, das den Status des Methodenaufrufs angibt. In der folgenden Liste ist der in einem HRESULT enthaltene Wert aufgeführt.

Wenn ein Fehler auftritt, können Sie Informationen von der COM-Funktion GetErrorInfo abrufen.

Andere Fehlercodes werden an die Objektsenke zurückgegeben, die durch den pResponseHandler-Parameter angegeben wird.

Com-spezifische Fehlercodes werden möglicherweise zurückgegeben, wenn Netzwerkprobleme dazu führen, dass die Remoteverbindung mit WMI verloren geht.

Wenn dies abgeschlossen ist, kann ein instance Anbieter entweder mit dem Rückgabecode von ExecQueryAsync oder über einen Aufruf von SetStatus über pResponseHandler Erfolg oder Fehler melden. Wenn Sie SetStatus aufrufen, hat der über pResponseHandler gesendete Rückgabecode Vorrang.

Hinweise

Es gibt Grenzwerte für die Anzahl von AND- und OR-Schlüsselwörtern, die in WQL-Abfragen verwendet werden können. Eine große Anzahl an WQL-Schlüsselwörtern, die in einer komplexen Abfrage verwendet werden, kann dazu führen, dass WMI den Fehlercode WBEM_E_QUOTA_VIOLATION als HRESULT-Wert zurückgibt. Der Grenzwert für WQL-Schlüsselwörter hängt davon ab, wie komplex die Abfrage ist.

Die IWbemObjectSink::Indicate-Methode des Aufrufers kann aufgerufen werden, um zeitweilige status zu melden. Die IWbemObjectSink::SetStatus-Methode wird aufgerufen, um das Ende des Resultsets anzugeben.

Wenn ein Anbieter die Abfrageverarbeitung nicht unterstützt, kann sie von WMI unterstützt werden. Eine Anbieterimplementierung der Abfrageverarbeitung ist jedoch wahrscheinlich effizienter als die WMI-Version. Um Abfragen zu unterstützen, muss Ihr instance Anbieter die ExecQueryAsync-Methode implementieren. Wenn ein Anbieter ExecQueryAsync unterstützt, sendet WMI eine einfache unäre SELECT-Abfrage direkt über den strQuery-Parameter an den Anbieter, und der Anbieter muss die Abfrage analysieren und die relevanten Instanzen zurückgeben. Der Anbieter muss die Abfrage analysieren, da WMI die Abfrage nicht ändert , auch wenn die Abfrage in WQL geschrieben wird.

Um WMI für die Abfrageverarbeitung zu verwenden, legen Sie die QuerySupportLevels-Eigenschaft nicht in Ihrem __InstanceProviderRegistration fest. Wenn Sie dies tun, ruft WMI Ihre Implementierung von CreateInstanceEnumAsync auf und filtert die Ergebnisse nach, sodass der Aufrufer nur die Instanzen abruft, die die Abfragekriterien erfüllen.

Das folgende Beispiel zeigt eine typische instance Anbieterimplementierung von ExecQueryAsync. Die IWbemObjectSink::SetStatus-Methode wird aufgerufen, um das Ende des Resultsets anzugeben. Er kann auch ohne dazwischen liegende Aufrufe von IWbemObjectSink::Geben Sie an , ob Fehlerbedingungen auftreten.

Da der Rückruf möglicherweise nicht auf derselben Authentifizierungsebene zurückgegeben wird, wie es für den Client erforderlich ist, empfiehlt es sich, anstelle der asynchronen Kommunikation eine semisynchrone Kommunikation zu verwenden. Wenn Sie asynchrone Kommunikation benötigen, finden Sie weitere Informationen unter Aufrufen einer Methode.

Weitere Informationen finden Sie unter IWbemServices::ExecQuery und Aufrufen einer Methode.

HRESULT CStdProvider::ExecQueryAsync( 
            /* [in] */ BSTR strQueryLanguage,
            /* [in] */ BSTR strQuery,
            /* [in] */ long lFlags,
            /* [in] */ IWbemContext __RPC_FAR *pCtx,
            /* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
            )
{
   IWbemClassObject *pClass = 0;

// Parse the query.
//   You must implement ParseQuery().
    if (!ParseQuery(strQuery))  return WBEM_E_PROVIDER_NOT_CAPABLE;   

// Assume there is an IWbemServices pointer (m_pSvc) available to 
// retrieve the class definition.
    
    HRESULT hRes = m_pSvc->GetObject(L"ClassName", 0, NULL, &pClass, 0);
    if (FAILED(hRes))
        return hRes;

// Call a method to determine number of instances returned.
// You need to implement the GetNumberInst function.
    int iNumInst = GetNumberInst();

// Now loop through the private source and create each   
// instance which is part of the result set of the query.
    for (int iCnt = 0 ; iCnt < iNumInst ; iCnt++)
    {
// Prepare an empty object to receive the class definition.
         IWbemClassObject *pNextInst = 0;
         hRes = pClass->SpawnInstance(0, &pNextInst);

// Create the instance.
//   You must implement FillInst().
         /*FillInst(pNextInst, iCnt);*/ 

// Deliver the class to WMI.
         pResponseHandler->Indicate(1, &pNextInst);
         pNextInst->Release( );
    }

// Clean up memory
    pClass->Release();
  
// Send finish message to WMI.

    pResponseHandler->SetStatus(0, hRes, 0, 0);

    return hRes;
}

Im vorherigen Beispiel ruft der instance Anbieter einen Thread von WMI ab, um die erforderlichen Synchronisierungsvorgänge auszuführen. Sie können die AddRef-Methode der Senke aufrufen und einen weiteren Thread erstellen, um die Objekte im Resultset bereitzustellen. Durch das Erstellen eines weiteren Threads kann der aktuelle Thread zu WMI zurückkehren, ohne den Threadpool zu erschöpfen. Ob der Anbieter den Einzelthreadentwurf oder den Dual-Thread-Entwurf auswählt, hängt davon ab, wie lange der Anbieter die Verwendung des WMI-Threads plant. Es gibt keine festen Regeln. Experimentieren kann Ihnen helfen, zu bestimmen, wie sich Ihr Entwurf auf die WMI-Leistung auswirkt.

Hinweis Wenn Anbieter ExecQueryAsync implementieren, wird erwartet, dass sie standardmäßig das richtige Resultset basierend auf der Abfrage zurückgeben. Wenn ein Anbieter das richtige Resultset nicht problemlos zurückgeben kann, gibt er möglicherweise eine Obermenge der Ergebnisse zurück und fordert an, dass WMI die Nachfilterung vor der Übermittlung der Objekte an den Client durchführen muss, um sicherzustellen, dass das Resultset korrekt ist. Dazu ruft der Anbieter SetStatus für die Senke auf, die für seine ExecQueryAsync-Implementierung bereitgestellt wird, mit den folgenden Flags.
 
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS,
    WBEM_REQUIREMENTS_START_POSTFILTER, 0, 0);
Hinweis Alle anschließend an den WMI-Dienst gesendeten Objekte werden gefiltert. Der Anbieter kann die Nachfilterung in mid-stream mithilfe des folgenden Aufrufs deaktivieren.
 
// The pSink variable is of type IWbemObjectSink*
pSink->SetStatus(WBEM_STATUS_REQUIREMENTS, 
    WBEM_REQUIREMENTS_STOP_POSTFILTER, 0, 0);

Anforderungen

   
Unterstützte Mindestversion (Client) Windows Vista
Unterstützte Mindestversion (Server) Windows Server 2008
Zielplattform Windows
Kopfzeile wbemcli.h (include Wbemidl.h)
Bibliothek 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

Weitere Informationen

Aufrufen einer Methode

IWbemObjectSink::SetStatus

IWbemServices

IWbemServices::ExecQuery

Abfragen mit WQL