From aad36bcd59703d61e0db22048ef1704c1cbdb804 Mon Sep 17 00:00:00 2001 From: Hidenori Takeshima Date: Tue, 11 Sep 2001 00:26:12 +0000 Subject: [PATCH] Synchronize access to the s_COMLockCount, firstRegisteredClass, openDllList in compobj. --- dlls/ole32/compobj.c | 256 ++++++++++++++++++++++++---------------- dlls/ole32/ole32_main.c | 2 + dlls/ole32/ole32_main.h | 3 + 3 files changed, 160 insertions(+), 101 deletions(-) diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 8918f2f6cb5..c1008ec6ea4 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -42,10 +42,10 @@ DEFAULT_DEBUG_CHANNEL(ole); /**************************************************************************** * COM External Lock structures and methods declaration * - * This api provides a linked list to managed external references to - * COM objects. + * This api provides a linked list to managed external references to + * COM objects. * - * The public interface consists of three calls: + * The public interface consists of three calls: * COM_ExternalLockAddRef * COM_ExternalLockRelease * COM_ExternalLockFreeList @@ -55,7 +55,7 @@ DEFAULT_DEBUG_CHANNEL(ole); #define EL_NOT_FOUND 0 /* - * Declaration of the static structure that manage the + * Declaration of the static structure that manage the * external lock to COM objects. */ typedef struct COM_ExternalLock COM_ExternalLock; @@ -80,7 +80,7 @@ struct COM_ExternalLockList static COM_ExternalLockList elList = { EL_END_OF_LIST }; /* - * Public Interface to the external lock list + * Public Interface to the external lock list */ static void COM_ExternalLockFreeList(); static void COM_ExternalLockAddRef(IUnknown *pUnk); @@ -88,7 +88,7 @@ static void COM_ExternalLockRelease(IUnknown *pUnk, BOOL bRelAll); void COM_ExternalLockDump(); /* testing purposes, not static to avoid warning */ /* - * Private methods used to managed the linked list + * Private methods used to managed the linked list */ static BOOL COM_ExternalLockInsert( IUnknown *pUnk); @@ -123,7 +123,7 @@ WORD Table_ETask[62]; * decreased every time CoUninitialize is called. When it hits 0, the COM * libraries are freed */ -static ULONG s_COMLockCount = 0; +static LONG s_COMLockCount = 0; /* * This linked list contains the list of registered class objects. These @@ -143,6 +143,7 @@ typedef struct tagRegisteredClass struct tagRegisteredClass* nextClass; } RegisteredClass; +static CRITICAL_SECTION csRegisteredClassList; static RegisteredClass* firstRegisteredClass = NULL; /* this open DLL table belongs in a per process table, but my guess is that @@ -150,10 +151,11 @@ static RegisteredClass* firstRegisteredClass = NULL; * space assuming that there is one OLE32 per process. */ typedef struct tagOpenDll { - HINSTANCE hLibrary; + HINSTANCE hLibrary; struct tagOpenDll *next; } OpenDll; +static CRITICAL_SECTION csOpenDllList; static OpenDll *openDllList = NULL; /* linked list of open dlls */ /***************************************************************************** @@ -167,6 +169,21 @@ static HRESULT COM_GetRegisteredClassObject(REFCLSID rclsid, static void COM_RevokeAllClasses(); +/****************************************************************************** + * Initialize/Uninitialize critical sections. + */ +void COMPOBJ_InitProcess( void ) +{ + InitializeCriticalSection( &csRegisteredClassList ); + InitializeCriticalSection( &csOpenDllList ); +} + +void COMPOBJ_UninitProcess( void ) +{ + DeleteCriticalSection( &csRegisteredClassList ); + DeleteCriticalSection( &csOpenDllList ); +} + /****************************************************************************** * CoBuildVersion [COMPOBJ.1] * CoBuildVersion [OLE32.4] @@ -201,7 +218,7 @@ HRESULT WINAPI CoInitialize16( HRESULT WINAPI CoInitialize( LPVOID lpReserved /* [in] pointer to win32 malloc interface (obsolete, should be NULL) */ -) +) { /* * Just delegate to the newer method. @@ -222,7 +239,7 @@ HRESULT WINAPI CoInitialize( * threading model. * * BUGS - * Only the single threaded model is supported. As a result RPC_E_CHANGED_MODE + * Only the single threaded model is supported. As a result RPC_E_CHANGED_MODE * is never returned. * * See the windows documentation for more details. @@ -231,7 +248,7 @@ HRESULT WINAPI CoInitializeEx( LPVOID lpReserved, /* [in] pointer to win32 malloc interface (obsolete, should be NULL) */ DWORD dwCoInit /* [in] A value from COINIT specifies the threading model */ -) +) { HRESULT hr; @@ -245,7 +262,7 @@ HRESULT WINAPI CoInitializeEx( /* * Check for unsupported features. */ - if (dwCoInit!=COINIT_APARTMENTTHREADED) + if (dwCoInit!=COINIT_APARTMENTTHREADED) { FIXME(":(%p,%x): unsupported flag %x\n", lpReserved, (int)dwCoInit, (int)dwCoInit); /* Hope for the best and continue anyway */ @@ -254,14 +271,17 @@ HRESULT WINAPI CoInitializeEx( /* * Check the lock count. If this is the first time going through the initialize * process, we have to initialize the libraries. + * + * And crank-up that lock count. */ - if (s_COMLockCount==0) + if (InterlockedExchangeAdd(&s_COMLockCount,1)==0) { /* * Initialize the various COM libraries and data structures. */ TRACE("() - Initializing the COM libraries\n"); + RunningObjectTableImpl_Initialize(); hr = S_OK; @@ -269,17 +289,12 @@ HRESULT WINAPI CoInitializeEx( else hr = S_FALSE; - /* - * Crank-up that lock count. - */ - s_COMLockCount++; - return hr; } /*********************************************************************** * CoUninitialize [COMPOBJ.3] - * Don't know what it does. + * Don't know what it does. * 3-Nov-98 -- this was originally misspelled, I changed it to what I * believe is the correct spelling */ @@ -298,18 +313,16 @@ void WINAPI CoUninitialize16(void) */ void WINAPI CoUninitialize(void) { + LONG lCOMRefCnt; TRACE("()\n"); - + /* * Decrease the reference count. - */ - s_COMLockCount--; - - /* * If we are back to 0 locks on the COM library, make sure we free * all the associated data structures. */ - if (s_COMLockCount==0) + lCOMRefCnt = InterlockedExchangeAdd(&s_COMLockCount,-1); + if (lCOMRefCnt==1) { /* * Release the various COM libraries and data structures. @@ -331,7 +344,12 @@ void WINAPI CoUninitialize(void) * This will free list of external references to COM objects. */ COM_ExternalLockFreeList(); -} + + } + else if (lCOMRefCnt<1) { + ERR( "CoUninitialize() - not CoInitialized.\n" ); + InterlockedExchangeAdd(&s_COMLockCount,1); /* restore the lock count. */ + } } /*********************************************************************** @@ -404,10 +422,10 @@ BOOL16 WINAPI IsEqualGUID16( /****************************************************************************** * CLSIDFromString [COMPOBJ.20] - * Converts a unique identifier from its string representation into + * Converts a unique identifier from its string representation into * the GUID struct. * - * Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] + * Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] * * RETURNS * the converted GUID @@ -509,7 +527,7 @@ HRESULT WINAPI CoCreateGuid( /****************************************************************************** * CLSIDFromString [OLE32.3] * IIDFromString [OLE32.74] - * Converts a unique identifier from its string representation into + * Converts a unique identifier from its string representation into * the GUID struct. * * UNDOCUMENTED @@ -554,7 +572,7 @@ static HRESULT WINE_StringFromCLSID( *idstr = 0x00; return E_FAIL; } - + sprintf(idstr, "{%08lX-%04X-%04X-%02X%02X-", id->Data1, id->Data2, id->Data3, id->Data4[0], id->Data4[1]); @@ -771,12 +789,12 @@ HRESULT WINAPI CLSIDFromProgID( * CoGetPSClsid [OLE32.22] * * This function returns the CLSID of the DLL that implements the proxy and stub - * for the specified interface. + * for the specified interface. * - * It determines this by searching the + * It determines this by searching the * HKEY_CLASSES_ROOT\Interface\{string form of riid}\ProxyStubClsid32 in the registry * and any interface id registered by CoRegisterPSClsid within the current process. - * + * * FIXME: We only search the registry, not ids registered with CoRegisterPSClsid. */ HRESULT WINAPI CoGetPSClsid( @@ -811,7 +829,7 @@ HRESULT WINAPI CoGetPSClsid( HeapFree(GetProcessHeap(),0,buf); /* ... Once we have the key, query the registry to get the - value of CLSID as a string, and convert it into a + value of CLSID as a string, and convert it into a proper CLSID structure to be passed back to the app */ buf2len = sizeof(buf2); if ( (RegQueryValueA(xhkey,NULL,buf2,&buf2len)) ) @@ -858,17 +876,17 @@ HRESULT WINAPI ReadClassStm(IStream *pStm,CLSID *pclsid) { ULONG nbByte; HRESULT res; - + TRACE("(%p,%p)\n",pStm,pclsid); if (pclsid==NULL) return E_INVALIDARG; - + res = IStream_Read(pStm,(void*)pclsid,sizeof(CLSID),&nbByte); if (FAILED(res)) return res; - + if (nbByte != sizeof(CLSID)) return S_FALSE; else @@ -958,10 +976,10 @@ BOOL16 WINAPI CoDosDateTimeToFileTime16(WORD wDosDate, WORD wDosTime, FILETIME * /*** * COM_GetRegisteredClassObject * - * This internal method is used to scan the registered class list to + * This internal method is used to scan the registered class list to * find a class object. * - * Params: + * Params: * rclsid Class ID of the class to find. * dwClsContext Class context to match. * ppv [out] returns a pointer to the class object. Complying @@ -973,8 +991,11 @@ static HRESULT COM_GetRegisteredClassObject( DWORD dwClsContext, LPUNKNOWN* ppUnk) { + HRESULT hr = S_FALSE; RegisteredClass* curClass; + EnterCriticalSection( &csRegisteredClassList ); + /* * Sanity check */ @@ -1004,7 +1025,8 @@ static HRESULT COM_GetRegisteredClassObject( IUnknown_AddRef(curClass->classObject); - return S_OK; + hr = S_OK; + goto end; } /* @@ -1013,10 +1035,12 @@ static HRESULT COM_GetRegisteredClassObject( curClass = curClass->nextClass; } +end: + LeaveCriticalSection( &csRegisteredClassList ); /* * If we get to here, we haven't found our class. */ - return S_FALSE; + return hr; } /****************************************************************************** @@ -1032,7 +1056,7 @@ HRESULT WINAPI CoRegisterClassObject( DWORD dwClsContext, /* [in] CLSCTX flags indicating the context in which to run the executable */ DWORD flags, /* [in] REGCLS flags indicating how connections are made */ LPDWORD lpdwRegister -) +) { RegisteredClass* newClass; LPUNKNOWN foundObject; @@ -1050,7 +1074,7 @@ HRESULT WINAPI CoRegisterClassObject( if ( (lpdwRegister==0) || (pUnk==0) ) { return E_INVALIDARG; -} + } /* * Initialize the cookie (out parameter) @@ -1073,7 +1097,7 @@ HRESULT WINAPI CoRegisterClassObject( return CO_E_OBJISREG; } - + /* * If it is not registered, we must create a new entry for this class and * append it to the registered class list. @@ -1081,7 +1105,10 @@ HRESULT WINAPI CoRegisterClassObject( * unique. */ newClass = HeapAlloc(GetProcessHeap(), 0, sizeof(RegisteredClass)); + if ( newClass == NULL ) + return E_OUTOFMEMORY; + EnterCriticalSection( &csRegisteredClassList ); /* * Initialize the node. */ @@ -1100,11 +1127,13 @@ HRESULT WINAPI CoRegisterClassObject( firstRegisteredClass = newClass; + LeaveCriticalSection( &csRegisteredClassList ); + /* * Assign the out parameter (cookie) */ *lpdwRegister = newClass->dwCookie; - + /* * We're successful Yippee! */ @@ -1119,13 +1148,16 @@ HRESULT WINAPI CoRegisterClassObject( * See the Windows documentation for more details. */ HRESULT WINAPI CoRevokeClassObject( - DWORD dwRegister) + DWORD dwRegister) { + HRESULT hr = E_INVALIDARG; RegisteredClass** prevClassLink; RegisteredClass* curClass; TRACE("(%08lx)\n",dwRegister); + EnterCriticalSection( &csRegisteredClassList ); + /* * Iterate through the whole list and try to match the cookie. */ @@ -1151,11 +1183,12 @@ HRESULT WINAPI CoRevokeClassObject( /* * Free the memory used by the chain node. - */ + */ HeapFree(GetProcessHeap(), 0, curClass); - return S_OK; -} + hr = S_OK; + goto end; + } /* * Step to the next class in the list. @@ -1164,10 +1197,12 @@ HRESULT WINAPI CoRevokeClassObject( curClass = curClass->nextClass; } +end: + LeaveCriticalSection( &csRegisteredClassList ); /* * If we get to here, we haven't found our class. */ - return E_INVALIDARG; + return hr; } /*********************************************************************** @@ -1184,7 +1219,7 @@ HRESULT WINAPI CoGetClassObject( WCHAR dllName[MAX_PATH+1]; DWORD dllNameLen = sizeof(dllName); HINSTANCE hLibrary; - typedef HRESULT CALLBACK (*DllGetClassObjectFunc)(REFCLSID clsid, + typedef HRESULT CALLBACK (*DllGetClassObjectFunc)(REFCLSID clsid, REFIID iid, LPVOID *ppv); DllGetClassObjectFunc DllGetClassObject; @@ -1201,7 +1236,7 @@ HRESULT WINAPI CoGetClassObject( } /* - * First, try and see if we can't match the class ID with one of the + * First, try and see if we can't match the class ID with one of the * registered classes. */ if (S_OK == COM_GetRegisteredClassObject(rclsid, dwClsContext, ®ClassObject)) @@ -1314,7 +1349,7 @@ HRESULT WINAPI GetClassFile(LPCOLESTR filePathName,CLSID *pclsid) /* if the file is not a storage object then attemps to match various bits in the file against a pattern in the registry. this case is not frequently used ! so I present only the psodocode for this case - + for(i=0;i=0) && (extention[i]=absFile[i]) );i--); - + /* get the progId associated to the extension */ progId=CoTaskMemAlloc(sizeProgId); @@ -1393,7 +1428,7 @@ HRESULT WINAPI CoCreateInstance( LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, - LPVOID *ppv) + LPVOID *ppv) { HRESULT hres; LPCLASSFACTORY lpclf = 0; @@ -1408,7 +1443,7 @@ HRESULT WINAPI CoCreateInstance( * Initialize the "out" parameter */ *ppv = 0; - + /* * Get a class factory to construct the object we want. */ @@ -1436,9 +1471,9 @@ HRESULT WINAPI CoCreateInstance( * CoCreateInstanceEx [OLE32.165] */ HRESULT WINAPI CoCreateInstanceEx( - REFCLSID rclsid, + REFCLSID rclsid, LPUNKNOWN pUnkOuter, - DWORD dwClsContext, + DWORD dwClsContext, COSERVERINFO* pServerInfo, ULONG cmq, MULTI_QI* pResults) @@ -1469,7 +1504,7 @@ HRESULT WINAPI CoCreateInstanceEx( /* * Get the object and get its IUnknown pointer. */ - hr = CoCreateInstance(rclsid, + hr = CoCreateInstance(rclsid, pUnkOuter, dwClsContext, &IID_IUnknown, @@ -1513,6 +1548,8 @@ void WINAPI CoFreeLibrary(HINSTANCE hLibrary) OpenDll *ptr, *prev; OpenDll *tmp; + EnterCriticalSection( &csOpenDllList ); + /* lookup library in linked list */ prev = NULL; for (ptr = openDllList; ptr != NULL; ptr=ptr->next) { @@ -1524,7 +1561,7 @@ void WINAPI CoFreeLibrary(HINSTANCE hLibrary) if (ptr == NULL) { /* shouldn't happen if user passed in a valid hLibrary */ - return; + goto end; } /* assert: ptr points to the library entry to free */ @@ -1539,7 +1576,8 @@ void WINAPI CoFreeLibrary(HINSTANCE hLibrary) HeapFree(GetProcessHeap(), 0, ptr); prev->next = tmp; } - +end: + LeaveCriticalSection( &csOpenDllList ); } @@ -1550,11 +1588,15 @@ void WINAPI CoFreeAllLibraries(void) { OpenDll *ptr, *tmp; + EnterCriticalSection( &csOpenDllList ); + for (ptr = openDllList; ptr != NULL; ) { tmp=ptr->next; CoFreeLibrary(ptr->hLibrary); ptr = tmp; } + + LeaveCriticalSection( &csOpenDllList ); } @@ -1569,10 +1611,12 @@ void WINAPI CoFreeUnusedLibraries(void) typedef HRESULT(*DllCanUnloadNowFunc)(void); DllCanUnloadNowFunc DllCanUnloadNow; + EnterCriticalSection( &csOpenDllList ); + for (ptr = openDllList; ptr != NULL; ) { DllCanUnloadNow = (DllCanUnloadNowFunc) GetProcAddress(ptr->hLibrary, "DllCanUnloadNow"); - + if ( (DllCanUnloadNow != NULL) && (DllCanUnloadNow() == S_OK) ) { tmp=ptr->next; @@ -1582,6 +1626,8 @@ void WINAPI CoFreeUnusedLibraries(void) ptr=ptr->next; } } + + LeaveCriticalSection( &csOpenDllList ); } /*********************************************************************** @@ -1608,7 +1654,7 @@ LPVOID WINAPI CoTaskMemAlloc( LPMALLOC lpmalloc; HRESULT ret = CoGetMalloc(0,&lpmalloc); - if (FAILED(ret)) + if (FAILED(ret)) return NULL; return IMalloc_Alloc(lpmalloc,size); @@ -1622,7 +1668,7 @@ VOID WINAPI CoTaskMemFree( LPMALLOC lpmalloc; HRESULT ret = CoGetMalloc(0,&lpmalloc); - if (FAILED(ret)) + if (FAILED(ret)) return; IMalloc_Free(lpmalloc, ptr); @@ -1639,8 +1685,8 @@ LPVOID WINAPI CoTaskMemRealloc( { LPMALLOC lpmalloc; HRESULT ret = CoGetMalloc(0,&lpmalloc); - - if (FAILED(ret)) + + if (FAILED(ret)) return NULL; return IMalloc_Realloc(lpmalloc, pvOld, size); @@ -1654,7 +1700,7 @@ HINSTANCE WINAPI CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree) HINSTANCE hLibrary; OpenDll *ptr; OpenDll *tmp; - + TRACE("(%s, %d)\n", debugstr_w(lpszLibName), bAutoFree); hLibrary = LoadLibraryExW(lpszLibName, 0, LOAD_WITH_ALTERED_SEARCH_PATH); @@ -1662,6 +1708,8 @@ HINSTANCE WINAPI CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree) if (!bAutoFree) return hLibrary; + EnterCriticalSection( &csOpenDllList ); + if (openDllList == NULL) { /* empty list -- add first node */ openDllList = (OpenDll*)HeapAlloc(GetProcessHeap(),0, sizeof(OpenDll)); @@ -1684,7 +1732,9 @@ HINSTANCE WINAPI CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree) openDllList->next = tmp; } } - + + LeaveCriticalSection( &csOpenDllList ); + return hLibrary; } @@ -1717,17 +1767,17 @@ HRESULT WINAPI CoLockObjectExternal( BOOL fLastUnlockReleases) /* [in] unlock all */ { - if (fLock) + if (fLock) { - /* + /* * Increment the external lock coutner, COM_ExternalLockAddRef also * increment the object's internal lock counter. */ - COM_ExternalLockAddRef( pUnk); + COM_ExternalLockAddRef( pUnk); } else { - /* + /* * Decrement the external lock coutner, COM_ExternalLockRelease also * decrement the object's internal lock counter. */ @@ -1761,7 +1811,7 @@ HRESULT WINAPI CoSetState(LPDWORD state) HRESULT WINAPI CoCreateFreeThreadedMarshaler (LPUNKNOWN punkOuter, LPUNKNOWN* ppunkMarshal) { FIXME ("(%p %p): stub\n", punkOuter, ppunkMarshal); - + return S_OK; } @@ -1770,7 +1820,7 @@ HRESULT WINAPI CoCreateFreeThreadedMarshaler (LPUNKNOWN punkOuter, LPUNKNOWN* pp * DllGetClassObject [OLE32.63] */ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) -{ +{ FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); *ppv = NULL; return CLASS_E_CLASSNOTAVAILABLE; @@ -1780,16 +1830,20 @@ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) /*** * COM_RevokeAllClasses * - * This method is called when the COM libraries are uninitialized to + * This method is called when the COM libraries are uninitialized to * release all the references to the class objects registered with * the library */ static void COM_RevokeAllClasses() { + EnterCriticalSection( &csRegisteredClassList ); + while (firstRegisteredClass!=0) { CoRevokeClassObject(firstRegisteredClass->dwCookie); } + + LeaveCriticalSection( &csRegisteredClassList ); } /**************************************************************************** @@ -1797,7 +1851,7 @@ static void COM_RevokeAllClasses() */ /**************************************************************************** - * Public - Method that increments the count for a IUnknown* in the linked + * Public - Method that increments the count for a IUnknown* in the linked * list. The item is inserted if not already in the list. */ static void COM_ExternalLockAddRef( @@ -1818,11 +1872,11 @@ static void COM_ExternalLockAddRef( /* * Add an internal lock to the object */ - IUnknown_AddRef(pUnk); + IUnknown_AddRef(pUnk); } /**************************************************************************** - * Public - Method that decrements the count for a IUnknown* in the linked + * Public - Method that decrements the count for a IUnknown* in the linked * list. The item is removed from the list if its count end up at zero or if * bRelAll is TRUE. */ @@ -1839,10 +1893,10 @@ static void COM_ExternalLockRelease( externalLock->uRefCount--; /* release external locks */ IUnknown_Release(pUnk); /* release local locks as well */ - if ( bRelAll == FALSE ) + if ( bRelAll == FALSE ) break; /* perform single release */ - } while ( externalLock->uRefCount > 0 ); + } while ( externalLock->uRefCount > 0 ); if ( externalLock->uRefCount == 0 ) /* get rid of the list entry */ COM_ExternalLockDelete(externalLock); @@ -1860,7 +1914,7 @@ static void COM_ExternalLockFreeList() { COM_ExternalLockDelete(head); /* get rid of the head stuff */ - head = elList.head; /* get the new head... */ + head = elList.head; /* get the new head... */ } } @@ -1876,10 +1930,10 @@ void COM_ExternalLockDump() while ( current != EL_END_OF_LIST ) { DPRINTF( "\t%p with %lu references count.\n", current->pUnk, current->uRefCount); - - /* Skip to the next item */ + + /* Skip to the next item */ current = current->next; - } + } } @@ -1899,13 +1953,13 @@ static COM_ExternalLock* COM_ExternalLockLocate( COM_ExternalLock *element, IUnknown *pUnk) { - if ( element == EL_END_OF_LIST ) + if ( element == EL_END_OF_LIST ) return EL_NOT_FOUND; else if ( element->pUnk == pUnk ) /* We found it */ return element; - else /* Not the right guy, keep on looking */ + else /* Not the right guy, keep on looking */ return COM_ExternalLockLocate( element->next, pUnk); } @@ -1925,13 +1979,13 @@ static BOOL COM_ExternalLockInsert( if (newLock!=NULL) { - if ( elList.head == EL_END_OF_LIST ) + if ( elList.head == EL_END_OF_LIST ) { elList.head = newLock; /* The list is empty */ } - else + else { - /* + /* * insert does it at the head */ previousHead = elList.head; @@ -1939,12 +1993,12 @@ static BOOL COM_ExternalLockInsert( } /* - * Set new list item data member + * Set new list item data member */ newLock->pUnk = pUnk; newLock->uRefCount = 1; newLock->next = previousHead; - + return TRUE; } else @@ -1961,27 +2015,27 @@ static void COM_ExternalLockDelete( if ( current == itemList ) { - /* - * this section handles the deletion of the first node + /* + * this section handles the deletion of the first node */ elList.head = itemList->next; - HeapFree( GetProcessHeap(), 0, itemList); + HeapFree( GetProcessHeap(), 0, itemList); } else { - do + do { if ( current->next == itemList ) /* We found the item to free */ { current->next = itemList->next; /* readjust the list pointers */ - - HeapFree( GetProcessHeap(), 0, itemList); - break; + + HeapFree( GetProcessHeap(), 0, itemList); + break; } - - /* Skip to the next item */ + + /* Skip to the next item */ current = current->next; - + } while ( current != EL_END_OF_LIST ); } } diff --git a/dlls/ole32/ole32_main.c b/dlls/ole32/ole32_main.c index ecdc0454f96..388a0aa06ad 100644 --- a/dlls/ole32/ole32_main.c +++ b/dlls/ole32/ole32_main.c @@ -22,9 +22,11 @@ BOOL WINAPI OLE32_DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImp switch(fdwReason) { case DLL_PROCESS_ATTACH: OLE32_hInstance = hinstDLL; + COMPOBJ_InitProcess(); break; case DLL_PROCESS_DETACH: + COMPOBJ_UninitProcess(); OLE32_hInstance = 0; break; } diff --git a/dlls/ole32/ole32_main.h b/dlls/ole32/ole32_main.h index c1bdd24ca12..1428b4df1eb 100644 --- a/dlls/ole32/ole32_main.h +++ b/dlls/ole32/ole32_main.h @@ -5,4 +5,7 @@ extern HINSTANCE OLE32_hInstance; +void COMPOBJ_InitProcess( void ); +void COMPOBJ_UninitProcess( void ); + #endif /* __WINE_OLE32_MAIN_H */