Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-08-03 Thread William Belanger
That works, thank you. I'm relieved to finally move forward with this.
Revised example;

#!/usr/bin/python3
> # https://gitlab.com/-/snippets/2155778
>
> import pythoncom
> import sys
> import threading
> import win32com.client
> import win32com.server.util
> from win32com.server import localserver
>
>
> class EventHandler:
> _public_methods_ = ["ping"]
>
> def __init__(self):
> self.server = win32com.client.Dispatch("Minimal.Example")
> self.server.setParent(win32com.server.util.wrap(self))
> self.server.Ping()  # ##
>
> def ping(self):
> print("pong")
>
>
> class ServerAdapter:
> _reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
> _reg_clsid_ = "{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"
> _reg_progid_ = "Minimal.Example"
> _reg_verprogid_ = "Minimal.Example.1"
> _reg_class_spec_ = "MinimalExample.ServerAdapter"
> _public_attrs_ = ["parent"]
> _public_methods_ = ["setParent", "Ping"]
>
> def setParent(self, parent):
> self.parent = win32com.client.Dispatch(parent)
>
> def Ping(self):
> self.parent.ping()
>
>
> def server_init():
> pythoncom.CoInitialize()
> localserver.serve(["{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"])
>
>
> if __name__ == "__main__":
> if "--register" in sys.argv[1:] or "--unregister" in sys.argv[1:]:
> import win32com.server.register
> win32com.server.register.UseCommandLine(ServerAdapter)
> else:
> server_thread = threading.Thread(target=server_init)
> server_thread.start()
> EventHandler()
>

Best,
Will

Le sam. 31 juil. 2021 à 21:36, Mark Hammond  a
écrit :

>
> On 1/08/2021 12:21 am, William Belanger wrote:
> > Hi,
> >
> >
> > Thank you for the follow up. Perhaps I did not express my need clearly
> > enough, so I made this minimal example;
> >
> >
> > # https://gitlab.com/-/snippets/2155778
> > 
> >
> > import pythoncom
> > import sys
> > import threading
> > import win32com.client
> > import win32com.server.util
> > from win32com.server import localserver
> >
> >
> > def init_server():
> > pythoncom.CoInitialize()
> > localserver.serve(["{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"])
> >
> >
> > class Main:
> > def __init__(self):
> > self.server = win32com.client.Dispatch("Minimal.Example")
> > self.server.parent = self # TypeError: must be real number, not Main
>
> That exception is very odd and I should look into it - but the problem
> here is that you are trying to set an attribute on a COM object which is
> a Python instance, which doesn't really make sense. What you want is to
> set it to a COM object - which `self` is not. So something like:
>
>
> class Main:
>  _public_methods_ = ["pong"]
>  def __init__(self):
>  self.server = win32com.client.Dispatch("Minimal.Example")
>  self.server.parent = win32com.server.util.wrap(self)
>  self.server.Ping()
>
>  def pong(self):
>  return "pong"
>
> works. Sadly another paper-cut here is that the server just sees this as
> a plain IDispatch object rather than a `Dispatch` wrapper - so `Ping`
> needs to look something like:
>
>  def Ping(self):
>  parent_as_object = win32com.client.Dispatch(self.parent)
>  print(parent_as_object.pong())
>
> I guess you could, say, change `parent` into `set_parent()`, or
> intercept via __setattr__() and do the wrapping just once.
>
> HTH,
>
> Mark
>
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-31 Thread Mark Hammond



On 1/08/2021 12:21 am, William Belanger wrote:

Hi,


Thank you for the follow up. Perhaps I did not express my need clearly 
enough, so I made this minimal example;



# https://gitlab.com/-/snippets/2155778


import pythoncom
import sys
import threading
import win32com.client
import win32com.server.util
from win32com.server import localserver


def init_server():
pythoncom.CoInitialize()
localserver.serve(["{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"])


class Main:
def __init__(self):
self.server = win32com.client.Dispatch("Minimal.Example")
self.server.parent = self # TypeError: must be real number, not Main


That exception is very odd and I should look into it - but the problem 
here is that you are trying to set an attribute on a COM object which is 
a Python instance, which doesn't really make sense. What you want is to 
set it to a COM object - which `self` is not. So something like:



