KeyError: _dispobj_ in new python COM server
Mark Hammond
mhammond at skippinet.com.au
Sat Jan 19 21:29:20 EST 2002
See the docstring for win32com.client.DispatchWithEvents(). It shows
how to hook events without modifying the generated .py code.
Mark.
craig curtin wrote:
> hi,
> i'm creating a COM server and get the following error when
> i try to assign anything to self. i'm trying to build a
> COM wrapper server to handle Async events. i've dummied down
> my code without any luck.
>
> tia,
>
> craig
> -- Error ---------------
> Registering COM server...
> Registered: PythonExchange.AsyncEvents
> Traceback (most recent call last):
> File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line
> 301, in RunScript
> exec codeObject in __main__.__dict__
> File "\\Dellsrv0\Magic Bus\curtin\ExchangeCOMStuff\E2KSinkRC1.py",
> line 32, in ?
> pyAE = AsyncEvents()
> File "\\Dellsrv0\Magic Bus\curtin\ExchangeCOMStuff\E2KSinkRC1.py",
> line 14, in __init__
> self.wfd = open( fname, 'w')
> File "C:\Python21\win32com\gen_py\6593D6E1-8A3E-427F-A12C-0CA15B4FD865x0x1x0.py",
> line 62, in __setattr__
> d=self.__dict__["_dispobj_"]
> KeyError: _dispobj_
>
> --- Code --------------------
> import os, time
> from win32com.client import gencache, constants
> sinkServer=gencache.EnsureModule('{6593D6E1-8A3E-427F-A12C-0CA15B4FD865}',
> 0, 1, 0)
>
> class AsyncEvents(sinkServer.AsyncEvents):
> _public_methods_ = [ 'OnSave', 'OnDelete' ]
> _reg_progid_ = 'PythonExchange.AsyncEvents'
> _reg_clsid_ = '{5D342119-D3CD-446B-9AA5-C8427DE0BBB1}'
> def __init__(self, obj=None):
> #create a temporary file for trace messages
> fname = '%s\\E2kSink%s.txt' % (os.environ['TEMP'], os.getpid())
> self.wfd = open( fname, 'w')
> if obj is not None:
> sinkServer.AsyncEvents.__init__(self, obj)
> def OnSave(self, pEventInfo, bstrURLItem, lFlags):
> s = '%s called [%s]' % ( 'OnSave()', time.ctime())
> print s
> self.wfd.write(s)
> pass
> def OnDelete(self, pEventInfo, bstrURLItem, lFlags):
> s = '%s called [%s]' % ( 'OnDelete()', time.ctime())
> print s
> self.wfd.write(s)
> pass
> if __name__ == '__main__':
> print 'Registering COM server...'
> import win32com.server.register
> win32com.server.register.UseCommandLine(AsyncEvents)
>
> pyAE = AsyncEvents()
>
> pyAE.OnSave('one', 'two', 'three')
> pyAE.OnDelete('one', 'two', 'three')
>
More information about the Python-list
mailing list