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