OleFont: Fix IDispatch Implementation (was Re: olefont: GetIDsOfNames)

Robert Shearman rob at codeweavers.com
Fri Sep 16 14:45:47 CDT 2005

Walt Ogburn wrote:

>I'm not sure how to proceed here.  My small patch makes the GetIDsOfNames
>in olefont work, so that programs that want to use GetIDsOfNames to get a
>DISPID code and then use Invoke to set font size, bold, etc. will work.
>With your bigger patch, IFontDisp uses the GetIDsOfNames from typelib.c,
>which also works, but it also uses the Invoke from typelib.c, which
>doesn't know how to set the font size, etc.

It does know how to do that - it uses the typelib to calculate an offset 
in the vtable of the this pointer passed into CreateStdDispatch and 
calls the matching method.

>Therefore, programs that try
>to get the DISPID code with GetIDsOfNames and then set some property with
>Invoke are broken at a different point after your patch.

Have you tested this? How exactly do they break? Do they crash or does 
Invoke return an error?

>The thing is, I don't see how the Invoke in typelib.c can be made to get
>and set the font size, font weight, etc. correctly.  It shouldn't know
>about the internal structure of OLEFontImpl, right?  So how can it know
>that DISPID_FONT_WEIGHT and DISPID_FONT_BOLD mean doing doing different
>things to the same field in the OLEFontImpl, or where to find it?

Again, it should look up the offset in the vtable to call the 
appropriate put_... or get_... function depending on whether propget or 
propput is specified.

>If you know how to make Invoke work again after your patch, that would be

It is possible that I overlooked something that we need to do for the 
invoking through a typelib to work. I'll need more info to find this out.

Rob Shearman

More information about the wine-devel mailing list