Freigeben über


IDebugBinder3::GetMemoryContext64

Konvertiert ein Objekt in einen Speicherort oder eine 64-Bit-Speicheradresse Arbeitsspeicher Elementkontext.

HRESULT GetMemoryContext64 (
   IDebugField*           pField,
   UINT64                 uConstant,
   IDebugMemoryContext2** ppMemCxt
);
int GetMemoryContext64 (
   IDebugField              pField,
   ulong                    uConstant,
   out IDebugMemoryContext2 ppMemCxt
);

Parameter

  • pField
    [in] IDebugField , das das Objekt beschreibt, der gesucht werden soll. Wenn NULL, dwConstant-Version verwenden.

  • uConstant
    [in] Eine 64-Bit-Speicheradresse, wie 0x50000000.

  • ppMemCxt
    [out] Gibt die IDebugMemoryContext2-Schnittstelle, die die Adresse des Objekts darstellt, oder die Adresse im Arbeitsspeicher zurück.

Rückgabewert

Bei Erfolg gibt S_OKzurück. andernfalls gibt einen Fehlercode zurück.

Beispiel

Das folgende Beispiel erstellt ein Objekt, das die IDebugBinder3-Schnittstelle implementiert und mit dieser Methode den Kontext Arbeitsspeicher abrufen.

HRESULT CValueProperty::GetMemoryContext ( IDebugMemoryContext2** out_ppMemoryContext )
{
    // precondition
    REQUIRE( NULL != out_ppMemoryContext );

    if (NULL == out_ppMemoryContext)
        return E_POINTER;

    *out_ppMemoryContext = NULL;

    INVARIANT( this );

    if (!this->ClassInvariant())
        return E_UNEXPECTED;

    if (VT_EMPTY == this->m_VarValue.vt)
    {
        return E_FAIL;
    }

    // function body
    if (NULL != this->m_pBinder)
    {
        UINT64 dwOffset = 0;

        DEBUG_PROPERTY_INFO dpInfo;
        HRESULT HR = this->GetPropertyInfo(DEBUGPROP_INFO_VALUE,
                                           10, // RADIX
                                           DEFAULT_TIMEOUT,
                                           NULL,
                                           0,
                                           &dpInfo);
        if (ENSURE( S_OK == HR ))
        {
            REQUIRE( NULL != dpInfo.bstrValue );
            REQUIRE( NULL == dpInfo.bstrName );
            REQUIRE( NULL == dpInfo.bstrFullName );
            REQUIRE( NULL == dpInfo.bstrType );
            REQUIRE( NULL == dpInfo.pProperty );

            wchar_t * end;
            dwOffset = _wcstoui64(dpInfo.bstrValue, &end, 0); // base 0 to allow 0x if it's ever output
            ::SysFreeString(dpInfo.bstrValue);
        }

        if (CComQIPtr<IDebugBinder3> binder3 = this->m_pBinder)
            HR = binder3->GetMemoryContext64(NULL, dwOffset, out_ppMemoryContext);
        else
            HR = this->m_pBinder->GetMemoryContext(NULL, (DWORD)(__int32)dwOffset, out_ppMemoryContext);

        if (ENSURE( S_OK == HR ))
        {
            REQUIRE( NULL != *out_ppMemoryContext );
        }
    }

    // postcondition
    INVARIANT( this );

    HRESULT HR = E_FAIL;

    if (NULL != *out_ppMemoryContext)
    {
        HR = S_OK;
    }

    return HR;
}

Siehe auch

Referenz

IDebugBinder3