Module: wine Branch: master Commit: 4356e4941192332d4e927efc392cb8fd12948770 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4356e4941192332d4e927efc39...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 2 20:13:56 2010 +0100
atl: The object map entries for version 1 don't have the last two fields.
---
dlls/atl/atl_main.c | 32 +++++++++++++++++++++----------- dlls/atl/atlbase.h | 22 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c index 374b0d2..75f9a11 100644 --- a/dlls/atl/atl_main.c +++ b/dlls/atl/atl_main.c @@ -97,6 +97,19 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE return S_OK; }
+static _ATL_OBJMAP_ENTRYW_V1 *get_objmap_entry( _ATL_MODULEW *mod, unsigned int index ) +{ + _ATL_OBJMAP_ENTRYW_V1 *ret; + + if (mod->cbSize == ATLVer1Size) + ret = (_ATL_OBJMAP_ENTRYW_V1 *)mod->m_pObjMap + index; + else + ret = (_ATL_OBJMAP_ENTRYW_V1 *)(mod->m_pObjMap + index); + + if (!ret->pclsid) ret = NULL; + return ret; +} + HRESULT WINAPI AtlModuleLoadTypeLib(_ATL_MODULEW *pM, LPCOLESTR lpszIndex, BSTR *pbstrPath, ITypeLib **ppTypeLib) { @@ -158,6 +171,7 @@ HRESULT WINAPI AtlModuleAddTermFunc(_ATL_MODULEW *pM, _ATL_TERMFUNC *pFunc, DWOR HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContext, DWORD dwFlags) { + _ATL_OBJMAP_ENTRYW_V1 *obj; HRESULT hRes = S_OK; int i=0;
@@ -166,10 +180,9 @@ HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContex if (pM == NULL) return E_INVALIDARG;
- while(pM->m_pObjMap[i].pclsid != NULL) + while ((obj = get_objmap_entry( pM, i++ ))) { IUnknown* pUnknown; - _ATL_OBJMAP_ENTRYW *obj = &(pM->m_pObjMap[i]); HRESULT rc;
TRACE("Registering object %i\n",i); @@ -185,7 +198,6 @@ HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEW *pM, DWORD dwClsContex IUnknown_Release(pUnknown); } } - i++; }
return hRes; @@ -269,6 +281,7 @@ HRESULT WINAPI AtlInternalQueryInterface(void* this, const _ATL_INTMAP_ENTRY* pE */ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* clsid) { + const _ATL_OBJMAP_ENTRYW_V1 *obj; int i; HRESULT hRes;
@@ -277,12 +290,10 @@ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const if (pM == NULL) return E_INVALIDARG;
- for (i = 0; pM->m_pObjMap[i].pclsid != NULL; i++) /* register CLSIDs */ + for (i = 0; (obj = get_objmap_entry( pM, i )) != NULL; i++) /* register CLSIDs */ { - if (!clsid || IsEqualCLSID(pM->m_pObjMap[i].pclsid, clsid)) + if (!clsid || IsEqualCLSID(obj->pclsid, clsid)) { - const _ATL_OBJMAP_ENTRYW *obj = &pM->m_pObjMap[i]; - TRACE("Registering clsid %s\n", debugstr_guid(obj->pclsid)); hRes = obj->pfnUpdateRegistry(TRUE); /* register */ if (FAILED(hRes)) @@ -351,6 +362,7 @@ HRESULT WINAPI AtlUnmarshalPtr(IStream *stm, const IID *iid, IUnknown **ppUnk) HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { + _ATL_OBJMAP_ENTRYW_V1 *obj; int i; HRESULT hres = CLASS_E_CLASSNOTAVAILABLE;
@@ -359,12 +371,10 @@ HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid, if (pm == NULL) return E_INVALIDARG;
- for (i = 0; pm->m_pObjMap[i].pclsid != NULL; i++) + for (i = 0; (obj = get_objmap_entry( pm, i )) != NULL; i++) { - if (IsEqualCLSID(pm->m_pObjMap[i].pclsid, rclsid)) + if (IsEqualCLSID(obj->pclsid, rclsid)) { - _ATL_OBJMAP_ENTRYW *obj = &pm->m_pObjMap[i]; - TRACE("found object %i\n", i); if (obj->pfnGetClassObject) { diff --git a/dlls/atl/atlbase.h b/dlls/atl/atlbase.h index 49c13e4..59cdddf 100644 --- a/dlls/atl/atlbase.h +++ b/dlls/atl/atlbase.h @@ -33,6 +33,28 @@ typedef LPCWSTR (WINAPI _ATL_DESCRIPTIONFUNCW)(void); typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)(void); typedef void (WINAPI _ATL_TERMFUNC)(DWORD dw);
+typedef struct _ATL_OBJMAP_ENTRYA_V1_TAG +{ + const CLSID* pclsid; + HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); + _ATL_CREATORFUNC* pfnGetClassObject; + _ATL_CREATORFUNC* pfnCreateInstance; + IUnknown* pCF; + DWORD dwRegister; + _ATL_DESCRIPTIONFUNCA* pfnGetObjectDescription; +}_ATL_OBJMAP_ENTRYA_V1; + +typedef struct _ATL_OBJMAP_ENTRYW_V1_TAG +{ + const CLSID* pclsid; + HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister); + _ATL_CREATORFUNC* pfnGetClassObject; + _ATL_CREATORFUNC* pfnCreateInstance; + IUnknown* pCF; + DWORD dwRegister; + _ATL_DESCRIPTIONFUNCW* pfnGetObjectDescription; +} _ATL_OBJMAP_ENTRYW_V1; + typedef struct _ATL_OBJMAP_ENTRYA_TAG { const CLSID* pclsid;