COM inheritance Q
Robert Shearman
rob at codeweavers.com
Thu Jan 13 15:21:27 CST 2005
Mike Hearn wrote:
>On Thu, 13 Jan 2005 20:33:10 +0000, Ann and Jason Edmeades wrote:
>
>
>>Whats the solution?
>>
>>In d3d8 I would have coded IWineD3DSurfaceImpl_GetParent as
>>IWineD3DResourceImpl_GetParent(iface, pParent) because the Impl versions
>>were prototyped - Is this the only way to solve this?
>>
>>
>
>I'm kind of confused too but it seems you really want two interfaces
>that inherit from each other here rather than having two separate
>interfaces that happen to have the same name.
>
>So, IWineD3DSurface should inherit from IWineD3DResource which in
>turn should inherit from IUnknown. Then you fill out the vtable
>appropriately for overrides. Isn't object orientation in C fun :)
>
>typedef struct
>{
> IWineD3DSurfaceVtbl *lpVtbl;
> DWORD refcount;
> ....
>} WineD3DSurface;
>
>static IWineD3DSurfaceVtbl SurfaceVtbl = {
> /* IUnknown methods are reimplemented per object here but you could be cleverer */
> WineD3DSurface_QueryInterface,
> WineD3DSurface_AddRef,
> WineD3DSurface_Release,
>
> /* Now for the Resource methods */
> WineD3DResource_XXX,
> WineD3DResource_YYY,
>
> /* Now for the Surface methods */
> WineD3DSurface_AAA,
> WineD3DSurface_BBB
>};
>
>
But you'll get a warning because the WineD3DResource functions will take
a different type iface variable as their first parameter. You could cast
it to the correct type, but you'll lose all type checking on the
function and I wouldn't recommend it.
Rob
More information about the wine-devel
mailing list