dllhost: Try to load the dll server's factory at the start.
This lets dllhost quit early if the factory cannot be loaded. Signed-off-by: Huw Davies <huw@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
6eca6ad686
commit
7dd952d5a9
|
@ -34,6 +34,7 @@ struct factory
|
||||||
IMarshal IMarshal_iface;
|
IMarshal IMarshal_iface;
|
||||||
CLSID clsid;
|
CLSID clsid;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
IClassFactory *dll_factory;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct factory *impl_from_IClassFactory(IClassFactory *iface)
|
static inline struct factory *impl_from_IClassFactory(IClassFactory *iface)
|
||||||
|
@ -90,7 +91,10 @@ static ULONG WINAPI factory_Release(IClassFactory *iface)
|
||||||
TRACE("(%p)->%lu\n", iface, ref);
|
TRACE("(%p)->%lu\n", iface, ref);
|
||||||
|
|
||||||
if (!ref)
|
if (!ref)
|
||||||
|
{
|
||||||
|
if (factory->dll_factory) IClassFactory_Release(factory->dll_factory);
|
||||||
HeapFree(GetProcessHeap(), 0, factory);
|
HeapFree(GetProcessHeap(), 0, factory);
|
||||||
|
}
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
@ -166,18 +170,10 @@ static HRESULT WINAPI marshal_MarshalInterface(IMarshal *iface, IStream *stream,
|
||||||
void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
|
void *pv, DWORD dwDestContext, void *pvDestContext, DWORD mshlflags)
|
||||||
{
|
{
|
||||||
struct factory *factory = impl_from_IMarshal(iface);
|
struct factory *factory = impl_from_IMarshal(iface);
|
||||||
IUnknown *object;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
TRACE("(%p,%s,%p,%08lx,%p,%08lx)\n", stream, wine_dbgstr_guid(iid), pv, dwDestContext, pvDestContext, mshlflags);
|
TRACE("(%p,%s,%p,%08lx,%p,%08lx)\n", stream, wine_dbgstr_guid(iid), pv, dwDestContext, pvDestContext, mshlflags);
|
||||||
|
|
||||||
hr = CoGetClassObject(&factory->clsid, CLSCTX_INPROC_SERVER, NULL, iid, (void **)&object);
|
return CoMarshalInterface(stream, iid, (IUnknown *)factory->dll_factory, dwDestContext, pvDestContext, mshlflags);
|
||||||
if (hr == S_OK)
|
|
||||||
{
|
|
||||||
hr = CoMarshalInterface(stream, iid, object, dwDestContext, pvDestContext, mshlflags);
|
|
||||||
IUnknown_Release(object);
|
|
||||||
}
|
|
||||||
return hr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI marshal_UnmarshalInterface(IMarshal *iface, IStream *stream,
|
static HRESULT WINAPI marshal_UnmarshalInterface(IMarshal *iface, IStream *stream,
|
||||||
|
@ -275,10 +271,13 @@ static HRESULT WINAPI surrogate_LoadDllServer(ISurrogate *iface, const CLSID *cl
|
||||||
factory->IMarshal_iface.lpVtbl = &Marshal_Vtbl;
|
factory->IMarshal_iface.lpVtbl = &Marshal_Vtbl;
|
||||||
factory->clsid = *clsid;
|
factory->clsid = *clsid;
|
||||||
factory->ref = 1;
|
factory->ref = 1;
|
||||||
|
factory->dll_factory = NULL;
|
||||||
|
|
||||||
hr = CoRegisterClassObject(clsid, (IUnknown *)&factory->IClassFactory_iface,
|
hr = CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, &IID_IClassFactory, (void **)&factory->dll_factory);
|
||||||
CLSCTX_LOCAL_SERVER, REGCLS_SURROGATE, &surrogate->cookie);
|
if (SUCCEEDED(hr))
|
||||||
if (hr != S_OK)
|
hr = CoRegisterClassObject(clsid, (IUnknown *)&factory->IClassFactory_iface,
|
||||||
|
CLSCTX_LOCAL_SERVER, REGCLS_SURROGATE, &surrogate->cookie);
|
||||||
|
if (FAILED(hr))
|
||||||
IClassFactory_Release(&factory->IClassFactory_iface);
|
IClassFactory_Release(&factory->IClassFactory_iface);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue