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