[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