From: Jacek Caban Subject: atl100: Added AtlComModuleUnregisterServer implementation Message-Id: <50F3F401.3020902@codeweavers.com> Date: Mon, 14 Jan 2013 13:03:13 +0100 --- dlls/atl100/atl.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ dlls/atl100/atl100.spec | 2 +- dlls/atl80/atl80.spec | 2 +- include/atlbase.h | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/dlls/atl100/atl.c b/dlls/atl100/atl.c index 099513a..28b8cbc 100644 --- a/dlls/atl100/atl.c +++ b/dlls/atl100/atl.c @@ -454,6 +454,56 @@ HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE *pm, REFCLSID rclsid, } /*********************************************************************** + * AtlComModuleUnregisterServer [atl100.22] + */ +HRESULT WINAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE *mod, BOOL bRegTypeLib, const CLSID *clsid) +{ + const struct _ATL_CATMAP_ENTRY *catmap; + _ATL_OBJMAP_ENTRY **iter; + HRESULT hres; + + TRACE("(%p %x %s)\n", mod, bRegTypeLib, debugstr_guid(clsid)); + + for(iter = mod->m_ppAutoObjMapFirst; iter < mod->m_ppAutoObjMapLast; iter++) { + if(!*iter || (clsid && !IsEqualCLSID((*iter)->pclsid, clsid))) + continue; + + TRACE("Unregistering clsid %s\n", debugstr_guid((*iter)->pclsid)); + + catmap = (*iter)->pfnGetCategoryMap(); + if(catmap) { + hres = AtlRegisterClassCategoriesHelper((*iter)->pclsid, catmap, FALSE); + if(FAILED(hres)) + return hres; + } + + hres = (*iter)->pfnUpdateRegistry(FALSE); + if(FAILED(hres)) + return hres; + } + + if(bRegTypeLib) { + ITypeLib *typelib; + TLIBATTR *attr; + BSTR path; + + hres = AtlLoadTypeLib(mod->m_hInstTypeLib, NULL, &path, &typelib); + if(FAILED(hres)) + return hres; + + SysFreeString(path); + hres = ITypeLib_GetLibAttr(typelib, &attr); + if(SUCCEEDED(hres)) + hres = UnRegisterTypeLib(&attr->guid, attr->wMajorVerNum, attr->wMinorVerNum, attr->lcid, attr->syskind); + ITypeLib_Release(typelib); + if(FAILED(hres)) + return hres; + } + + return S_OK; +} + +/*********************************************************************** * AtlRegisterClassCategoriesHelper [atl100.49] */ HRESULT WINAPI AtlRegisterClassCategoriesHelper(REFCLSID clsid, const struct _ATL_CATMAP_ENTRY *catmap, BOOL reg) diff --git a/dlls/atl100/atl100.spec b/dlls/atl100/atl100.spec index b30b839..1eae2ed 100644 --- a/dlls/atl100/atl100.spec +++ b/dlls/atl100/atl100.spec @@ -6,7 +6,7 @@ 15 stdcall AtlComModuleGetClassObject(ptr ptr ptr ptr) 17 stub AtlComModuleRegisterClassObjects 20 stub AtlComModuleRevokeClassObjects -22 stub AtlComModuleUnregisterServer +22 stdcall AtlComModuleUnregisterServer(ptr long ptr) 23 stdcall AtlUpdateRegistryFromResourceD(long wstr long ptr ptr) 24 stdcall AtlWaitWithMessageLoop(long) 25 stub AtlSetErrorInfo diff --git a/dlls/atl80/atl80.spec b/dlls/atl80/atl80.spec index 7719257..bf36bbc 100644 --- a/dlls/atl80/atl80.spec +++ b/dlls/atl80/atl80.spec @@ -8,7 +8,7 @@ 18 stdcall AtlComModuleRegisterServer(ptr long ptr) 19 stdcall AtlRegisterTypeLib(ptr wstr) 20 stub AtlComModuleRevokeClassObjects -22 stub AtlComModuleUnregisterServer +22 stdcall AtlComModuleUnregisterServer(ptr long ptr) atl100.AtlComModuleUnregisterServer 23 stdcall AtlUpdateRegistryFromResourceD(long wstr long ptr ptr) atl100.AtlUpdateRegistryFromResourceD 24 stdcall AtlWaitWithMessageLoop(long) atl100.AtlWaitWithMessageLoop 25 stub AtlSetErrorInfo diff --git a/include/atlbase.h b/include/atlbase.h index d0dd96c..84a22b4 100644 --- a/include/atlbase.h +++ b/include/atlbase.h @@ -255,6 +255,7 @@ HRESULT WINAPI AtlLoadTypeLib(HINSTANCE,LPCOLESTR,BSTR*,ITypeLib**); HRESULT WINAPI AtlRegisterTypeLib(HINSTANCE,LPCOLESTR); HRESULT WINAPI AtlRegisterClassCategoriesHelper(REFCLSID,const struct _ATL_CATMAP_ENTRY*,BOOL); HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE*,REFCLSID,REFIID,void**); +HRESULT WINAPI AtlComModuleUnregisterServer(_ATL_COM_MODULE*,BOOL,const CLSID*); BOOL WINAPI AtlWaitWithMessageLoop(HANDLE); #endif /* __WINE_ATLBASE_H__ */