IDebugComPlusSymbolProvider2::LoadSymbolsFromCallback
載入偵錯符號,使用指定的回呼方法。
HRESULT LoadSymbolsFromCallback(
ULONG32 ulAppDomainID,
GUID guidModule,
IUnknown* pUnkMetadataImport,
IUnknown* pUnkCorDebugModule,
BSTR bstrModuleName,
BSTR bstrSymSearchPath,
IUnknown* pCallback
);
int LoadSymbolsFromCallback(
uint ulAppDomainID,
Guid guidModule,
object pUnkMetadataImport,
object pUnkCorDebugModule,
string bstrModuleName,
string bstrSymSearchPath,
object pCallback
);
參數
ulAppDomainID
[in]應用程式定義域的識別項。guidModule
[in]模組的唯一的識別項。pUnkMetadataImport
[in]包含符號的中繼資料的物件。pUnkCorDebugModule
[in]實作物件ICorDebugModule 介面。bstrModuleName
[in]模組的名稱。bstrSymSearchPath
[in]若要搜尋符號檔案的路徑。pCallback
[in]表示回呼方法的物件。
傳回值
如果成功的話,會傳回S_OK。 否則,會傳回錯誤碼。
範例
下列範例會示範如何實作這個方法,如 CDebugSymbolProvider 物件,公開 (expose) 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;
}