Commit cd2fafb7 authored by Robert Shearman's avatar Robert Shearman Committed by Alexandre Julliard

ole: Defer apartment window creation until the first object is marshalled.

parent fcba783f
...@@ -236,9 +236,6 @@ static APARTMENT *apartment_construct(DWORD model) ...@@ -236,9 +236,6 @@ static APARTMENT *apartment_construct(DWORD model)
{ {
/* FIXME: should be randomly generated by in an RPC call to rpcss */ /* FIXME: should be randomly generated by in an RPC call to rpcss */
apt->oxid = ((OXID)GetCurrentProcessId() << 32) | GetCurrentThreadId(); apt->oxid = ((OXID)GetCurrentProcessId() << 32) | GetCurrentThreadId();
apt->win = CreateWindowW(wszAptWinClass, NULL, 0,
0, 0, 0, 0,
0, 0, OLE32_hInstance, NULL);
} }
else else
{ {
...@@ -422,6 +419,29 @@ static LRESULT CALLBACK apartment_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LP ...@@ -422,6 +419,29 @@ static LRESULT CALLBACK apartment_wndproc(HWND hWnd, UINT msg, WPARAM wParam, LP
} }
} }
HRESULT apartment_createwindowifneeded(struct apartment *apt)
{
if (!(apt->model & COINIT_APARTMENTTHREADED))
return S_OK;
if (!apt->win)
{
HWND hwnd = CreateWindowW(wszAptWinClass, NULL, 0,
0, 0, 0, 0,
0, 0, OLE32_hInstance, NULL);
if (!hwnd)
{
ERR("CreateWindow failed with error %ld\n", GetLastError());
return HRESULT_FROM_WIN32(GetLastError());
}
if (InterlockedCompareExchangePointer((PVOID *)&apt->win, hwnd, NULL))
/* someone beat us to it */
DestroyWindow(hwnd);
}
return S_OK;
}
HWND apartment_getwindow(struct apartment *apt) HWND apartment_getwindow(struct apartment *apt)
{ {
assert(apt->model & COINIT_APARTMENTTHREADED); assert(apt->model & COINIT_APARTMENTTHREADED);
......
...@@ -139,7 +139,7 @@ struct apartment ...@@ -139,7 +139,7 @@ struct apartment
DWORD tid; /* thread id (RO) */ DWORD tid; /* thread id (RO) */
OXID oxid; /* object exporter ID (RO) */ OXID oxid; /* object exporter ID (RO) */
LONG ipidc; /* interface pointer ID counter, starts at 1 (LOCK) */ LONG ipidc; /* interface pointer ID counter, starts at 1 (LOCK) */
HWND win; /* message window (RO) */ HWND win; /* message window (LOCK) */
CRITICAL_SECTION cs; /* thread safety */ CRITICAL_SECTION cs; /* thread safety */
LPMESSAGEFILTER filter; /* message filter (CS cs) */ LPMESSAGEFILTER filter; /* message filter (CS cs) */
struct list proxies; /* imported objects (CS cs) */ struct list proxies; /* imported objects (CS cs) */
...@@ -230,6 +230,7 @@ static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid) ...@@ -230,6 +230,7 @@ static inline HRESULT apartment_getoxid(struct apartment *apt, OXID *oxid)
*oxid = apt->oxid; *oxid = apt->oxid;
return S_OK; return S_OK;
} }
HRESULT apartment_createwindowifneeded(struct apartment *apt);
HWND apartment_getwindow(struct apartment *apt); HWND apartment_getwindow(struct apartment *apt);
void apartment_joinmta(void); void apartment_joinmta(void);
......
...@@ -98,6 +98,10 @@ HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnkno ...@@ -98,6 +98,10 @@ HRESULT marshal_object(APARTMENT *apt, STDOBJREF *stdobjref, REFIID riid, IUnkno
if (hr != S_OK) if (hr != S_OK)
return hr; return hr;
hr = apartment_createwindowifneeded(apt);
if (hr != S_OK)
return hr;
hr = IUnknown_QueryInterface(object, riid, (void **)&iobject); hr = IUnknown_QueryInterface(object, riid, (void **)&iobject);
if (hr != S_OK) if (hr != S_OK)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment