dllhost: Implement ISurrogate::FreeSurrogate().

Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Dmitry Timoshkov 2022-03-09 10:45:48 +03:00 committed by Alexandre Julliard
parent 0bf6066b2b
commit 5af53a9794

View file

@ -204,6 +204,7 @@ struct surrogate
ISurrogate ISurrogate_iface; ISurrogate ISurrogate_iface;
IClassFactory *factory; IClassFactory *factory;
DWORD cookie; DWORD cookie;
HANDLE event;
LONG ref; LONG ref;
}; };
@ -267,15 +268,35 @@ static HRESULT WINAPI surrogate_LoadDllServer(ISurrogate *iface, const CLSID *cl
if (hr != S_OK) if (hr != S_OK)
IClassFactory_Release(&factory->IClassFactory_iface); IClassFactory_Release(&factory->IClassFactory_iface);
else else
{
surrogate->factory = &factory->IClassFactory_iface; surrogate->factory = &factory->IClassFactory_iface;
surrogate->event = CreateEventW(NULL, FALSE, FALSE, NULL);
}
return hr; return hr;
} }
static HRESULT WINAPI surrogate_FreeSurrogate(ISurrogate *iface) static HRESULT WINAPI surrogate_FreeSurrogate(ISurrogate *iface)
{ {
FIXME("(%p): stub\n", iface); struct surrogate *surrogate = impl_from_ISurrogate(iface);
return E_NOTIMPL;
TRACE("(%p)\n", iface);
if (surrogate->cookie)
{
CoRevokeClassObject(surrogate->cookie);
surrogate->cookie = 0;
}
if (surrogate->factory)
{
IClassFactory_Release(surrogate->factory);
surrogate->factory = NULL;
}
SetEvent(surrogate->event);
return S_OK;
} }
static const ISurrogateVtbl Surrogate_Vtbl = static const ISurrogateVtbl Surrogate_Vtbl =
@ -301,6 +322,7 @@ int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int sho
surrogate.ISurrogate_iface.lpVtbl = &Surrogate_Vtbl; surrogate.ISurrogate_iface.lpVtbl = &Surrogate_Vtbl;
surrogate.factory = NULL; surrogate.factory = NULL;
surrogate.cookie = 0; surrogate.cookie = 0;
surrogate.event = NULL;
surrogate.ref = 1; surrogate.ref = 1;
CoInitializeEx(NULL, COINIT_MULTITHREADED); CoInitializeEx(NULL, COINIT_MULTITHREADED);
@ -317,8 +339,7 @@ int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int sho
goto cleanup; goto cleanup;
} }
/* FIXME: wait for FreeSurrogate being called */ WaitForSingleObject(surrogate.event, INFINITE);
Sleep(INFINITE);
} }
cleanup: cleanup: