First few ATL functions

Aric Stewart aric at codeweavers.com
Fri Jul 2 08:42:26 CDT 2004


First implementation of the Advanced Template Library, with just a few 
function implemented
-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.283
diff -u -w -r1.283 configure.ac
--- configure.ac	22 Jun 2004 02:42:05 -0000	1.283
+++ configure.ac	2 Jul 2004 13:41:12 -0000
@@ -1506,6 +1506,7 @@
 dlls/advapi32/Makefile
 dlls/advapi32/tests/Makefile
 dlls/amstream/Makefile
+dlls/atl/Makefile
 dlls/avicap32/Makefile
 dlls/avifil32/Makefile
 dlls/cabinet/Makefile
Index: dlls/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/Makefile.in,v
retrieving revision 1.219
diff -u -w -r1.219 Makefile.in
--- dlls/Makefile.in	3 Jun 2004 00:03:23 -0000	1.219
+++ dlls/Makefile.in	2 Jul 2004 13:41:13 -0000
@@ -18,6 +18,7 @@
 BASEDIRS = \
 	advapi32 \
 	amstream \
+	atl \
 	avicap32 \
 	avifil32 \
 	cabinet \
@@ -237,6 +238,7 @@
 	@WIN16_FILES@ \
 	advapi32.dll.so \
 	amstream.dll.so \
+	atl.dll.so \
 	avicap32.dll.so \
 	avifil32.dll.so \
 	cabinet.dll.so \
@@ -400,6 +402,9 @@
 amstream.dll.so: amstream/amstream.dll.so
 	$(RM) $@ && $(LN_S) amstream/amstream.dll.so $@
 
+atl.dll.so: atl/atl.dll.so
+	$(RM) $@ && $(LN_S) atl/atl.dll.so $@
+
 avicap32.dll.so: avicap32/avicap32.dll.so
 	$(RM) $@ && $(LN_S) avicap32/avicap32.dll.so $@
 
@@ -1084,6 +1089,11 @@
 libamstream.a: amstream/amstream.spec.def
 	$(DLLTOOL) -k -l $@ -d amstream/amstream.spec.def
 
+libatl.def: atl/atl.spec.def
+	$(RM) $@ && $(LN_S) atl/atl.spec.def $@
+libatl.a: atl/atl.spec.def
+	$(DLLTOOL) -k -l $@ -d atl/atl.spec.def
+
 libavicap32.def: avicap32/avicap32.spec.def
 	$(RM) $@ && $(LN_S) avicap32/avicap32.spec.def $@
 libavicap32.a: avicap32/avicap32.spec.def
@@ -1681,6 +1691,7 @@
 
 advapi32/advapi32.spec.def: $(WINEBUILD)
 amstream/amstream.spec.def: $(WINEBUILD)
+atl/atl.spec.def: $(WINEBUILD)
 avicap32/avicap32.spec.def: $(WINEBUILD)
 avifil32/avifil32.spec.def: $(WINEBUILD)
 cabinet/cabinet.spec.def: $(WINEBUILD)
@@ -1808,6 +1819,7 @@
 
 advapi32/advapi32.dll.so: advapi32
 amstream/amstream.dll.so: amstream
+atl/atl.dll.so: atl
 avicap32/avicap32.dll.so: avicap32
 avifil32/avifil32.dll.so: avifil32
 cabinet/cabinet.dll.so: cabinet
