[PATCH v2 1/7] wmp: Add IWMPPlayer interface

Jacek Caban jacek at codeweavers.com
Wed Feb 7 04:12:32 CST 2018


Hi Anton,


On 2/7/18 6:40 AM, Anton Romanov wrote:
>> On 02/02/2018 07:00 AM, Anton Romanov wrote:
>>>           TRACE("(%p)->(IID_IWMPPlayer4 %p)\n", This, ppv);
>>>           *ppv = &This->IWMPPlayer4_iface;
>>> +    }else if(IsEqualGUID(riid, &IID_IWMPPlayer)) {
>>> +        TRACE("(%p)->(IID_IWMPPlayer %p)\n", This, ppv);
>>> +        *ppv = &This->IWMPPlayer4_iface;
>>
>> You can't do that. IWMPPlayer4 doesn't inherit from IWMPPlayer, so it's
>> not the same interface. Also a short test (just calling QueryInterface()
>> and checking the result) would be nice.
> Btw, even though IWMPPlayer does not inherit it "duplicates the
> methods of IWMPPlayer, IWMPPlayer2, and IWMPPlayer3, inherits the
> methods of IWMPCore3, and exposes additional methods" (c) MSDN.
> So, is there really a need to duplicate a vtbl?

For this to work, vtbls of IWMPPlayer and IWMPPlayer4 would need to 
compatible (as in IWMPPlayerVtbl would have to be a prefix of 
IWMPPlayer4Vtbl). In this case it's not: IWMPPlayer4 has get_dvd() (from 
IWMPCore2) where IWMPPlayer has get_enabled().

Given that, for this to work we need separated vtbls. MSDN in such case 
is mostly targeted for C++ where compiler takes care of that, but we 
need to forward calls explicitly. Note that implementing IWMPPlayer on 
top of IWMPPlayer4 is trivial - just call proper IWMPPlayer4 function.

Jacek



More information about the wine-devel mailing list