Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Carga símbolos de depuración mediante el método de devolución de llamada especificado.
Sintaxis
int LoadSymbolsFromCallback(
uint ulAppDomainID,
Guid guidModule,
object pUnkMetadataImport,
object pUnkCorDebugModule,
string bstrModuleName,
string bstrSymSearchPath,
object pCallback
);
Parámetros
ulAppDomainID
[in] Identificador del dominio de aplicación.
guidModule
[in] Identificador único del módulo.
pUnkMetadataImport
[in] Objeto que contiene los metadatos del símbolo.
pUnkCorDebugModule
[in] Objeto que implementa la interfaz ICorDebugModule.
bstrModuleName
[in] Nombre del módulo.
bstrSymSearchPath
[in] Ruta de acceso para buscar el archivo de símbolos.
pCallback
[in] Objeto que representa el método de devolución de llamada.
Valor devuelto
Si la operación se realiza correctamente, devuelve S_OK; de lo contrario, devuelve un código de error.
Ejemplo
En el ejemplo siguiente se muestra cómo implementar este método para un objeto CDebugSymbolProvider que expone la interfaz IDebugComPlusSymbolProvider2 .
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;
}