Jacek Caban : atl100: Added AtlComModuleUnregisterServer implementation.

Alexandre Julliard julliard at winehq.org
Mon Jan 14 15:55:50 CST 2013


Module: wine
Branch: master
Commit: ca5ded28734fad465bd9a435e2544ce395fbf0a8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ca5ded28734fad465bd9a435e2544ce395fbf0a8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jan 14 13:03:13 2013 +0100

atl100: Added AtlComModuleUnregisterServer implementation.

---

 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__ */




More information about the wine-cvs mailing list