[PATCH v2 2/8] dllhost: Add ISurrogate stub implementation.
Huw Davies
huw at codeweavers.com
Wed Feb 23 04:35:26 CST 2022
On Tue, Feb 22, 2022 at 05:49:57PM +0300, Dmitry Timoshkov wrote:
> 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 };
> +
In the next patch surrogate gets moved to be a local variable of wWinMain, so
it might as well start off there.
> 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);
CoRegisterSurrogate() is currently a stub. Do we know what this
is supposed to do?
Huw.
More information about the wine-devel
mailing list