diff --git a/dlls/atl/atl.spec b/dlls/atl/atl.spec index d0966c1f70d..d1da1046dd5 100644 --- a/dlls/atl/atl.spec +++ b/dlls/atl/atl.spec @@ -49,4 +49,4 @@ 55 stub AtlModuleUnRegisterTypeLib 56 stub AtlModuleLoadTypeLib 57 stdcall AtlModuleUnregisterServerEx(ptr long ptr) -58 stub AtlModuleAddTermFunc +58 stdcall AtlModuleAddTermFunc(ptr ptr long) diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c index 95d3de6213d..11e1fb0a5fc 100644 --- a/dlls/atl/atl_main.c +++ b/dlls/atl/atl_main.c @@ -91,7 +91,35 @@ HRESULT WINAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE HRESULT WINAPI AtlModuleTerm(_ATL_MODULEA* pM) { + _ATL_TERMFUNC_ELEM *iter = pM->m_pTermFuncs, *tmp; + + TRACE("(%p)\n", pM); + + while(iter) { + iter->pFunc(iter->dw); + tmp = iter; + iter = iter->pNext; + HeapFree(GetProcessHeap(), 0, tmp); + } + HeapFree(GetProcessHeap(), 0, pM); + + return S_OK; +} + +HRESULT WINAPI AtlModuleAddTermFunc(_ATL_MODULEW *pM, _ATL_TERMFUNC pFunc, DWORD dw) +{ + _ATL_TERMFUNC_ELEM *termfunc_elem; + + 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; + + pM->m_pTermFuncs = termfunc_elem; + return S_OK; } diff --git a/dlls/atl/atlbase.h b/dlls/atl/atlbase.h index c7ced12baa6..8e221c9e602 100644 --- a/dlls/atl/atlbase.h +++ b/dlls/atl/atlbase.h @@ -145,6 +145,7 @@ HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID * iid, LPDW HRESULT WINAPI AtlFreeMarshalStream(IStream *pStream); HRESULT WINAPI AtlInternalQueryInterface(LPVOID pThis, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, LPVOID* ppvObject); HRESULT WINAPI AtlMarshalPtrInProc(IUnknown *pUnk, const IID *iid, IStream **ppStream); +HRESULT WINAPI AtlModuleAddTermFunc(_ATL_MODULEW *pM, _ATL_TERMFUNC pFunc, DWORD dw); HRESULT WINAPI AtlModuleInit(_ATL_MODULEA* pM, _ATL_OBJMAP_ENTRYA* p, HINSTANCE h); HRESULT WINAPI AtlModuleRegisterClassObjects(_ATL_MODULEA* pM, DWORD dwClsContext, DWORD dwFlags); HRESULT WINAPI AtlModuleRegisterServer(_ATL_MODULEW* pM, BOOL bRegTypeLib, const CLSID* pCLSID);