class Main:
_public_methods_ = ["pong"]
def __init__(self):
self.server = win32com.client.Dispatch("Minimal.Example")
self.server.parent = win32com.server.util.wrap(self)
self.server.Ping()

def pong(self):
return "pong"

works. Sadly another paper-cut here is that the server just sees this as 
a plain IDispatch object rather than a `Dispatch` wrapper - so `Ping` 
needs to look something like:


def Ping(self):
parent_as_object = win32com.client.Dispatch(self.parent)
print(parent_as_object.pong())

I guess you could, say, change `parent` into `set_parent()`, or 
intercept via __setattr__() and do the wrapping just once.


HTH,

Mark
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-31 Thread William Belanger
Hi,


Thank you for the follow up. Perhaps I did not express my need clearly
enough, so I made this minimal example;


# https://gitlab.com/-/snippets/2155778
>
> import pythoncomimport sysimport threadingimport win32com.clientimport 
> win32com.server.utilfrom win32com.server import localserverdef init_server(): 
>pythoncom.CoInitialize()
> localserver.serve(["{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"])class Main:
> def __init__(self):self.server = 
> win32com.client.Dispatch("Minimal.Example")self.server.parent = self  
> # TypeError: must be real number, not Mainself.server.Ping()def 
> pong(self):return "pong"class ServerAdapter:_reg_clsctx_ = 
> pythoncom.CLSCTX_LOCAL_SERVER_reg_clsid_ = 
> "{D390AE78-D6A2-47CF-B462-E4F2DC9C70F5}"_reg_progid_ = "Minimal.Example"  
>   _reg_verprogid_ = "Minimal.Example.1"_reg_class_spec_ = 
> "MinimalExample.ServerAdapter"_public_methods_ = ["Ping"]
> _public_attrs_ = ["parent"]def Ping(self):
> print(self.parent.pong())  # How ??if __name__ == '__main__':if 
> '--register' in sys.argv[1:] or '--unregister' in sys.argv[1:]:import 
> win32com.server.register
> win32com.server.register.UseCommandLine(ServerAdapter)else:
> server_thread = threading.Thread(target=init_server)
> server_thread.start()app = Main()
>
>
The Ping() method would usually be called from the third-party app, but
here it is done locally for the sake of demonstration.

>From the server adapter, how can I query values or call methods of another
class instance ?


Thanks,

Will

Le sam. 31 juil. 2021 à 00:15, Mark Hammond  a
écrit :

> 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
>
>
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-30 Thread Mark Hammond

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

___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-30 Thread William Belanger
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?


Looking back at Antiote's C++ example, there is an idl file available from
them. Is it necessary though? I would rather do everything dynamically,
such as setting the GUID, just like I did for the DBus interface.


DBus interface: https://gitlab.com/-/snippets/2151173

COM interface: https://gitlab.com/-/snippets/2154411


Thanks,

Will

Le mer. 28 juil. 2021 à 22:21, Mark Hammond  a
écrit :

>
> On 29/07/2021 9:56 am, William Belanger wrote:
> > Hi,
> >
> >
> > There is no typelib file unfortunately. The interface needs to
> > communicate with Antidote's API by creating a COM server which exposes
> > the methods defined in the AdapteurAntidote class.
> >
> >
> > The problem is that the widget queried (a QTextEdit) is instantiated in
> > another class (MainWindow), and I cannot attribute a "parent" to the
> > dispatched COM object (self.server), as it raises either an
> > AttributeError or a TypeError, depending on its declaration in
> > __public_attrs__.
> >
> >
> >  From the documentation, I thought I needed to use DispatchWithEvents to
> > handle the events in a separate "sink" class (ImplementationAntidote)
> > that would behave more like a generic python object. Is there any other
> > way to achieve this? It is quite a trivial feature so I assume it is
> > possible to do so?
>
> DispatchWithEvents helps with the most common pattern used for COM
> events, particularly with MS products - in this model, the interfaces
> are described in a typelib. 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. However,
> I've no idea how that product works nor what it does, so can't really
> answer the question.
>
> I suspect you aren't the first person to run into this though and I
> assume the object is usable in a number of languages which support COM,
> so you might be better off asking in a forum specific to the product.
>
> Cheers,
>
> Mark
>
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-28 Thread Mark Hammond



On 29/07/2021 9:56 am, William Belanger wrote:

Hi,


