Freigeben über


IDebugHostExtensibility::CreateFunctionAlias-Methode (dbgmodel.h)

Die CreateFunctionAlias-Methode erstellt einen "Funktionsalias", einen "Schnellalias" für eine Methode, die in einer Erweiterung implementiert ist. Die Bedeutung dieses Alias ist hostspezifisch. Es kann die Ausdrucksauswertung des Hosts um die -Funktion erweitern oder etwas ganz anderes ausführen.

Für Debugtools für Windows einen Funktionsalias:

  • Auf die Ausdrucksauswertung kann über das @$-Symbol zugegriffen werden. Ein unter someName registrierter Funktionsalias kann im Evaluator über @$someName(...) aufgerufen werden.

  • Kann über die ältere Bang-Syntax aufgerufen werden. Der Aufruf "!someName arg1, arg2, ..." entspricht semantisch dem Ausführen der (dx)-Ausdrucksauswertung mit "@$someName(arg1, arg2, ...)" und der Anzeige des Ergebnisses.

Syntax

HRESULT CreateFunctionAlias(
  PCWSTR       aliasName,
  IModelObject *functionObject
);

Parameter

aliasName

Der (schnelle) Name des Alias, der erstellt/registriert wird.

functionObject

Eine Datenmodellmethode (eine in ein IModelObject geschachtelte IModelMethod), die die Funktionalität des Funktionsalias implementiert.

Rückgabewert

Diese Methode gibt HRESULT zurück, das den Erfolg oder Fehler angibt.

Hinweise

Beispielcode

class MySumFunction:
    public Microsoft::WRL::RuntimeClass<
        Microsoft::WRL::RuntimeClassFlags<
            Microsoft::WRL::RuntimeClassType::ClassicCom
            >,
        IModelMethod
        >
{
public:

    IFACEMETHOD(Call)(_In_ IModelObject * /*pContextObject*/, 
                      _In_ ULONG64 argCount, 
                      _In_reads_(argCount) IModelObject **ppArguments, 
                      _COM_Errorptr_ **ppResult)
    {
        HRESULT hr = S_OK;
        *ppResult = nullptr;

        if (argCount == 0)
        {
            return E_INVALIDARG;
        }

        int sum = 0;
        for (ULONG64 i = 0; i < argCount; ++i)
        {
            VARIANT vtValue;
            if (FAILED(ppArguments[i]->GetIntrinsicValueAs(&vtValue)))
            {
                return E_INVALIDARG;
            }
            sum += vtValue.lVal;
        }

        VARIANT vtSum;
        vtSum.vt = VT_I4;
        vtSum.lVal = sum;

        ComPtr<IModelObject> spSum;
        hr = GetManager()->CreateIntrinsicObject(ObjectIntrinsic, &vtSum, &spSum);
        if (SUCCEEDED(hr))
        {
            *ppResult = spSum.Detach();
        }

        return hr;
    }
};

// Create a method object and register it as a function alias.
ComPtr<MySumFunction> spSumFunc = Microsoft::WRL::Make<MySumFunction>();
if (spSumFunc != nullptr)
{
    VARIANT vtMethod;
    vtMethod.vt = VT_UNKNOWN;
    vtMethod.punkVal = static_cast<IModelMethod *>(spSumFunc.Get());
    
    ComPtr<IModelObject> spMethodObject;
    if (SUCCEEDED(GetManager()->CreateIntrinsicObject(ObjectMethod, 
                                                      &vtMethod, 
                                                      &spMethodObject)))
    {
        ComPtr<IDebugHostExtensibility> spHostExtensibility;
        if (SUCCEEDED(GetHost()->QueryInterface(IID_PPV_ARGS(&spHostExtensibility)))
        {
            if (SUCCEEDED(spHostExtensibility->CreateFunctionAlias(
                L"sumit",
                spMethodObject.Get())))
            {
                // sumit is now an alias for our function.  The meaning here 
                // is host specific.  For DbgEng, it means you can do things
                // like "dx @$sumit(5, 7, 8)" or "!sumit 5, 7, 8"
            }
        }
    }
}

Anforderungen

Anforderung Wert
Header dbgmodel.h

Weitere Informationen

IDebugHostExtensibility-Schnittstelle