Dmitry Timoshkov : dllhost: Add ISurrogate stub implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 8 16:10:49 CST 2022


Module: wine
Branch: master
Commit: 6b7686946b07caf55e3d38548394a1072559ae3a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6b7686946b07caf55e3d38548394a1072559ae3a

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Thu Feb 24 11:50:37 2022 +0300

dllhost: Add ISurrogate stub implementation.

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/Makefile.in |  2 +-
 programs/dllhost/dllhost.c   | 84 +++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/programs/dllhost/Makefile.in b/programs/dllhost/Makefile.in
index a92add9c2f0..bca6c208cdc 100644
--- a/programs/dllhost/Makefile.in
+++ b/programs/dllhost/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = dllhost.exe
-IMPORTS   = ole32
+IMPORTS   = ole32 uuid
 
 EXTRADLLFLAGS = -mwindows -municode
 
diff --git a/programs/dllhost/dllhost.c b/programs/dllhost/dllhost.c
index 39d2194db4b..a0d3b9937f1 100644
--- a/programs/dllhost/dllhost.c
+++ b/programs/dllhost/dllhost.c
@@ -18,6 +18,8 @@
 
 #include <stdarg.h>
 
+#define COBJMACROS
+
 #include <windef.h>
 #include <winbase.h>
 #include <objbase.h>
@@ -26,24 +28,104 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dllhost);
 
+struct surrogate
+{
+    ISurrogate ISurrogate_iface;
+    LONG ref;
+};
+
+static inline struct surrogate *impl_from_ISurrogate(ISurrogate *iface)
+{
+    return CONTAINING_RECORD(iface, struct surrogate, ISurrogate_iface);
+}
+
+static HRESULT WINAPI surrogate_QueryInterface(ISurrogate *iface,
+    REFIID iid, void **ppv)
+{
+    struct surrogate *surrogate = impl_from_ISurrogate(iface);
+
+    TRACE("(%p,%s,%p)\n", iface, wine_dbgstr_guid(iid), ppv);
+
+    if (!ppv) return E_INVALIDARG;
+
+    if (IsEqualIID(iid, &IID_IUnknown) ||
+        IsEqualIID(iid, &IID_ISurrogate))
+    {
+        ISurrogate_AddRef(&surrogate->ISurrogate_iface);
+        *ppv = &surrogate->ISurrogate_iface;
+        return S_OK;
+    }
+
+    *ppv = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI surrogate_AddRef(ISurrogate *iface)
+{
+    TRACE("(%p)\n", iface);
+    return 2;
+}
+
+static ULONG WINAPI surrogate_Release(ISurrogate *iface)
+{
+    TRACE("(%p)\n", iface);
+    return 1;
+}
+
+static HRESULT WINAPI surrogate_LoadDllServer(ISurrogate *iface, const CLSID *clsid)
+{
+    FIXME("(%p,%s): stub\n", iface, wine_dbgstr_guid(clsid));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI surrogate_FreeSurrogate(ISurrogate *iface)
+{
+    FIXME("(%p): stub\n", iface);
+    return E_NOTIMPL;
+}
+
+static const ISurrogateVtbl Surrogate_Vtbl =
+{
+    surrogate_QueryInterface,
+    surrogate_AddRef,
+    surrogate_Release,
+    surrogate_LoadDllServer,
+    surrogate_FreeSurrogate
+};
+
 int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int showcmd)
 {
     HRESULT hr;
     CLSID clsid;
+    struct surrogate surrogate;
 
     if (wcsnicmp(cmdline, L"/PROCESSID:", 11))
         return 0;
 
     cmdline += 11;
 
+    surrogate.ISurrogate_iface.lpVtbl = &Surrogate_Vtbl;
+    surrogate.ref = 1;
+
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
 
     hr = CLSIDFromString(cmdline, &clsid);
     if (hr == S_OK)
     {
-        FIXME("hosting object %s is not implemented\n", wine_dbgstr_guid(&clsid));
+        CoRegisterSurrogate(&surrogate.ISurrogate_iface);
+
+        hr = ISurrogate_LoadDllServer(&surrogate.ISurrogate_iface, &clsid);
+        if (hr != S_OK)
+        {
+            ERR("Can't create instance of %s\n", wine_dbgstr_guid(&clsid));
+            goto cleanup;
+        }
+
+        /* FIXME: wait for FreeSurrogate being called */
+        Sleep(INFINITE);
     }
 
+cleanup:
     CoUninitialize();
 
     return 0;




More information about the wine-cvs mailing list