--- /dev/null	Thu Aug 30 15:30:55 2001
+++ dlls/atl/atlbase.h	Fri Jul  2 08:33:42 2004
@@ -0,0 +1,138 @@
+/*
+ * Implementation of the Active Template Library (atl.dll)
+ *
+ * Copyright 2004 Aric Stewart for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#define ATLAPI HRESULT __stdcall
+
+typedef HRESULT (WINAPI _ATL_CREATORFUNC)(void* pv, REFIID riid, LPVOID* ppv);
+typedef HRESULT (WINAPI _ATL_CREATORARGFUNC)(void* pv, REFIID riid, LPVOID* ppv, DWORD dw);
+typedef HRESULT (WINAPI _ATL_MODULEFUNC)(DWORD dw);
+typedef LPCSTR (WINAPI _ATL_DESCRIPTIONFUNCA)();
+typedef LPCWSTR (WINAPI _ATL_DESCRIPTIONFUNCW)();
+typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)();
+typedef void (__stdcall _ATL_TERMFUNC)(DWORD dw);
+
+typedef struct _ATL_OBJMAP_ENTRYA_TAG
+{
+    const CLSID* pclsid;
+    HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
+    _ATL_CREATORFUNC* pfnGetClassObject;
+    _ATL_CREATORFUNC* pfnCreateInstance;
+    IUnknown* pCF;
+    DWORD dwRegister;
+    _ATL_DESCRIPTIONFUNCA* pfnGetObjectDescription;
+    _ATL_CATMAPFUNC* pfnGetCategoryMap;
+    void (WINAPI *pfnObjectMain)(BOOL bStarting);
+}_ATL_OBJMAP_ENTRYA;
+
+typedef struct _ATL_OBJMAP_ENTRYW_TAG
+{
+    const CLSID* pclsid;
+    HRESULT (WINAPI *pfnUpdateRegistry)(BOOL bRegister);
+    _ATL_CREATORFUNC* pfnGetClassObject;
+    _ATL_CREATORFUNC* pfnCreateInstance;
+    IUnknown* pCF;
+    DWORD dwRegister;
+    _ATL_DESCRIPTIONFUNCW* pfnGetObjectDescription;
+    _ATL_CATMAPFUNC* pfnGetCategoryMap;
+    void (WINAPI *pfnObjectMain)(BOOL bStarting);
+} _ATL_OBJMAP_ENTRYW;
+
+
+typedef struct _ATL_TERMFUNC_ELEM_TAG
+{
+    _ATL_TERMFUNC* pFunc;
+    DWORD dw;
+    struct _ATL_TERMFUNC_ELEM_TAG* pNext;
+} _ATL_TERMFUNC_ELEM;
+
+typedef struct _AtlCreateWndData_TAG
+{
+    void* m_pThis;
+    DWORD m_dwThreadID;
+    struct _AtlCreateWndData_TAG* m_pNext;
+} _AtlCreateWndData;
+
+typedef struct _ATL_MODULEA_TAG
+{
+    UINT cbSize;
+    HINSTANCE m_hInst;
+    HINSTANCE m_hInstResource;
+    HINSTANCE m_hInstTypeLib;
+    _ATL_OBJMAP_ENTRYA* m_pObjMap;
+    LONG m_nLockCnt;
+    HANDLE m_hHeap;
+    union
+    {
+        CRITICAL_SECTION m_csTypeInfoHolder;
+        CRITICAL_SECTION m_csStaticDataInit;
+    };
+    CRITICAL_SECTION m_csWindowCreate;
+    CRITICAL_SECTION m_csObjMap;
+
+    DWORD dwAtlBuildVer;
+    _AtlCreateWndData* m_pCreateWndList;
+    BOOL m_bDestroyHeap;
+    GUID* pguidVer;
+    DWORD m_dwHeaps;
+    HANDLE* m_phHeaps;
+    int m_nHeap;
+    _ATL_TERMFUNC_ELEM* m_pTermFuncs;
+} _ATL_MODULEA;
+
+typedef struct _ATL_MODULEW_TAG
+{
+    UINT cbSize;
+    HINSTANCE m_hInst;
+    HINSTANCE m_hInstResource;
+    HINSTANCE m_hInstTypeLib;
+    _ATL_OBJMAP_ENTRYW* m_pObjMap;
+    LONG m_nLockCnt;
+    HANDLE m_hHeap;
+    union
+    {
+        CRITICAL_SECTION m_csTypeInfoHolder;
+        CRITICAL_SECTION m_csStaticDataInit;
+    };
+    CRITICAL_SECTION m_csWindowCreate;
+    CRITICAL_SECTION m_csObjMap;
+
+    DWORD dwAtlBuildVer;
+    _AtlCreateWndData* m_pCreateWndList;
+    BOOL m_bDestroyHeap;
+    GUID* pguidVer;
+    DWORD m_dwHeaps;
+    HANDLE* m_phHeaps;
+    int m_nHeap;
+    _ATL_TERMFUNC_ELEM* m_pTermFuncs;
+} _ATL_MODULEW;
+
+typedef struct _ATL_INTMAP_ENTRY_TAG
+{
+        const IID* piid;       // the interface id (IID)
+        DWORD dw;
+        _ATL_CREATORARGFUNC* pFunc; //NULL:end, 1:offset, n:ptr
+} _ATL_INTMAP_ENTRY;
+
+ATLAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h);
+ATLAPI AtlModuleRegisterClassObjects(_ATL_MODULEA* pM, DWORD dwClsContext, DWORD dwFlags);
+ATLAPI AtlModuleTerm(_ATL_MODULEA* pM);
+ATLAPI AtlInternalQueryInterface(LPVOID pThis,
+        const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, LPVOID* ppvObject);
--- /dev/null	Thu Aug 30 15:30:55 2001
+++ dlls/atl/atl_main.c	Fri Jul  2 08:33:42 2004
@@ -0,0 +1,153 @@
+/*
+ * Implementation of Active Template Library (atl.dll)
+ *
+ * Copyright 2004 Aric Stewart for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "winuser.h"
+#include "wine/debug.h"
+#include "objbase.h"
+#include "objidl.h"
+#include "ole2.h"
+#include "atlbase.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(atl);
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+	TRACE("(0x%p, %ld, %p)\n",hinstDLL,fdwReason,lpvReserved);
+
+	if (fdwReason == DLL_PROCESS_ATTACH)
+	{
+	}
+	else if (fdwReason == DLL_PROCESS_DETACH)
+	{
+	}
+
+	return TRUE;
+}
+
+ATLAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h)
+{
+    INT i;
+
+    FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
+
+    memset(pM,0,sizeof(_ATL_MODULEA));
+    pM->cbSize = sizeof(_ATL_MODULEA);
+    pM->m_hInst = h;
+    pM->m_hInstResource = h;
+    pM->m_hInstTypeLib = h;
+    pM->m_pObjMap = p;
+    pM->m_hHeap = GetProcessHeap();
+
+    /* call mains */
+    i = 0;
+    while (pM->m_pObjMap[i].pclsid != NULL)
+    {
+        TRACE("Initializeing object %i\n",i);
+        p[i].pfnObjectMain(TRUE);
+        i++;
+    } 
+
+    return S_OK;
+}
+
+ATLAPI AtlModuleRegisterClassObjects(_ATL_MODULEA *pM, DWORD dwClsContext, 
+                                      DWORD dwFlags)
+{
+    HRESULT hRes = S_OK;
+    int i=0;
+
+    TRACE("(%p %li %li)\n",pM, dwClsContext, dwFlags);
+
+    if (pM == NULL) 
+        return E_INVALIDARG;
+
+    while(pM->m_pObjMap[i].pclsid != NULL)
+    {
+        IUnknown* pUnknown;
+        _ATL_OBJMAP_ENTRYA *obj = &(pM->m_pObjMap[i]);
+        HRESULT rc;
+
+        TRACE("Registering object %i\n",i);
+        if (obj->pfnGetClassObject)
+        {
+            rc = obj->pfnGetClassObject(obj->pfnCreateInstance, &IID_IUnknown,
+                                   (LPVOID*)&pUnknown);
+            if (SUCCEEDED (rc) )
+            {
+                CoRegisterClassObject(obj->pclsid, pUnknown, dwClsContext,
+                                      dwFlags, &obj->dwRegister);
+                if (pUnknown)
+                    IUnknown_Release(pUnknown);
+            }
+        }
+        i++;
+    }
+
+   return hRes;
+}
+
+ATLAPI AtlInternalQueryInterface(LPVOID this, const _ATL_INTMAP_ENTRY* pEntries,  REFIID iid, LPVOID* ppvObject)
+{
+    int i = 0;
+    HRESULT rc = E_NOINTERFACE;
+    TRACE("(%p, %p, %p, %p)\n",this, pEntries, iid, ppvObject);
+
+    if (IsEqualGUID(iid,&IID_IUnknown))
+    {
+        TRACE("Returning IUnknown\n");
+        *ppvObject = this;
+        IUnknown_AddRef((IUnknown*)this);
+        return S_OK;
+    }
+
+    while (pEntries[i].pFunc != 0)
+    {
+        TRACE("Trying entry %i (%p %li %p)\n",i,pEntries[i].piid,
+              pEntries[i].dw, pEntries[i].pFunc);
+
+        if (IsEqualGUID(iid,pEntries[i].piid))
+        {
+            TRACE("MATCH\n");
+            if (pEntries[i].pFunc == (_ATL_CREATORARGFUNC*)1)
+            {
+                TRACE("Offset\n");
+                *ppvObject = ((LPSTR)this+pEntries[i].dw); 
+                IUnknown_AddRef((IUnknown*)this);
+                rc = S_OK;
+            }
+            else
+            {
+                TRACE("Function\n");
+                rc = pEntries[i].pFunc(this, iid, ppvObject,0);
+            }
+            break;
+        }
+        i++;
+    }
+    TRACE("Done returning (0x%lx)\n",rc);
+    return rc;
+}
--- /dev/null	Thu Aug 30 15:30:55 2001
+++ dlls/atl/atl.spec	Fri Jul  2 08:33:42 2004
@@ -0,0 +1,54 @@
+# Generated from atl.dll
+
+1 stub DllCanUnloadNow
+2 stub DllGetClassObject
+3 stub DllRegisterServer
+4 stub DllUnregisterServer
+10 stub AtlAdvise
+11 stub AtlUnadvise
+12 stub AtlFreeMarshalStream
+13 stub AtlMarshalPtrInProc
+14 stub AtlUnmarshalPtr
+15 stub AtlModuleGetClassObject
+16 stdcall AtlModuleInit(ptr long long)
+17 stdcall AtlModuleRegisterClassObjects(ptr long long)
+18 stub AtlModuleRegisterServer
+19 stub AtlModuleRegisterTypeLib
+20 stub AtlModuleRevokeClassObjects
+21 stub AtlModuleTerm
+22 stub AtlModuleUnregisterServer
+23 stub AtlModuleUpdateRegistryFromResourceD
+24 stub AtlWaitWithMessageLoop
+25 stub AtlSetErrorInfo
+26 stub AtlCreateTargetDC
+27 stub AtlHiMetricToPixel
+28 stub AtlPixelToHiMetric
+29 stub AtlDevModeW2A
+30 stub AtlComPtrAssign
+31 stub AtlComQIPtrAssign
+32 stdcall AtlInternalQueryInterface(ptr ptr ptr ptr)
+34 stub AtlGetVersion
+35 stub AtlAxDialogBoxW
+36 stub AtlAxDialogBoxA
+37 stub AtlAxCreateDialogW
+38 stub AtlAxCreateDialogA
+39 stub AtlAxCreateControl
+40 stub AtlAxCreateControlEx
+41 stub AtlAxAttachControl
+42 stub AtlAxWinInit
+43 stub AtlModuleAddCreateWndData
+44 stub AtlModuleExtractCreateWndData
+45 stub AtlModuleRegisterWndClassInfoW
+46 stub AtlModuleRegisterWndClassInfoA
+47 stub AtlAxGetControl
+48 stub AtlAxGetHost
+49 stub AtlRegisterClassCategoriesHelper
+50 stub AtlIPersistStreamInit_Load
+51 stub AtlIPersistStreamInit_Save
+52 stub AtlIPersistPropertyBag_Load
+53 stub AtlIPersistPropertyBag_Save
+54 stub AtlGetObjectSourceInterface
+55 stub AtlModuleUnRegisterTypeLib
+56 stub AtlModuleLoadTypeLib
+57 stub AtlModuleUnregisterServerEx
+58 stub AtlModuleAddTermFunc
--- /dev/null	Thu Aug 30 15:30:55 2001
+++ dlls/atl/Makefile.in	Fri Jul  2 08:33:42 2004
@@ -0,0 +1,15 @@
+# Generated from atl.dll
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = atl.dll
+IMPORTS   = kernel32 ole32
+EXTRALIBS = -luuid
+
+C_SRCS = \
+	atl_main.c
+
+ at MAKE_DLL_RULES@
+
+### Dependencies:


More information about the wine-patches mailing list