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