There is no typelib file unfortunately. The interface needs to 
communicate with Antidote's API by creating a COM server which exposes 
the methods defined in the AdapteurAntidote class.



The problem is that the widget queried (a QTextEdit) is instantiated in 
another class (MainWindow), and I cannot attribute a "parent" to the 
dispatched COM object (self.server), as it raises either an 
AttributeError or a TypeError, depending on its declaration in 
__public_attrs__.



 From the documentation, I thought I needed to use DispatchWithEvents to 
handle the events in a separate "sink" class (ImplementationAntidote) 
that would behave more like a generic python object. Is there any other 
way to achieve this? It is quite a trivial feature so I assume it is 
possible to do so?


DispatchWithEvents helps with the most common pattern used for COM 
events, particularly with MS products - in this model, the interfaces 
are described in a typelib. 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. However, 
I've no idea how that product works nor what it does, so can't really 
answer the question.


I suspect you aren't the first person to run into this though and I 
assume the object is usable in a number of languages which support COM, 
so you might be better off asking in a forum specific to the product.


Cheers,

Mark
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-28 Thread William Belanger
Hi,


There is no typelib file unfortunately. The interface needs to communicate
with Antidote's API by creating a COM server which exposes the methods
defined in the AdapteurAntidote class.


The problem is that the widget queried (a QTextEdit) is instantiated in
another class (MainWindow), and I cannot attribute a "parent" to the
dispatched COM object (self.server), as it raises either an AttributeError
or a TypeError, depending on its declaration in __public_attrs__.


>From the documentation, I thought I needed to use DispatchWithEvents to
handle the events in a separate "sink" class (ImplementationAntidote) that
would behave more like a generic python object. Is there any other way to
achieve this? It is quite a trivial feature so I assume it is possible to
do so?


Best,

Will

Le mer. 28 juil. 2021 à 04:25, Mark Hammond  a
écrit :

>
> On 28/07/2021 7:58 am, William Belanger wrote:
> > Hi everyone,
> >
> >
> > I'm trying to make a cross-platform Python interface for a third-party
> > API (Druide Antidote). The D-Bus part is done and working
> > (https://gitlab.com/-/snippets/2151173
> > ), it consist of a server
> adapter
> > (AdaptateurAntidote), which relay the events to an handler class
> > (ImplementationAntidote).
> >
> > Traceback (most recent call last):
> >
> > File
> >
>  
> "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
> > line 256, in DispatchWithEvents
> >
> > ti = disp._oleobj_.GetTypeInfo()
> >
> > pywintypes.com_error: (-2147352567, 'Exception occurred.', None,
> None)
>
> DispatchWithEvents creates a COM object, then gets the typeinfo needed
> to implement the interfaces defined for events - but this COM object is
> failing to provide that type info at runtime. It might still have a .tlb
> available though, and if it does, you can run `makepy.py` once and the
> snippet should work. The typelib can also live in a .dll, but I've never
> heard of Antidote so have no better suggestions.
>
> Cheers,
>
> Mark
>
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-28 Thread Mark Hammond



On 28/07/2021 7:58 am, William Belanger wrote:

Hi everyone,


I'm trying to make a cross-platform Python interface for a third-party 
API (Druide Antidote). The D-Bus part is done and working 
(https://gitlab.com/-/snippets/2151173 
), it consist of a server adapter 
(AdaptateurAntidote), which relay the events to an handler class 
(ImplementationAntidote).


Traceback (most recent call last):

File

"C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
line 256, in DispatchWithEvents

ti = disp._oleobj_.GetTypeInfo()

pywintypes.com_error: (-2147352567, 'Exception occurred.', None, None)


DispatchWithEvents creates a COM object, then gets the typeinfo needed 
to implement the interfaces defined for events - but this COM object is 
failing to provide that type info at runtime. It might still have a .tlb 
available though, and if it does, you can run `makepy.py` once and the 
snippet should work. The typelib can also live in a .dll, but I've never 
heard of Antidote so have no better suggestions.


Cheers,

Mark
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


