Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Lädt Debugsymbole mithilfe der angegebenen Rückrufmethode.
Syntax
int LoadSymbolsFromCallback(
uint ulAppDomainID,
Guid guidModule,
object pUnkMetadataImport,
object pUnkCorDebugModule,
string bstrModuleName,
string bstrSymSearchPath,
object pCallback
);
Parameter
ulAppDomainID
[in] Bezeichner der Anwendung Standard.
guidModule
[in] Eindeutiger Bezeichner des Moduls.
pUnkMetadataImport
[in] Objekt, das die Symbolmetadaten enthält.
pUnkCorDebugModule
[in] Objekt, das die ICorDebugModule-Schnittstelle implementiert.
bstrModuleName
[in] Name des Moduls.
bstrSymSearchPath
[in] Pfad zum Suchen nach der Symboldatei.
pCallback
[in] Objekt, das die Rückrufmethode darstellt.
Rückgabewert
Wenn die Ausführung erfolgreich ist, wird S_OK, andernfalls ein Fehlercode zurückgegeben.
Beispiel
Das folgende Beispiel zeigt, wie Sie diese Methode für ein CDebugSymbolProvider -Objekt implementieren, das die IDebugComPlusSymbolProvider2-Schnittstelle verfügbar macht.
HRESULT CDebugSymbolProvider::LoadSymbolsFromCallback(
ULONG32 ulAppDomainID,
GUID guidModule,
IUnknown *pMetadataImport,
IUnknown * _pCorModule,
BSTR bstrModule,
BSTR bstrSearchPath,
IUnknown *pCallback)
{
EMIT_TICK_COUNT("Entry -- Loading symbols for the following target:");
USES_CONVERSION;
EmitTickCount(W2A(bstrModule));
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);
bool fSymbolsLoaded = false;
DWORD dwCurrentState = 0;
ASSERT(IsValidObjectPtr(this, CDebugSymbolProvider));
ASSERT(IsValidInterfacePtr(pMetadataImport, IUnknown));
METHOD_ENTRY( CDebugSymbolProvider::LoadSymbol );
IfFalseGo( pMetadataImport, E_INVALIDARG );
IfFalseGo( _pCorModule, E_INVALIDARG );
IfFailGo( pMetadataImport->QueryInterface( IID_IMetaDataImport,
(void**)&pMetadata) );
IfFailGo( _pCorModule->QueryInterface( IID_ICorDebugModule,
(void**)&pCorModule) );
ASSERT(guidModule != GUID_NULL);
fAlreadyLoaded = GetModule( idModule, &pmodule ) == S_OK;
IfNullGo( pmoduleNew = new CModule, E_OUTOFMEMORY );
//
// We are now allowing modules to be created that do not have SymReaders.
// It is likely there are a number of corner cases being ignored
// that will require knowledge of the hr result below.
//
dwCurrentState = m_pSymProvGroup ? m_pSymProvGroup->GetCurrentState() : 0;
HRESULT hrLoad = pmoduleNew->Create( idModule,
dwCurrentState,
pMetadata,
pCorModule,
bstrModule,
bstrSearchPath,
pCallback );
if (hrLoad == S_OK)
{
fSymbolsLoaded = true;
}
// Remove the old module
if (fAlreadyLoaded)
{
IfFailGo(pmoduleNew->AddEquivalentModulesFrom(pmodule));
RemoveModule( pmodule );
}
IfFailGo( AddModule( pmoduleNew ) );
Error:
RELEASE (pmodule);
RELEASE (pmoduleNew);
if (SUCCEEDED(hr) && !fSymbolsLoaded)
{
hr = hrLoad;
}
METHOD_EXIT( CDebugSymbolProvider::LoadSymbol, hr );
EMIT_TICK_COUNT("Exit");
return hr;
}