[PATCH] include: Define the _STGMEDIUM_UNION type for C++.

Jeff Smith whydoubt at gmail.com
Wed Dec 18 13:23:20 CST 2019


On Wed, Dec 18, 2019 at 11:55 AM Zebediah Figura <z.figura12 at gmail.com> wrote:
>
> This fixes a regression introduced by 732f67ed38a45911d726df8da5a68710d175ba1d.
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47710
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
>  include/objidl.idl | 22 +++++++++++++++++++++-
>  1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/include/objidl.idl b/include/objidl.idl
> index a0ad1f6e01..a5466c3698 100644
> --- a/include/objidl.idl
> +++ b/include/objidl.idl
> @@ -1426,8 +1426,11 @@ interface IAdviseSink : IUnknown
>      default:         wireHGLOBAL hGeneric;
>    } GDI_OBJECT;
>
> +/* Defining the _STGMEDIUM_UNION type yields a violation of the C spec when
> + * NONAMELESSUNION is not defined, so only define it for C++. */
> +cpp_quote("#ifdef __cplusplus")
>    typedef struct _userSTGMEDIUM {
> -    union switch(DWORD tymed) u {
> +    union _STGMEDIUM_UNION switch(DWORD tymed) u {
>      case TYMED_NULL:     ;
>      case TYMED_MFPICT:   wireHMETAFILEPICT hMetaFilePict;
>      case TYMED_ENHMF:    wireHENHMETAFILE hHEnhMetaFile;
> @@ -1439,6 +1442,23 @@ interface IAdviseSink : IUnknown
>      } DUMMYUNIONNAME;
>      IUnknown *pUnkForRelease;
>    } userSTGMEDIUM;
> +cpp_quote("#else")
> +cpp_quote("typedef struct _userSTGMEDIUM {")
> +cpp_quote("    struct {")
> +cpp_quote("        DWORD tymed;")
> +cpp_quote("        union {")
> +cpp_quote("            wireHMETAFILEPICT hMetaFilePict;")
> +cpp_quote("            wireHENHMETAFILE hHEnhMetaFile;")
> +cpp_quote("            GDI_OBJECT *hGdiHandle;")
> +cpp_quote("            wireHGLOBAL hGlobal;")
> +cpp_quote("            LPOLESTR lpszFileName;")
> +cpp_quote("            BYTE_BLOB *pstm;")
> +cpp_quote("            BYTE_BLOB *pstg;")
> +cpp_quote("        } u;")
> +cpp_quote("    } DUMMYUNIONNAME;")
> +cpp_quote("    IUnknown *pUnkForRelease;")
> +cpp_quote("} userSTGMEDIUM;")
> +cpp_quote("#endif")
>
>    typedef [unique] userSTGMEDIUM *wireSTGMEDIUM;
>    typedef [wire_marshal(wireSTGMEDIUM)] uSTGMEDIUM STGMEDIUM;
> --
> 2.24.1

Hi Zebediah,

I know this is getting into a "what's the least bad way to handle a
bad situation"...
But I'm wondering if defining away _STGMEDIUM_UNION for C wouldn't be
marginally better than pre-baking the code for C as you've done here.
Something along the lines of (I'm not where I can really test this) ...

+cpp_quote("#ifndef __cplusplus")
+cpp_quote("#define _STGMEDIUM_UNION")
+cpp_quote("#endif")
   typedef struct _userSTGMEDIUM {
-    union switch(DWORD tymed) u {
+    union _STGMEDIUM_UNION switch(DWORD tymed) u {
...
+cpp_quote("#ifndef __cplusplus")
+cpp_quote("#undef _STGMEDIUM_UNION")
+cpp_quote("#endif")

-- Jeff



More information about the wine-devel mailing list