[PATCH v2 2/8] dllhost: Add ISurrogate stub implementation.

Dmitry Timoshkov dmitry at baikal.ru
Tue Feb 22 08:49:57 CST 2022


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 programs/dllhost/Makefile.in |  2 +-
 programs/dllhost/dllhost.c   | 82 +++++++++++++++++++++++++++++++++++-
 2 files changed, 82 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 10bfb084213..ac1cf0e3d33 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,6 +28,73 @@
 
 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
+};
+
+static struct surrogate surrogate = { { &Surrogate_Vtbl }, 0 };
+
 int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int showcmd)
 {
     HRESULT hr;
@@ -36,9 +105,20 @@ int WINAPI wWinMain(HINSTANCE hinst, HINSTANCE previnst, LPWSTR cmdline, int sho
     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;
-- 
2.35.1




More information about the wine-devel mailing list