[PATCH] include: Define the _STGMEDIUM_UNION type for C++.
Zebediah Figura
z.figura12 at gmail.com
Wed Dec 18 16:04:27 CST 2019
On 12/18/19 1:23 PM, Jeff Smith wrote:
> 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")
Sure, that works too. I don't really have a preference.
>
> -- Jeff
>
More information about the wine-devel
mailing list