Re: [python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-28 Thread michel.clav...@gmail.com

/Hi!/
/
/
/Druide-Antidote is not a server; it is a client, who connect to 
different servers (COM-servers), like Word, Excel, OpenOffice.org, etc.

/
/
/
/@-salutations
/
/--
/


Le 27/07/2021 à 23:58, William Belanger a écrit :


Hi everyone,

I'm trying to make a cross-platform Python interface for a third-party 
API (Druide Antidote). The D-Bus part is done and working 
(https://gitlab.com/-/snippets/2151173 
), it consist of a server 
adapter (AdaptateurAntidote), which relay the events to an handler 
class (ImplementationAntidote).


I want to do the same with the COM interface. However, I could not get 
DispatchWithEvents() to work, as it fails on "ti = 
disp._oleobj_.GetTypeInfo()";


C:\Users\user>"C:\Users\user\Desktop\AntidoteCOM.py -
Shortcut.lnk" --register

Requesting elevation and retrying...

Registered: Correcteur.Antidote

C:\Users\user>"C:\Users\user\Desktop\AntidoteCOM.py - Shortcut.lnk"

Traceback (most recent call last):

File

"C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
line 256, in DispatchWithEvents

ti = disp._oleobj_.GetTypeInfo()

pywintypes.com_error: (-2147352567, 'Exception occurred.', None, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "Z:\.antidote_\AntidoteCOM.py", line 54, in _connect

self.server =
win32com.client.DispatchWithEvents("Correcteur.Antidote",
EventHandler)

File

"C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
line 264, in DispatchWithEvents

raise TypeError("This COM object can not automate the makepy
process - please run makepy manually for this object")

TypeError: This COM object can not automate the makepy process -
please run makepy manually for this object

I noticed that when running localserve.serve() in a separate console, 
the server returns as DispatchWithEvents() is called. No errors are 
thrown on the server side, but I assume there is something wrong or 
missing in the class definition of AdaptateurAntidote. I tried 
changing its policy to dynamic, but that did not help.


*If someone could provide a minimal example of a custom server working 
along with DispatchWithEvents(), that would be very helpful. *All the 
examples I could find use third-party servers, such as those provided 
by Microsoft.


Full code available is here; https://gitlab.com/-/snippets/2154411 



Will


___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32



___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32


[python-win32] COM: Minimal example of a custom server working with DispatchWithEvents()

2021-07-27 Thread William Belanger
Hi everyone,


I'm trying to make a cross-platform Python interface for a third-party API
(Druide Antidote). The D-Bus part is done and working (
https://gitlab.com/-/snippets/2151173), it consist of a server adapter
(AdaptateurAntidote), which relay the events to an handler class
(ImplementationAntidote).


I want to do the same with the COM interface. However, I could not get
DispatchWithEvents() to work, as it fails on "ti =
disp._oleobj_.GetTypeInfo()";


C:\Users\user>"C:\Users\user\Desktop\AntidoteCOM.py - Shortcut.lnk"
> --register
>
> Requesting elevation and retrying...
>
> Registered: Correcteur.Antidote
>
>
> C:\Users\user>"C:\Users\user\Desktop\AntidoteCOM.py - Shortcut.lnk"
>
> Traceback (most recent call last):
>
> File
> "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
> line 256, in DispatchWithEvents
>
> ti = disp._oleobj_.GetTypeInfo()
>
> pywintypes.com_error: (-2147352567, 'Exception occurred.', None, None)
>
>
> During handling of the above exception, another exception occurred:
>
>
> Traceback (most recent call last):
>
> File "Z:\.antidote_\AntidoteCOM.py", line 54, in _connect
>
> self.server = win32com.client.DispatchWithEvents("Correcteur.Antidote",
> EventHandler)
>
> File
> "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py",
> line 264, in DispatchWithEvents
>
> raise TypeError("This COM object can not automate the makepy process -
> please run makepy manually for this object")
>
> TypeError: This COM object can not automate the makepy process - please
> run makepy manually for this object
>

I noticed that when running localserve.serve() in a separate console, the
server returns as DispatchWithEvents() is called. No errors are thrown on
the server side, but I assume there is something wrong or missing in the
class definition of AdaptateurAntidote. I tried changing its policy to
dynamic, but that did not help.


*If someone could provide a minimal example of a custom server working
along with DispatchWithEvents(), that would be very helpful. *All the
examples I could find use third-party servers, such as those provided by
Microsoft.


Full code available is here; https://gitlab.com/-/snippets/2154411


Will
___
python-win32 mailing list
python-win32@python.org
https://mail.python.org/mailman/listinfo/python-win32