Jacek Caban : atl100: Added AtlComModuleGetClassObject implementation ( based on AtlModuleGetClassObject).
Alexandre Julliard
julliard at winehq.org
Fri Dec 14 14:10:00 CST 2012
Module: wine
Branch: master
Commit: 7d3046cd02120c19ddf4fe4eb6f3d46028d53abd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d3046cd02120c19ddf4fe4eb6f3d46028d53abd
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Dec 14 11:58:10 2012 +0100
atl100: Added AtlComModuleGetClassObject implementation (based on AtlModuleGetClassObject).
---
dlls/atl100/atl.c | 28 ++++++++++++++++++++++++++++
dlls/atl100/atl100.spec | 2 +-
dlls/atl80/atl80.spec | 2 +-
include/atlbase.h | 12 +++++++++++-
4 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/dlls/atl100/atl.c b/dlls/atl100/atl.c
index d2e49c6..c0bc2ae 100644
--- a/dlls/atl100/atl.c
+++ b/dlls/atl100/atl.c
@@ -304,6 +304,34 @@ void WINAPI AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE *pM, _AtlCreateWndData
}
/***********************************************************************
+ * AtlComModuleGetClassObject [atl100.15]
+ */
+HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE *pm, REFCLSID rclsid, REFIID riid, void **ppv)
+{
+ _ATL_OBJMAP_ENTRY **iter;
+ HRESULT hres;
+
+ TRACE("(%p %s %s %p)\n", pm, debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if(!pm)
+ return E_INVALIDARG;
+
+ for(iter = pm->m_ppAutoObjMapFirst; iter < pm->m_ppAutoObjMapLast; iter++) {
+ if(IsEqualCLSID((*iter)->pclsid, rclsid) && (*iter)->pfnGetClassObject) {
+ if(!(*iter)->pCF)
+ hres = (*iter)->pfnGetClassObject((*iter)->pfnCreateInstance, &IID_IUnknown, (void**)&(*iter)->pCF);
+ if((*iter)->pCF)
+ hres = IUnknown_QueryInterface((*iter)->pCF, riid, ppv);
+ TRACE("returning %p (%08x)\n", *ppv, hres);
+ return hres;
+ }
+ }
+
+ WARN("Class %s not found\n", debugstr_guid(rclsid));
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/***********************************************************************
* 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 1c36112..6c959d6 100644
--- a/dlls/atl100/atl100.spec
+++ b/dlls/atl100/atl100.spec
@@ -3,7 +3,7 @@
12 stdcall AtlFreeMarshalStream(ptr)
13 stdcall AtlMarshalPtrInProc(ptr ptr ptr)
14 stdcall AtlUnmarshalPtr(ptr ptr ptr)
-15 stub AtlComModuleGetClassObject
+15 stdcall AtlComModuleGetClassObject(ptr ptr ptr ptr)
17 stub AtlComModuleRegisterClassObjects
20 stub AtlComModuleRevokeClassObjects
22 stub AtlComModuleUnregisterServer
diff --git a/dlls/atl80/atl80.spec b/dlls/atl80/atl80.spec
index 1586e10..1c940dd 100644
--- a/dlls/atl80/atl80.spec
+++ b/dlls/atl80/atl80.spec
@@ -3,7 +3,7 @@
12 stdcall AtlFreeMarshalStream(ptr) atl100.AtlFreeMarshalStream
13 stdcall AtlMarshalPtrInProc(ptr ptr ptr) atl100.AtlMarshalPtrInProc
14 stdcall AtlUnmarshalPtr(ptr ptr ptr) atl100.AtlUnmarshalPtr
-15 stub AtlComModuleGetClassObject
+15 stdcall AtlComModuleGetClassObject(ptr ptr ptr ptr) atl100.AtlComModuleGetClassObject
17 stub AtlComModuleRegisterClassObjects
18 stub AtlComModuleRegisterServer(ptr long ptr)
19 stub AtlRegisterTypeLib(ptr wstr)
diff --git a/include/atlbase.h b/include/atlbase.h
index 37d60c8..6c29ad9 100644
--- a/include/atlbase.h
+++ b/include/atlbase.h
@@ -89,7 +89,7 @@ typedef struct _ATL_OBJMAP_ENTRYW_TAG
_ATL_DESCRIPTIONFUNCW* pfnGetObjectDescription;
_ATL_CATMAPFUNC* pfnGetCategoryMap;
void (WINAPI *pfnObjectMain)(BOOL bStarting);
-} _ATL_OBJMAP_ENTRYW;
+} _ATL_OBJMAP_ENTRYW, _ATL_OBJMAP_ENTRY30, _ATL_OBJMAP_ENTRY;
typedef struct _ATL_TERMFUNC_ELEM_TAG
@@ -183,6 +183,15 @@ typedef struct _ATL_WIN_MODULE70
CSimpleArray /* <ATOM> */ m_rgWindowClassAtoms;
} _ATL_WIN_MODULE70;
+typedef struct _ATL_COM_MODULE70
+{
+ UINT cbSize;
+ HINSTANCE m_hInstTypeLib;
+ _ATL_OBJMAP_ENTRY **m_ppAutoObjMapFirst;
+ _ATL_OBJMAP_ENTRY **m_ppAutoObjMapLast;
+ CComCriticalSection m_csObjMap;
+} _ATL_COM_MODULE70, _ATL_COM_MODULE;
+
#if _ATL_VER >= _ATL_VER_70
typedef _ATL_MODULE70 _ATL_MODULE;
typedef _ATL_WIN_MODULE70 _ATL_WIN_MODULE;
@@ -231,5 +240,6 @@ HRESULT WINAPI AtlCreateRegistrar(IRegistrar**);
HRESULT WINAPI AtlUpdateRegistryFromResourceD(HINSTANCE,LPCOLESTR,BOOL,struct _ATL_REGMAP_ENTRY*,IRegistrar*);
HRESULT WINAPI AtlLoadTypeLib(HINSTANCE,LPCOLESTR,BSTR*,ITypeLib**);
HRESULT WINAPI AtlRegisterClassCategoriesHelper(REFCLSID,const struct _ATL_CATMAP_ENTRY*,BOOL);
+HRESULT WINAPI AtlComModuleGetClassObject(_ATL_COM_MODULE*,REFCLSID,REFIID,void**);
#endif /* __WINE_ATLBASE_H__ */
More information about the wine-cvs
mailing list