Condividi tramite


IDebugComPlusSymbolProvider2:: LoadSymbolsFromStreamWithCorModule

I simboli di debug del caricamento da un flusso di dati fornito il ICorDebugModule oggetto.

HRESULT LoadSymbolsFromStreamWithCorModule(
   ULONG32   ulAppDomainID,
   GUID      guidModule,
   ULONGLONG baseAddress,
   IUnknown* pUnkMetadataImport,
   IUnknown* pUnkCorDebugModule,
   IStream*  pStream
);
int LoadSymbolsFromStreamWithCorModule(
   uint    ulAppDomainID,
   Guid    guidModule,
   ulong   baseAddress,
   object  pUnkMetadataImport,
   object  pUnkCorDebugModule,
   IStream pStream
);

Parametri

  • ulAppDomainID
    [in] Identificatore del dominio applicazione.

  • guidModule
    [in] Identificatore univoco del modulo.

  • baseAddress
    [in] indirizzo di memoria di base.

  • pUnkMetadataImport
    [in] Oggetto che contiene i metadati del simbolo.

  • pUnkCorDebugModule
    [in] Oggetto che implementa Interfaccia ICorDebugModule.

  • pStream
    [in] Flusso di dati che contiene i simboli di debug da caricare.

Valore restituito

Se l'operazione riesce, restituisce S_OK; in caso contrario, restituisce un codice di errore.

Esempio

Nell'esempio seguente viene illustrato come implementare questo metodo per un oggetto di CDebugSymbolProvider che espone IDebugComPlusSymbolProvider2 l'interfaccia.

HRESULT CDebugSymbolProvider::LoadSymbolsFromStreamWithCorModule(
    ULONG32 ulAppDomainID,
    GUID guidModule,
    ULONGLONG baseOffset,
    IUnknown* pUnkMetadataImport,
    IUnknown* pUnkCorDebugModule,
    IStream* pStream
)
{
    CAutoLock Lock(this);

    HRESULT hr = S_OK;
    CComPtr<IMetaDataImport> pMetadata;
    CComPtr<ICorDebugModule> pCorModule;

    CModule* pmodule = NULL;
    CModule* pmoduleNew = NULL;
    bool fAlreadyLoaded = false;
    Module_ID idModule(ulAppDomainID, guidModule);
    DWORD dwCurrentState = 0;

    ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
    ASSERT(IsValidInterfacePtr(pUnkMetadataImport, IUnknown));

    METHOD_ENTRY( CDebugSymbolProvider::LoadSymbolsFromStream );

    IfFalseGo( pUnkMetadataImport, E_INVALIDARG );
    IfFalseGo( pUnkCorDebugModule, E_INVALIDARG );

    IfFailGo( pUnkMetadataImport->QueryInterface( IID_IMetaDataImport,
              (void**)&pMetadata) );

    IfFailGo( pUnkCorDebugModule->QueryInterface( IID_ICorDebugModule,
              (void**)&pCorModule) );

    ASSERT(guidModule != GUID_NULL);

    fAlreadyLoaded = GetModule( idModule, &pmodule ) == S_OK;

    IfNullGo( pmoduleNew = new CModule, E_OUTOFMEMORY );

    dwCurrentState = m_pSymProvGroup ? m_pSymProvGroup->GetCurrentState() : 0;

    IfFailGo( pmoduleNew->Create( idModule,
                                  dwCurrentState,
                                  pMetadata,
                                  pCorModule,
                                  pStream,
                                  baseOffset ) );

    if (fAlreadyLoaded)
    {
        IfFailGo(pmoduleNew->AddEquivalentModulesFrom(pmodule));
        RemoveModule(pmodule);
    }

    IfFailGo( AddModule( pmoduleNew ) );

Error:

    RELEASE (pmodule);
    RELEASE (pmoduleNew);

    METHOD_EXIT( CDebugSymbolProvider::LoadSymbolsFromStream, hr );

    return hr;
}

Vedere anche

Riferimenti

IDebugComPlusSymbolProvider2