IronPython and COM Interface
Larry Bates
lbates at websafe.com
Wed Mar 14 09:49:55 EDT 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