[Bug 33887] New: Patches for marshaling VT_UNKNOWN in SAFEARRAYS

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Jun 25 22:17:28 CDT 2013


http://bugs.winehq.org/show_bug.cgi?id=33887

             Bug #: 33887
           Summary: Patches for marshaling VT_UNKNOWN in SAFEARRAYS
           Product: Wine
           Version: 1.6-rc3
          Platform: x86-64
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: oleaut32
        AssignedTo: wine-bugs at winehq.org
        ReportedBy: rosen.diankov at gmail.com
    Classification: Unclassified


Many applications marshal SAFEARRAY structures with IUnknown interfaces in
them. The following short patches in dlls/oleaut32/usrmarshal.c should
implement support for them.

One thing I'm not sure yet is if the marshaling requires 4-byte alignment.
Seems to work as is though:

in
<code>
  ULONG WINAPI LPSAFEARRAY_UserSize(ULONG *pFlags, ULONG StartingSize,
LPSAFEARRAY *ppsa)
</code>

add
<code>
            case SF_UNKNOWN:
            case SF_DISPATCH:
            case SF_HAVEIID:
            {
                IUnknown** ppUnknown;
                FIXME("size interfaces 0x%x\n", sftype);
                for (ppUnknown = psa->pvData; ulCellCount; ulCellCount--,
ppUnknown++) {
                    size += interface_variant_size(pFlags, &IID_IUnknown,
*ppUnknown);
                }
                break;
            }
</code>  

In
<code>
  unsigned char * WINAPI LPSAFEARRAY_UserMarshal(ULONG *pFlags, unsigned char
*Buffer, LPSAFEARRAY *ppsa)
</code>

add

<code>
                case SF_UNKNOWN:
                case SF_DISPATCH:
                case SF_HAVEIID:
                {
                    IUnknown** ppUnknown;
                    FIXME("marshal interfaces 0x%x\n", sftype);
                    for (ppUnknown = psa->pvData; ulCellCount; ulCellCount--,
ppUnknown++) {
                        /* this should probably call
WdtpInterfacePointer_UserMarshal in ole32.dll */
                        Buffer = interface_variant_marshal(pFlags, Buffer,
&IID_IUnknown, *ppUnknown);
                    }
                    break;
                }
</code>

in

<code>  
  unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(ULONG *pFlags, unsigned char
*Buffer, LPSAFEARRAY *ppsa)
</code>

<code>
            case SF_UNKNOWN:
            case SF_DISPATCH:
            case SF_HAVEIID:
            {
                IUnknown** ppUnknown;
                FIXME("unmarshal interfaces 0x%x\n", sftype);
                for (ppUnknown = (*ppsa)->pvData; cell_count; cell_count--,
ppUnknown++) {
                    /* this should probably call
WdtpInterfacePointer_UserUnmarshal in ole32.dll */
                    Buffer = interface_variant_unmarshal(pFlags, Buffer,
&IID_IUnknown, ppUnknown);
                }
                break;
            }
</code>

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list