mirror of
https://github.com/reactos/reactos.git
synced 2025-07-27 10:23:12 +00:00
[ATL]
* Sync with Wine 1.7.1. svn path=/trunk/; revision=60110
This commit is contained in:
parent
6bcfaf87f1
commit
aa8a46b180
6 changed files with 311 additions and 300 deletions
|
@ -12,13 +12,12 @@ spec2def(atl.dll atl.spec ADD_IMPORTLIB)
|
|||
|
||||
list(APPEND SOURCE
|
||||
atl_main.c
|
||||
registrar.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/atl_stubs.c
|
||||
${CMAKE_CURRENT_BINARY_DIR}/atl.def)
|
||||
|
||||
add_library(atl SHARED ${SOURCE} rsrc.rc)
|
||||
set_module_type(atl win32dll)
|
||||
target_link_libraries(atl uuid wine)
|
||||
add_importlibs(atl atl100 oleaut32 ole32 user32 msvcrt kernel32 ntdll)
|
||||
add_importlibs(atl atl100 atl80 oleaut32 ole32 user32 msvcrt kernel32 ntdll)
|
||||
add_dependencies(atl atl_atliface_header)
|
||||
add_cd_file(TARGET atl DESTINATION reactos/system32 FOR all)
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
21 stdcall AtlModuleTerm(ptr)
|
||||
22 stdcall AtlModuleUnregisterServer(ptr ptr)
|
||||
23 stdcall AtlModuleUpdateRegistryFromResourceD(ptr wstr long ptr ptr)
|
||||
24 stub AtlWaitWithMessageLoop
|
||||
24 stdcall AtlWaitWithMessageLoop(long) atl100.AtlWaitWithMessageLoop
|
||||
25 stub AtlSetErrorInfo
|
||||
26 stdcall AtlCreateTargetDC(long ptr) atl100.AtlCreateTargetDC
|
||||
27 stdcall AtlHiMetricToPixel(ptr ptr) atl100.AtlHiMetricToPixel
|
||||
|
@ -26,26 +26,26 @@
|
|||
31 stdcall AtlComQIPtrAssign(ptr ptr ptr) atl100.AtlComQIPtrAssign
|
||||
32 stdcall AtlInternalQueryInterface(ptr ptr ptr ptr) atl100.AtlInternalQueryInterface
|
||||
34 stdcall AtlGetVersion(ptr)
|
||||
35 stub AtlAxDialogBoxW
|
||||
36 stub AtlAxDialogBoxA
|
||||
35 stdcall AtlAxDialogBoxW(long wstr long ptr long) atl100.AtlAxDialogBoxW
|
||||
36 stdcall AtlAxDialogBoxA(long str long ptr long) atl100.AtlAxDialogBoxA
|
||||
37 stdcall AtlAxCreateDialogW(long wstr long ptr long) atl100.AtlAxCreateDialogW
|
||||
38 stdcall AtlAxCreateDialogA(long str long ptr long) atl100.AtlAxCreateDialogA
|
||||
39 stdcall AtlAxCreateControl(ptr ptr ptr ptr) atl100.AtlAxCreateControl
|
||||
40 stdcall AtlAxCreateControlEx(ptr ptr ptr ptr ptr ptr ptr) atl100.AtlAxCreateControlEx
|
||||
41 stdcall AtlAxAttachControl(ptr ptr ptr) atl100.AtlAxAttachControl
|
||||
42 stdcall AtlAxWinInit() atl100.AtlAxWinInit
|
||||
42 stdcall AtlAxWinInit()
|
||||
43 stdcall AtlModuleAddCreateWndData(ptr ptr ptr)
|
||||
44 stdcall AtlModuleExtractCreateWndData(ptr)
|
||||
45 stdcall AtlModuleRegisterWndClassInfoW(ptr ptr ptr)
|
||||
46 stdcall AtlModuleRegisterWndClassInfoA(ptr ptr ptr)
|
||||
47 stdcall AtlAxGetControl(long ptr) atl100.AtlAxGetControl
|
||||
48 stdcall AtlAxGetHost(long ptr) atl100.AtlAxGetHost
|
||||
49 stub AtlRegisterClassCategoriesHelper
|
||||
49 stdcall AtlRegisterClassCategoriesHelper(ptr ptr long) atl100.AtlRegisterClassCategoriesHelper
|
||||
50 stdcall AtlIPersistStreamInit_Load(ptr ptr ptr ptr) atl100.AtlIPersistStreamInit_Load
|
||||
51 stdcall AtlIPersistStreamInit_Save(ptr long ptr ptr ptr) atl100.AtlIPersistStreamInit_Save
|
||||
52 stub AtlIPersistPropertyBag_Load
|
||||
52 stdcall AtlIPersistPropertyBag_Load(ptr ptr ptr ptr ptr) atl100.AtlIPersistPropertyBag_Load
|
||||
53 stub AtlIPersistPropertyBag_Save
|
||||
54 stub AtlGetObjectSourceInterface
|
||||
54 stdcall AtlGetObjectSourceInterface(ptr ptr ptr ptr ptr) atl100.AtlGetObjectSourceInterface
|
||||
55 stub AtlModuleUnRegisterTypeLib
|
||||
56 stdcall AtlModuleLoadTypeLib(ptr wstr ptr ptr)
|
||||
57 stdcall AtlModuleUnregisterServerEx(ptr long ptr)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* Implementation of Active Template Library (atl.dll)
|
||||
*
|
||||
* Copyright 2004 Aric Stewart for CodeWeavers
|
||||
* Copyright 2005 Jacek Caban
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -28,7 +29,7 @@
|
|||
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <objbase.h>
|
||||
#include <ole2.h>
|
||||
#include <oleauto.h>
|
||||
|
||||
//#include "objidl.h"
|
||||
|
@ -40,7 +41,7 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(atl);
|
||||
|
||||
DECLSPEC_HIDDEN HINSTANCE hInst;
|
||||
static HINSTANCE hInst;
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||
{
|
||||
|
@ -60,7 +61,7 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEW* pM, _ATL_OBJMAP_ENTRYW* p, HINSTANCE
|
|||
INT i;
|
||||
UINT size;
|
||||
|
||||
//FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
|
||||
TRACE("(%p %p %p)\n", pM, p, h);
|
||||
|
||||
size = pM->cbSize;
|
||||
switch (size)
|
||||
|
@ -120,41 +121,31 @@ static _ATL_OBJMAP_ENTRYW_V1 *get_objmap_entry( _ATL_MODULEW *mod, unsigned int
|
|||
HRESULT WINAPI AtlModuleLoadTypeLib(_ATL_MODULEW *pM, LPCOLESTR lpszIndex,
|
||||
BSTR *pbstrPath, ITypeLib **ppTypeLib)
|
||||
{
|
||||
HRESULT hRes;
|
||||
OLECHAR path[MAX_PATH+8]; /* leave some space for index */
|
||||
|
||||
TRACE("(%p, %s, %p, %p)\n", pM, debugstr_w(lpszIndex), pbstrPath, ppTypeLib);
|
||||
|
||||
if (!pM)
|
||||
return E_INVALIDARG;
|
||||
|
||||
GetModuleFileNameW(pM->m_hInstTypeLib, path, MAX_PATH);
|
||||
if (lpszIndex)
|
||||
lstrcatW(path, lpszIndex);
|
||||
|
||||
hRes = LoadTypeLib(path, ppTypeLib);
|
||||
if (FAILED(hRes))
|
||||
return hRes;
|
||||
|
||||
*pbstrPath = SysAllocString(path);
|
||||
|
||||
return S_OK;
|
||||
return AtlLoadTypeLib(pM->m_hInstTypeLib, lpszIndex, pbstrPath, ppTypeLib);
|
||||
}
|
||||
|
||||
HRESULT WINAPI AtlModuleTerm(_ATL_MODULEW* pM)
|
||||
HRESULT WINAPI AtlModuleTerm(_ATL_MODULE *pM)
|
||||
{
|
||||
_ATL_TERMFUNC_ELEM *iter = pM->m_pTermFuncs, *tmp;
|
||||
_ATL_TERMFUNC_ELEM *iter, *tmp;
|
||||
|
||||
TRACE("(%p)\n", pM);
|
||||
|
||||
while(iter) {
|
||||
iter->pFunc(iter->dw);
|
||||
tmp = iter;
|
||||
iter = iter->pNext;
|
||||
HeapFree(GetProcessHeap(), 0, tmp);
|
||||
}
|
||||
if (pM->cbSize > ATLVer1Size)
|
||||
{
|
||||
iter = pM->m_pTermFuncs;
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pM);
|
||||
while(iter) {
|
||||
iter->pFunc(iter->dw);
|
||||
tmp = iter;
|
||||
iter = iter->pNext;
|
||||
HeapFree(GetProcessHeap(), 0, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -165,12 +156,15 @@ HRESULT WINAPI AtlModuleAddTermFunc(_ATL_MODULEW *pM, _ATL_TERMFUNC *pFunc, DWOR
|
|||
|
||||
TRACE("(%p %p %ld)\n", pM, pFunc, dw);
|
||||
|
||||
termfunc_elem = HeapAlloc(GetProcessHeap(), 0, sizeof(_ATL_TERMFUNC_ELEM));
|
||||
termfunc_elem->pFunc = pFunc;
|
||||
termfunc_elem->dw = dw;
|
||||
termfunc_elem->pNext = pM->m_pTermFuncs;
|
||||
if (pM->cbSize > ATLVer1Size)
|
||||
{
|
||||
termfunc_elem = HeapAlloc(GetProcessHeap(), 0, sizeof(_ATL_TERMFUNC_ELEM));
|
||||
termfunc_elem->pFunc = pFunc;
|
||||
termfunc_elem->dw = dw;
|
||||
termfunc_elem->pNext = pM->m_pTermFuncs;
|
||||
|
||||
pM->m_pTermFuncs = termfunc_elem;
|
||||
pM->m_pTermFuncs = termfunc_elem;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
@ -242,12 +236,23 @@ HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const
|
|||
hRes = obj->pfnUpdateRegistry(TRUE); /* register */
|
||||
if (FAILED(hRes))
|
||||
return hRes;
|
||||
|
||||
if(pM->cbSize > ATLVer1Size) {
|
||||
const struct _ATL_CATMAP_ENTRY *catmap;
|
||||
|
||||
catmap = ((const _ATL_OBJMAP_ENTRYW*)obj)->pfnGetCategoryMap();
|
||||
if(catmap) {
|
||||
hRes = AtlRegisterClassCategoriesHelper(obj->pclsid, catmap, TRUE);
|
||||
if(FAILED(hRes))
|
||||
return hRes;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bRegTypeLib)
|
||||
{
|
||||
hRes = AtlModuleRegisterTypeLib(pM, NULL);
|
||||
hRes = AtlRegisterTypeLib(pM->m_hInstTypeLib, NULL);
|
||||
if (FAILED(hRes))
|
||||
return hRes;
|
||||
}
|
||||
|
@ -298,25 +303,12 @@ HRESULT WINAPI AtlModuleGetClassObject(_ATL_MODULEW *pm, REFCLSID rclsid,
|
|||
*/
|
||||
HRESULT WINAPI AtlModuleRegisterTypeLib(_ATL_MODULEW *pm, LPCOLESTR lpszIndex)
|
||||
{
|
||||
HRESULT hRes;
|
||||
BSTR path;
|
||||
ITypeLib *typelib;
|
||||
|
||||
TRACE("%p %s\n", pm, debugstr_w(lpszIndex));
|
||||
|
||||
if (!pm)
|
||||
return E_INVALIDARG;
|
||||
|
||||
hRes = AtlModuleLoadTypeLib(pm, lpszIndex, &path, &typelib);
|
||||
|
||||
if (SUCCEEDED(hRes))
|
||||
{
|
||||
hRes = RegisterTypeLib(typelib, path, NULL); /* FIXME: pass help directory */
|
||||
ITypeLib_Release(typelib);
|
||||
SysFreeString(path);
|
||||
}
|
||||
|
||||
return hRes;
|
||||
return AtlRegisterTypeLib(pm->m_hInstTypeLib, lpszIndex);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -452,34 +444,201 @@ void WINAPI AtlModuleAddCreateWndData(_ATL_MODULEW *pM, _AtlCreateWndData *pData
|
|||
|
||||
pData->m_pThis = pvObject;
|
||||
pData->m_dwThreadID = GetCurrentThreadId();
|
||||
|
||||
EnterCriticalSection(&pM->m_csWindowCreate);
|
||||
pData->m_pNext = pM->m_pCreateWndList;
|
||||
pM->m_pCreateWndList = pData;
|
||||
LeaveCriticalSection(&pM->m_csWindowCreate);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* AtlModuleExtractCreateWndData [ATL.@]
|
||||
*
|
||||
* NOTE: I failed to find any good description of this function.
|
||||
* Tests show that this function extracts one of _AtlCreateWndData
|
||||
* NOTE: Tests show that this function extracts one of _AtlCreateWndData
|
||||
* records from the current thread from a list
|
||||
*
|
||||
*/
|
||||
void* WINAPI AtlModuleExtractCreateWndData(_ATL_MODULEW *pM)
|
||||
{
|
||||
_AtlCreateWndData **ppData;
|
||||
void *ret = NULL;
|
||||
|
||||
TRACE("(%p)\n", pM);
|
||||
|
||||
EnterCriticalSection(&pM->m_csWindowCreate);
|
||||
|
||||
for(ppData = &pM->m_pCreateWndList; *ppData!=NULL; ppData = &(*ppData)->m_pNext)
|
||||
{
|
||||
if ((*ppData)->m_dwThreadID == GetCurrentThreadId())
|
||||
{
|
||||
_AtlCreateWndData *pData = *ppData;
|
||||
*ppData = pData->m_pNext;
|
||||
return pData->m_pThis;
|
||||
ret = pData->m_pThis;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
||||
LeaveCriticalSection(&pM->m_csWindowCreate);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* AtlModuleUpdateRegistryFromResourceD [ATL.@]
|
||||
*
|
||||
*/
|
||||
HRESULT WINAPI AtlModuleUpdateRegistryFromResourceD(_ATL_MODULEW* pM, LPCOLESTR lpszRes,
|
||||
BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg)
|
||||
{
|
||||
TRACE("(%p %s %d %p %p)\n", pM, debugstr_w(lpszRes), bRegister, pMapEntries, pReg);
|
||||
|
||||
return AtlUpdateRegistryFromResourceD(pM->m_hInst, lpszRes, bRegister, pMapEntries, pReg);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppvObject)
|
||||
{
|
||||
TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppvObject);
|
||||
|
||||
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
|
||||
*ppvObject = iface;
|
||||
IClassFactory_AddRef( iface );
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI RegistrarCF_AddRef(IClassFactory *iface)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
static ULONG WINAPI RegistrarCF_Release(IClassFactory *iface)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_CreateInstance(IClassFactory *iface, LPUNKNOWN pUnkOuter,
|
||||
REFIID riid, void **ppv)
|
||||
{
|
||||
IRegistrar *registrar;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
|
||||
|
||||
if(pUnkOuter) {
|
||||
*ppv = NULL;
|
||||
return CLASS_E_NOAGGREGATION;
|
||||
}
|
||||
|
||||
hres = AtlCreateRegistrar(®istrar);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = IRegistrar_QueryInterface(registrar, riid, ppv);
|
||||
IRegistrar_Release(registrar);
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_LockServer(IClassFactory *iface, BOOL lock)
|
||||
{
|
||||
TRACE("(%p)->(%x)\n", iface, lock);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IClassFactoryVtbl IRegistrarCFVtbl = {
|
||||
RegistrarCF_QueryInterface,
|
||||
RegistrarCF_AddRef,
|
||||
RegistrarCF_Release,
|
||||
RegistrarCF_CreateInstance,
|
||||
RegistrarCF_LockServer
|
||||
};
|
||||
|
||||
static IClassFactory RegistrarCF = { &IRegistrarCFVtbl };
|
||||
|
||||
static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll,
|
||||
LPCOLESTR wszId, BOOL do_register,
|
||||
const struct _ATL_REGMAP_ENTRY* pMapEntries)
|
||||
{
|
||||
IRegistrar *registrar;
|
||||
HRESULT hres;
|
||||
const struct _ATL_REGMAP_ENTRY *pMapEntry;
|
||||
|
||||
static const WCHAR wszModule[] = {'M','O','D','U','L','E',0};
|
||||
static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0};
|
||||
|
||||
if(pRegistrar) {
|
||||
registrar = pRegistrar;
|
||||
}else {
|
||||
hres = AtlCreateRegistrar(®istrar);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
|
||||
IRegistrar_AddReplacement(registrar, wszModule, wszDll);
|
||||
|
||||
for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++)
|
||||
IRegistrar_AddReplacement(registrar, pMapEntry->szKey, pMapEntry->szData);
|
||||
|
||||
if(do_register)
|
||||
hres = IRegistrar_ResourceRegisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
else
|
||||
hres = IRegistrar_ResourceUnregisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
|
||||
if(registrar != pRegistrar)
|
||||
IRegistrar_Release(registrar);
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT do_register_server(BOOL do_register)
|
||||
{
|
||||
static const WCHAR CLSID_RegistrarW[] =
|
||||
{'C','L','S','I','D','_','R','e','g','i','s','t','r','a','r',0};
|
||||
static const WCHAR atl_dllW[] = {'a','t','l','.','d','l','l',0};
|
||||
|
||||
WCHAR clsid_str[40];
|
||||
const struct _ATL_REGMAP_ENTRY reg_map[] = {{CLSID_RegistrarW, clsid_str}, {NULL,NULL}};
|
||||
|
||||
StringFromGUID2(&CLSID_Registrar, clsid_str, sizeof(clsid_str)/sizeof(WCHAR));
|
||||
return do_register_dll_server(NULL, atl_dllW, MAKEINTRESOURCEW(101), do_register, reg_map);
|
||||
}
|
||||
|
||||
/**************************************************************
|
||||
* DllGetClassObject (ATL.2)
|
||||
*/
|
||||
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, LPVOID *ppvObject)
|
||||
{
|
||||
TRACE("(%s %s %p)\n", debugstr_guid(clsid), debugstr_guid(riid), ppvObject);
|
||||
|
||||
if(IsEqualGUID(&CLSID_Registrar, clsid))
|
||||
return IClassFactory_QueryInterface( &RegistrarCF, riid, ppvObject );
|
||||
|
||||
FIXME("Not supported class %s\n", debugstr_guid(clsid));
|
||||
return CLASS_E_CLASSNOTAVAILABLE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllRegisterServer (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllRegisterServer(void)
|
||||
{
|
||||
/* Note: we can't use __wine_register_server here because it uses CLSID_Registrar which isn't registred yet */
|
||||
return do_register_server(TRUE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllUnRegisterServer (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllUnregisterServer(void)
|
||||
{
|
||||
return do_register_server(FALSE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllCanUnloadNow (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllCanUnloadNow(void)
|
||||
{
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -487,5 +646,53 @@ void* WINAPI AtlModuleExtractCreateWndData(_ATL_MODULEW *pM)
|
|||
*/
|
||||
DWORD WINAPI AtlGetVersion(void *pReserved)
|
||||
{
|
||||
return 0x0300;
|
||||
return _ATL_VER;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* AtlAxWin class window procedure
|
||||
*/
|
||||
static LRESULT CALLBACK AtlAxWin_wndproc( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
if ( wMsg == WM_CREATE )
|
||||
{
|
||||
DWORD len = GetWindowTextLengthW( hWnd ) + 1;
|
||||
WCHAR *ptr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
|
||||
if (!ptr)
|
||||
return 1;
|
||||
GetWindowTextW( hWnd, ptr, len );
|
||||
AtlAxCreateControlEx( ptr, hWnd, NULL, NULL, NULL, NULL, NULL );
|
||||
HeapFree( GetProcessHeap(), 0, ptr );
|
||||
return 0;
|
||||
}
|
||||
return DefWindowProcW( hWnd, wMsg, wParam, lParam );
|
||||
}
|
||||
|
||||
BOOL WINAPI AtlAxWinInit(void)
|
||||
{
|
||||
WNDCLASSEXW wcex;
|
||||
const WCHAR AtlAxWin[] = {'A','t','l','A','x','W','i','n',0};
|
||||
|
||||
FIXME("semi-stub\n");
|
||||
|
||||
if ( FAILED( OleInitialize(NULL) ) )
|
||||
return FALSE;
|
||||
|
||||
wcex.cbSize = sizeof(wcex);
|
||||
wcex.style = CS_GLOBALCLASS;
|
||||
wcex.cbClsExtra = 0;
|
||||
wcex.cbWndExtra = 0;
|
||||
wcex.hInstance = GetModuleHandleW( NULL );
|
||||
wcex.hIcon = NULL;
|
||||
wcex.hCursor = NULL;
|
||||
wcex.hbrBackground = NULL;
|
||||
wcex.lpszMenuName = NULL;
|
||||
wcex.hIconSm = 0;
|
||||
|
||||
wcex.lpfnWndProc = AtlAxWin_wndproc;
|
||||
wcex.lpszClassName = AtlAxWin;
|
||||
if ( !RegisterClassExW( &wcex ) )
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -1,24 +1,44 @@
|
|||
Index: atl_main.c
|
||||
===================================================================
|
||||
--- atl_main.c (revision 48273)
|
||||
+++ atl_main.c (working copy)
|
||||
@@ -60,7 +60,7 @@
|
||||
INT i;
|
||||
UINT size;
|
||||
diff -prudN e:\Wine\dlls\atl/atl_main.c e:\reactos\dll\win32\atl/atl_main.c
|
||||
--- e:\Wine\dlls\atl/atl_main.c 2013-09-03 23:09:36.308717300 +0100
|
||||
+++ e:\reactos\dll\win32\atl/atl_main.c 2013-09-12 12:15:17.112785700 +0100
|
||||
@@ -547,6 +555,53 @@ static const IClassFactoryVtbl IRegistra
|
||||
|
||||
- FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
|
||||
+ //FIXME("SEMI-STUB (%p %p %p)\n",pM,p,h);
|
||||
|
||||
size = pM->cbSize;
|
||||
switch (size)
|
||||
Index: registrar.c
|
||||
===================================================================
|
||||
--- registrar.c (revision 48273)
|
||||
+++ registrar.c (revision 48273)
|
||||
@@ -819,6 +819,19 @@
|
||||
return hres;
|
||||
}
|
||||
static IClassFactory RegistrarCF = { &IRegistrarCFVtbl };
|
||||
|
||||
+static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll,
|
||||
+ LPCOLESTR wszId, BOOL do_register,
|
||||
+ const struct _ATL_REGMAP_ENTRY* pMapEntries)
|
||||
+{
|
||||
+ IRegistrar *registrar;
|
||||
+ HRESULT hres;
|
||||
+ const struct _ATL_REGMAP_ENTRY *pMapEntry;
|
||||
+
|
||||
+ static const WCHAR wszModule[] = {'M','O','D','U','L','E',0};
|
||||
+ static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0};
|
||||
+
|
||||
+ if(pRegistrar) {
|
||||
+ registrar = pRegistrar;
|
||||
+ }else {
|
||||
+ hres = AtlCreateRegistrar(®istrar);
|
||||
+ if(FAILED(hres))
|
||||
+ return hres;
|
||||
+ }
|
||||
+
|
||||
+ IRegistrar_AddReplacement(registrar, wszModule, wszDll);
|
||||
+
|
||||
+ for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++)
|
||||
+ IRegistrar_AddReplacement(registrar, pMapEntry->szKey, pMapEntry->szData);
|
||||
+
|
||||
+ if(do_register)
|
||||
+ hres = IRegistrar_ResourceRegisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
+ else
|
||||
+ hres = IRegistrar_ResourceUnregisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
+
|
||||
+ if(registrar != pRegistrar)
|
||||
+ IRegistrar_Release(registrar);
|
||||
+ return hres;
|
||||
+}
|
||||
+
|
||||
+static HRESULT do_register_server(BOOL do_register)
|
||||
+{
|
||||
+ static const WCHAR CLSID_RegistrarW[] =
|
||||
|
@ -32,10 +52,10 @@ Index: registrar.c
|
|||
+ return do_register_dll_server(NULL, atl_dllW, MAKEINTRESOURCEW(101), do_register, reg_map);
|
||||
+}
|
||||
+
|
||||
/***********************************************************************
|
||||
* AtlModuleUpdateRegistryFromResourceD [ATL.@]
|
||||
*
|
||||
@@ -849,7 +862,8 @@
|
||||
/**************************************************************
|
||||
* DllGetClassObject (ATL.2)
|
||||
*/
|
||||
@@ -566,7 +621,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSI
|
||||
*/
|
||||
HRESULT WINAPI DllRegisterServer(void)
|
||||
{
|
||||
|
@ -45,7 +65,7 @@ Index: registrar.c
|
|||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -857,7 +871,7 @@
|
||||
@@ -574,7 +630,7 @@ HRESULT WINAPI DllRegisterServer(void)
|
||||
*/
|
||||
HRESULT WINAPI DllUnregisterServer(void)
|
||||
{
|
||||
|
|
|
@ -1,215 +0,0 @@
|
|||
/*
|
||||
* Copyright 2005 Jacek Caban
|
||||
*
|
||||
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#define WIN32_NO_STATUS
|
||||
#define _INC_WINDOWS
|
||||
#define COM_NO_WINDOWS_H
|
||||
|
||||
#define COBJMACROS
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <windef.h>
|
||||
#include <winbase.h>
|
||||
#include <objbase.h>
|
||||
|
||||
//#include "oaidl.h"
|
||||
//#include "rpcproxy.h"
|
||||
#include <atlbase.h>
|
||||
|
||||
#include <wine/debug.h>
|
||||
//#include "wine/unicode.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(atl);
|
||||
|
||||
/**************************************************************
|
||||
* ClassFactory implementation
|
||||
*/
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_QueryInterface(IClassFactory *iface, REFIID riid, void **ppvObject)
|
||||
{
|
||||
TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppvObject);
|
||||
|
||||
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) {
|
||||
*ppvObject = iface;
|
||||
IClassFactory_AddRef( iface );
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static ULONG WINAPI RegistrarCF_AddRef(IClassFactory *iface)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
static ULONG WINAPI RegistrarCF_Release(IClassFactory *iface)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_CreateInstance(IClassFactory *iface, LPUNKNOWN pUnkOuter,
|
||||
REFIID riid, void **ppv)
|
||||
{
|
||||
IRegistrar *registrar;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
|
||||
|
||||
if(pUnkOuter) {
|
||||
*ppv = NULL;
|
||||
return CLASS_E_NOAGGREGATION;
|
||||
}
|
||||
|
||||
hres = AtlCreateRegistrar(®istrar);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
hres = IRegistrar_QueryInterface(registrar, riid, ppv);
|
||||
IRegistrar_Release(registrar);
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI RegistrarCF_LockServer(IClassFactory *iface, BOOL lock)
|
||||
{
|
||||
TRACE("(%p)->(%x)\n", iface, lock);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const IClassFactoryVtbl IRegistrarCFVtbl = {
|
||||
RegistrarCF_QueryInterface,
|
||||
RegistrarCF_AddRef,
|
||||
RegistrarCF_Release,
|
||||
RegistrarCF_CreateInstance,
|
||||
RegistrarCF_LockServer
|
||||
};
|
||||
|
||||
static IClassFactory RegistrarCF = { &IRegistrarCFVtbl };
|
||||
|
||||
/**************************************************************
|
||||
* DllGetClassObject (ATL.2)
|
||||
*/
|
||||
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, LPVOID *ppvObject)
|
||||
{
|
||||
TRACE("(%s %s %p)\n", debugstr_guid(clsid), debugstr_guid(riid), ppvObject);
|
||||
|
||||
if(IsEqualGUID(&CLSID_Registrar, clsid))
|
||||
return IClassFactory_QueryInterface( &RegistrarCF, riid, ppvObject );
|
||||
|
||||
FIXME("Not supported class %s\n", debugstr_guid(clsid));
|
||||
return CLASS_E_CLASSNOTAVAILABLE;
|
||||
}
|
||||
|
||||
extern HINSTANCE hInst;
|
||||
|
||||
static HRESULT do_register_dll_server(IRegistrar *pRegistrar, LPCOLESTR wszDll,
|
||||
LPCOLESTR wszId, BOOL do_register,
|
||||
const struct _ATL_REGMAP_ENTRY* pMapEntries)
|
||||
{
|
||||
IRegistrar *registrar;
|
||||
HRESULT hres;
|
||||
const struct _ATL_REGMAP_ENTRY *pMapEntry;
|
||||
|
||||
static const WCHAR wszModule[] = {'M','O','D','U','L','E',0};
|
||||
static const WCHAR wszRegistry[] = {'R','E','G','I','S','T','R','Y',0};
|
||||
|
||||
if(pRegistrar) {
|
||||
registrar = pRegistrar;
|
||||
}else {
|
||||
hres = AtlCreateRegistrar(®istrar);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
}
|
||||
|
||||
IRegistrar_AddReplacement(registrar, wszModule, wszDll);
|
||||
|
||||
for (pMapEntry = pMapEntries; pMapEntry && pMapEntry->szKey; pMapEntry++)
|
||||
IRegistrar_AddReplacement(registrar, pMapEntry->szKey, pMapEntry->szData);
|
||||
|
||||
if(do_register)
|
||||
hres = IRegistrar_ResourceRegisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
else
|
||||
hres = IRegistrar_ResourceUnregisterSz(registrar, wszDll, wszId, wszRegistry);
|
||||
|
||||
if(registrar != pRegistrar)
|
||||
IRegistrar_Release(registrar);
|
||||
return hres;
|
||||
}
|
||||
|
||||
static HRESULT do_register_server(BOOL do_register)
|
||||
{
|
||||
static const WCHAR CLSID_RegistrarW[] =
|
||||
{'C','L','S','I','D','_','R','e','g','i','s','t','r','a','r',0};
|
||||
static const WCHAR atl_dllW[] = {'a','t','l','.','d','l','l',0};
|
||||
|
||||
WCHAR clsid_str[40];
|
||||
const struct _ATL_REGMAP_ENTRY reg_map[] = {{CLSID_RegistrarW, clsid_str}, {NULL,NULL}};
|
||||
|
||||
StringFromGUID2(&CLSID_Registrar, clsid_str, sizeof(clsid_str)/sizeof(WCHAR));
|
||||
return do_register_dll_server(NULL, atl_dllW, MAKEINTRESOURCEW(101), do_register, reg_map);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* AtlModuleUpdateRegistryFromResourceD [ATL.@]
|
||||
*
|
||||
*/
|
||||
HRESULT WINAPI AtlModuleUpdateRegistryFromResourceD(_ATL_MODULEW* pM, LPCOLESTR lpszRes,
|
||||
BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg)
|
||||
{
|
||||
HINSTANCE lhInst = pM->m_hInst;
|
||||
/* everything inside this function below this point
|
||||
* should go into atl71.AtlUpdateRegistryFromResourceD
|
||||
*/
|
||||
WCHAR module_name[MAX_PATH];
|
||||
|
||||
if(!GetModuleFileNameW(lhInst, module_name, MAX_PATH)) {
|
||||
FIXME("hinst %p: did not get module name\n",
|
||||
lhInst);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
TRACE("%p (%s), %s, %d, %p, %p\n", hInst, debugstr_w(module_name),
|
||||
debugstr_w(lpszRes), bRegister, pMapEntries, pReg);
|
||||
|
||||
return do_register_dll_server(pReg, module_name, lpszRes, bRegister, pMapEntries);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllRegisterServer (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllRegisterServer(void)
|
||||
{
|
||||
/* Note: we can't use __wine_register_server here because it uses CLSID_Registrar which isn't registred yet */
|
||||
return do_register_server(TRUE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllUnRegisterServer (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllUnregisterServer(void)
|
||||
{
|
||||
return do_register_server(FALSE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* DllCanUnloadNow (ATL.@)
|
||||
*/
|
||||
HRESULT WINAPI DllCanUnloadNow(void)
|
||||
{
|
||||
return S_FALSE;
|
||||
}
|
|
@ -50,7 +50,7 @@ reactos/dll/directx/wine/wined3d # Synced to Wine-1.7.1
|
|||
reactos/dll/win32/activeds # Synced to Wine-1.1.43?
|
||||
reactos/dll/win32/actxprxy # Synced to Wine-1.5.26
|
||||
reactos/dll/win32/advpack # Synced to Wine-1.7.1
|
||||
reactos/dll/win32/atl # Synced to Wine-1.5.19
|
||||
reactos/dll/win32/atl # Synced to Wine-1.7.1
|
||||
reactos/dll/win32/atl100 # Synced to Wine-1.7.1
|
||||
reactos/dll/win32/atl80 # Synced to Wine-1.7.1
|
||||
reactos/dll/win32/avifil32 # Synced to Wine-1.5.26
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue