Dmitry Timoshkov : dllhost: Implement ISurrogate::FreeSurrogate().
Alexandre Julliard
julliard at winehq.org
Thu Mar 10 16:10:15 CST 2022
Module: wine
Branch: master
Commit: 5af53a9794f9ad18753682d185ea4c709d3cde43
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5af53a9794f9ad18753682d185ea4c709d3cde43
Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date: Wed Mar 9 10:45:48 2022 +0300
dllhost: Implement ISurrogate::FreeSurrogate().
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/dllhost/dllhost.c | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/programs/dllhost/dllhost.c b/programs/dllhost/dllhost.c
index 691f233906a..bfe1d4cbbd6 100644
--- a/programs/dllhost/dllhost.c
+++ b/programs/dllhost/dllhost.c
@@ -204,6 +204,7 @@ struct surrogate
ISurrogate ISurrogate_iface;
IClassFactory *factory;
DWORD cookie;
+ HANDLE event;
LONG ref;
};
@@ -267,15 +268,35 @@ static HRESULT WINAPI surrogate_LoadDllServer(ISurrogate *iface, const CLSID *cl
if (hr != S_OK)
IClassFactory_Release(&factory->IClassFactory_iface);
else
+ {
surrogate->factory = &factory->IClassFactory_iface;
+ surrogate->event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ }
return hr;
}
static HRESULT WINAPI surrogate_FreeSurrogate(ISurrogate *iface)
{
- FIXME("(%p): stub\n", iface);
- return E_NOTIMPL;
+ struct surrogate *surrogate = impl_from_ISurrogate(iface);
+
+ 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 =
@@ -301,6 +322,7 @@ int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int sho
surrogate.ISurrogate_iface.lpVtbl = &Surrogate_Vtbl;
surrogate.factory = NULL;
surrogate.cookie = 0;
+ surrogate.event = NULL;
surrogate.ref = 1;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
@@ -317,8 +339,7 @@ int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int sho
goto cleanup;
}
- /* FIXME: wait for FreeSurrogate being called */
- Sleep(INFINITE);
+ WaitForSingleObject(surrogate.event, INFINITE);
}
cleanup:
More information about the wine-cvs
mailing list