ole: Defer apartment window creation until the first object is marshalled.
This commit is contained in:
parent
fcba783fc7
commit
cd2fafb775
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
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)
|
||||||
*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
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue