String^ ModuleWrapper::GetNameFromMetaData() { IMetaDataImport* import; CheckHResult(Module->GetMetaDataInterface(IID_IMetaDataImport, (IUnknown**)&import)); WCHAR *name = new WCHAR[DefaultCharArraySize]; ULONG expectedSize; GUID mvid; HRESULT hResult = import->GetScopeProps(name, DefaultCharArraySize, &expectedSize, &mvid); if (FAILED(hResult)) { delete [] name; } CheckHResult(hResult); if (expectedSize > DefaultCharArraySize) { delete [] name; name = new WCHAR[expectedSize]; hResult = import->GetScopeProps(name, DefaultCharArraySize, &expectedSize, &mvid); if (FAILED(hResult)) { delete [] name; } CheckHResult(hResult); } String^ result = gcnew String(name); delete [] name; import->Release(); return result; }
// Gets a CordbModule that has the given metadata interface // // Arguments: // pIMetaData - metadata interface // // Returns: // CordbModule whose associated metadata matches the metadata interface provided here // Throws on error. Returns non-null // CordbModule * CordbAppDomain::GetModuleFromMetaDataInterface(IUnknown *pIMetaData) { HRESULT hr = S_OK; RSExtSmartPtr<IMetaDataImport> pImport; RSLockHolder lockHolder(GetProcess()->GetProcessLock()); // need for module enumeration // Grab the interface we need... hr = pIMetaData->QueryInterface(IID_IMetaDataImport, (void**)&pImport); if (FAILED(hr)) { ThrowHR(E_INVALIDARG); } // Get the mvid of the given module. GUID matchMVID; hr = pImport->GetScopeProps(NULL, 0, 0, &matchMVID); IfFailThrow(hr); CordbModule* pModule; HASHFIND findmodule; PrepopulateModules(); for (pModule = m_modules.FindFirst(&findmodule); pModule != NULL; pModule = m_modules.FindNext(&findmodule)) { IMetaDataImport * pImportCurrent = pModule->GetMetaDataImporter(); // throws _ASSERTE(pImportCurrent != NULL); // Get the mvid of this module GUID MVID; hr = pImportCurrent->GetScopeProps(NULL, 0, 0, &MVID); IfFailThrow(hr); if (MVID == matchMVID) { return pModule; } } ThrowHR(E_INVALIDARG); }