ole32: Update comments in compobj.c.
This commit is contained in:
parent
e4cba25ac7
commit
de03fe3c0f
|
@ -34,9 +34,6 @@
|
||||||
* - Implement the OXID resolver so we don't need magic endpoint names for
|
* - Implement the OXID resolver so we don't need magic endpoint names for
|
||||||
* clients and servers to meet up
|
* clients and servers to meet up
|
||||||
*
|
*
|
||||||
* - Make all ole interface marshaling use NDR to be wire compatible with
|
|
||||||
* native DCOM
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -66,14 +63,12 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
HINSTANCE OLE32_hInstance = 0; /* FIXME: make static ... */
|
HINSTANCE OLE32_hInstance = 0;
|
||||||
|
|
||||||
#define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
|
#define ARRAYSIZE(array) (sizeof(array)/sizeof((array)[0]))
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* This section defines variables internal to the COM module.
|
* This section defines variables internal to the COM module.
|
||||||
*
|
|
||||||
* TODO: Most of these things will have to be made thread-safe.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
|
static HRESULT COM_GetRegisteredClassObject(const struct apartment *apt, REFCLSID rclsid,
|
||||||
|
@ -116,7 +111,7 @@ static LONG s_COMServerProcessReferences = 0;
|
||||||
* objects.
|
* objects.
|
||||||
*
|
*
|
||||||
* TODO: Make this data structure aware of inter-process communication. This
|
* TODO: Make this data structure aware of inter-process communication. This
|
||||||
* means that parts of this will be exported to the Wine Server.
|
* means that parts of this will be exported to rpcss.
|
||||||
*/
|
*/
|
||||||
typedef struct tagRegisteredClass
|
typedef struct tagRegisteredClass
|
||||||
{
|
{
|
||||||
|
@ -560,6 +555,8 @@ struct host_thread_params
|
||||||
HWND apartment_hwnd;
|
HWND apartment_hwnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* thread for hosting an object to allow an object to appear to be created in
|
||||||
|
* an apartment with an incompatible threading model */
|
||||||
static DWORD CALLBACK apartment_hostobject_thread(LPVOID p)
|
static DWORD CALLBACK apartment_hostobject_thread(LPVOID p)
|
||||||
{
|
{
|
||||||
struct host_thread_params *params = p;
|
struct host_thread_params *params = p;
|
||||||
|
@ -609,7 +606,12 @@ static DWORD CALLBACK apartment_hostobject_thread(LPVOID p)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT apartment_hostobject_in_hostapt(struct apartment *apt, BOOL multi_threaded, BOOL main_apartment, HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
|
/* finds or creates a host apartment, creates the object inside it and returns
|
||||||
|
* a proxy to it so that the object can be used in the apartment of the
|
||||||
|
* caller of this function */
|
||||||
|
static HRESULT apartment_hostobject_in_hostapt(
|
||||||
|
struct apartment *apt, BOOL multi_threaded, BOOL main_apartment,
|
||||||
|
HKEY hkeydll, REFCLSID rclsid, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
struct host_object_params params;
|
struct host_object_params params;
|
||||||
HWND apartment_hwnd = NULL;
|
HWND apartment_hwnd = NULL;
|
||||||
|
@ -715,6 +717,8 @@ static HRESULT apartment_hostobject_in_hostapt(struct apartment *apt, BOOL multi
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* create a window for the apartment or return the current one if one has
|
||||||
|
* already been created */
|
||||||
HRESULT apartment_createwindowifneeded(struct apartment *apt)
|
HRESULT apartment_createwindowifneeded(struct apartment *apt)
|
||||||
{
|
{
|
||||||
if (apt->multi_threaded)
|
if (apt->multi_threaded)
|
||||||
|
@ -738,6 +742,7 @@ HRESULT apartment_createwindowifneeded(struct apartment *apt)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* retrieves the window for the main- or apartment-threaded apartment */
|
||||||
HWND apartment_getwindow(const struct apartment *apt)
|
HWND apartment_getwindow(const struct apartment *apt)
|
||||||
{
|
{
|
||||||
assert(!apt->multi_threaded);
|
assert(!apt->multi_threaded);
|
||||||
|
@ -750,6 +755,8 @@ void apartment_joinmta(void)
|
||||||
COM_CurrentInfo()->apt = MTA;
|
COM_CurrentInfo()->apt = MTA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* gets the specified class object by loading the appropriate DLL, if
|
||||||
|
* necessary and calls the DllGetClassObject function for the DLL */
|
||||||
static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
|
static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
|
||||||
BOOL apartment_threaded,
|
BOOL apartment_threaded,
|
||||||
REFCLSID rclsid, REFIID riid, void **ppv)
|
REFCLSID rclsid, REFIID riid, void **ppv)
|
||||||
|
@ -822,6 +829,8 @@ static HRESULT apartment_getclassobject(struct apartment *apt, LPCWSTR dllpath,
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* frees unused libraries loaded by apartment_getclassobject by calling the
|
||||||
|
* DLL's DllCanUnloadNow entry point */
|
||||||
static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
|
static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
|
||||||
{
|
{
|
||||||
struct apartment_loaded_dll *entry, *next;
|
struct apartment_loaded_dll *entry, *next;
|
||||||
|
@ -834,6 +843,10 @@ static void apartment_freeunusedlibraries(struct apartment *apt, DWORD delay)
|
||||||
|
|
||||||
if (real_delay == INFINITE)
|
if (real_delay == INFINITE)
|
||||||
{
|
{
|
||||||
|
/* DLLs that return multi-threaded objects aren't unloaded
|
||||||
|
* straight away to cope for programs that have races between
|
||||||
|
* last object destruction and threads in the DLLs that haven't
|
||||||
|
* finished, despite DllCanUnloadNow returning S_OK */
|
||||||
if (entry->multi_threaded)
|
if (entry->multi_threaded)
|
||||||
real_delay = 10 * 60 * 1000; /* 10 minutes */
|
real_delay = 10 * 60 * 1000; /* 10 minutes */
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue