IronPython and COM Interface

Larry Bates lbates at websafe.com
Wed Mar 14 14:49:55 CET 2007


Divya wrote:
> Hello,
> 
> I'm new to IronPython and COM so please bear with me.
> 
> I have a COM interface provided to me. I need to implement this
> interface and pass it to a method as a way of implementing
> 'callbacks'.
> 
> However it appears that the methods of my interface object are never
> called.
> 
> As a alternative, I implemented the interface in C# and then extended
> the C# class in IronPython. However, on running the code, methods of
> my C# class rather than the IronPython class are being called.
> 
> Can anyone advise? Is this possible in IronPython?
> 
> The code is listed below.
> 
> Regards,
> Divya
> 
> ---------------------------
> 
> import time
> 
> import clr
> clr.AddReference('Interop.MBTCOMLib.dll')
> clr.AddReference('Interop.MBTORDERSLib.dll')
> clr.AddReference('Interop.MBTQUOTELib.dll')
> 
> import MBTCOMLib
> import MBTORDERSLib
> import MBTQUOTELib
> 
> demo_user='user'
> demo_pass='pass'
> demo_host=9
> 
> class MBEvents(MBTQUOTELib.IMbtQuotesNotify):
> 	def __init__(self):
> 		MBTQUOTELib.IMbtQuotesNotify.__init__(self)
> 
> 	def OnLevel2Data(data):
> 		print 'OnLevel2Data'
> 
> 	def OnOptionsData(self, data):
> 		print 'OnOptionsData'
> 
> 	def OnQuoteData(self, data):
> 		print 'OnQuoteData'
> 
> 	def OnTSData(self, data):
> 		print 'OnTSData'
> 
> class MB:
> 	def __init__(self):
> 		self.conn = MBTCOMLib.MbtComMgrClass()
> 		#self.conn.EnableSplash(False)
> 		self.orders = self.conn.OrderClient
> 		self.quotes = self.conn.Quotes
> 		self.events = MBEvents()
> 
> 	def login(self, host=demo_host, user=demo_user, passwd=demo_pass):
> 		self.conn.DoLogin(host, user, passwd, '')
> 		print self.quotes.RemoteAddress, self.quotes.RemotePort
> 		self.quotes.AdviseSymbol(self.events, 'EUR/USD', 1|2|3|4)
> 

It may not help but I was struggling with the COM-callback issue
yesterday and found that this works in regular python:

import win32com.server.util

def callback:
    _public_methods_=['progress']
    def progress(self, total, number):
        print "completed %i of %i" % (number, total)

#
# Get instance of callback class
#
cb=callback()
#
# Wrap the callback class to turn it into an IDispatch (COM) object
# so I can pass it to my COM object.
#
idCallback=win32com.server.util.wrap(cb)
#
# Call the COM interface and pass it the callback function
#
r=oC.WSset_callback(idCallback)

In my case the COM object was also written in Python so to get
to the python object I do following:

def WSset_callback(idCallback)
    self.callback=win32com.client.Dispatch(idCallback)

Now I can call .progress method of callback class from the COM
object.

    self.callback.progress(total, number)

Hope this helps in some way.

-Larry



More information about the Python-list mailing list