[python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()
Mark Hammond
skippy.hammond at gmail.com
Sat Jul 31 00:15:19 EDT 2021
On 30/07/2021 11:24 pm, William Belanger wrote:
> Hi,
>
>
> However, products are free to define events in whatever makes sense
> for them - eg, the object could take a plain IDispatch and try and
> dynamically query and deliver events to the methods here. If that's
> what the app in question does, then yeah, you don't need
> DispatchWithEvents and can do something simpler.
>
>
> In short, Antidote binary is launched, then its IApiOle interface takes
> the Dispatch object of the custom server I made and uses it to
> communicate back and forth.
>
> self.server = win32com.client.Dispatch("Correcteur.Antidote")
> self.antidote = win32com.client.Dispatch("Antidote.ApiOle")
> self.antidote.LanceOutilDispatch2(self.server, "C", "",
> str(version)) # Server, tool, lang, API version
>
>
> Using the Dispatch() method, the interface I made is working as
> expected, which means that the methods exposed in AdapteurAntidote are
> then being queried (updated example below). I did not try delivering
> back the resuts but I assume it should work.
>
>
> What I could not achieve is to get the server adapter class
> (AdapteurAntidote) to work with objects which are created at runtime,
> namely instances of other classes. I cannot set another runtime object
> as an attribute of the adapter class, nor pass it on instantiation.
> Thus, the adapter is quite useless in this case. Is it even possible
> using pywin32? If so, how?
You can get and set properties which are COM objects in the same way you
can get and set any other properties.
>
> Looking back at Antiote's C++ example, there is an idl file available
> from them.
A .idl file isn't much good to pywin32 - it wants a compiled version
(aka a typelib.) I'd be quite surprised if their DLL had a .idl file and
not a compiled version of it.
> Is it necessary though? I would rather do everything
> dynamically, such as setting the GUID, just like I did for the DBus
> interface.
In general, early-binding via a typelib should not be necessary -
however, pywin32 does far less guessing about things when a typelib
exists. It will be clearer what properties exist, what type they are and
how to call them. It may well be that it is the difference between
things working and not working. - so in this case it may well be
necessary in practice.
Mark
More information about the python-win32
mailing list