GlobalInterfaceTable?

man, 2003-03-03 kl. 10:59 skrev Mike Hearn:
> > It is not implemented yet.
> >
> > Should not be hard though. It belongs to OLE32 I guess.
>> Yeah, it's in OLE32. To a COM newbie however, it looks positively scary
> - switching interfaces between threading contexts? Huh?
Yes, it might be a bit scary. The GIT is a pretty much a band-aid
solution for shortcomings in the other marshalling modes.
> Anyway, I've just been reading up on the whole
> apartment/threading/marshalling business. Just before I start though I'd
> like to check that this isn't part of the work TransGaming are doing on
> marshalling interfaces between threads as part of cleaning up
> InstallShield... can anybody comment on that?
No, we haven't implemented this interface, though once the apartment
stuff is in, I can see two approaches to implementing this interface.
Note that the GIT object is a process-wide singleton (any instantiation
requests should return the same object every time).
- the GIT object could live in a particular apartment (e.g.
ThreadingModel=Free, so it lives in the MTA). Every instantiation
request would then marshal the interface to the requestor's thread. Then
the marshalling code for the GIT interface will also automatically take
care of the marshalling of the interface pointers to be registered and
retrieved. (This might need Wine's CoCreateInstance/CoGetClassObject to
check the threadingmodels, and I haven't implemented that myself.)
- the GIT object could be apartment-independent (use the Free-Threaded
Marshaler). Then RegisterInterface would manually use CoMarshalInterface
to table-marshal the interface, and GetInterface would manually
unmarshal it.
This won't make a difference before apartments are properly implemented
in Wine, though. The code I have now still does not work exactly like it
should (I implement IRemUnknown improperly, I still use midl instead of
widl to generate the marshalling code), it still crashes a lot, and I'm
too busy to clean it up for submission to Wine just yet (but in case
that worries people into thinking that it won't get into wine, people
hereby have my permission to lift my OLE stuff from winex if they want,
I just won't submit it all myself before working on it some more and).