Question concerning makepy.py for COM (long, code included)

Scott Anderson sanderson at ttm.com
Wed Feb 9 16:19:57 CET 2000


Hi all,

I have a 32-bit ActiveX OCX control that I wish to use in Python. 
Please forgive any obvious ignorance on COM... I have, however, read the
QuickStarts and other related materials.

I ran the makepy.py script that comes with the win32com distribution
(the 128 release).  From the file produced, it is not entirely obvious
how to instantiate and use the objects.

The code produced is included below; I changed the names because I'm not
sure of the confidentiality, and I removed code that doesn't appear
germane to the question.

TSHSWAPI is the COM object that is actually used in, say, VB.  However,
_DTSHSWAPI is the one that appears to export the methods for that class.

So, the question is, how do I use the _DTSHSWAPI functionality from this
class?  Also, how is the event interface implemented?

Thanks muchly in advance,

-scott



# Created by makepy.py version 0.3.1 from xxxxx.ocx
# On date: Tue Feb 08 16:14:15 2000
makepy_version = '0.3.1'

[...]

class _DTSHSWAPI(DispatchBaseClass):
	CLSID = pythoncom.MakeIID('{the class ID 3}')

	def AboutBox(self):
		return self._ApplyTypes_(0xfffffdd8, 1, (24, 0), (), 'AboutBox', None)

	def AckHost(self):
		return self._ApplyTypes_(0x9, 1, (2, 0), (), 'AckHost', None)

	def CloseSession(self):
		return self._ApplyTypes_(0x4, 1, (2, 0), (), 'CloseSession', None)

	def EnableHost(self):
		return self._ApplyTypes_(0xb, 1, (2, 0), (), 'EnableHost', None)

	def GetCommStatus(self, CommType=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x5, 1, (2, 0), ((2, 0),), 'GetCommStatus',
None, CommType)

	def OpenSession(self, HostType=defaultNamedNotOptArg,
DeviceType=defaultNamedNotOptArg, PortType=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x2, 1, (2, 0), ((2, 0), (2, 0), (8, 0)),
'OpenSession', None, HostType, DeviceType, PortType)

	def RetrieveAvailableIATAs(self, ReturnString=defaultNamedNotOptArg,
ReturnStringLength=defaultNamedNotOptArg,
HostType=defaultNamedNotOptArg, DeviceType=defaultNamedNotOptArg,
PortType=defaultNamedNotOptArg, ReturnIATACount=defaultNamedNotOptArg):
		return self._ApplyTypes_(0xa, 1, (2, 0), (((26, 8), 0), (2, 0), (2,
0), (2, 0), (8, 0), ((26, 2), 0)), 'RetrieveAvailableIATAs', None,
ReturnString, ReturnStringLength, HostType, DeviceType, PortType,
ReturnIATACount)

	def RetrieveIATAString(self, ReturnString=defaultNamedNotOptArg,
ReturnStringLength=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x7, 1, (2, 0), (((26, 8), 0), (2, 0)),
'RetrieveIATAString', None, ReturnString, ReturnStringLength)

	def RetrievePrintDeviceInfo(self,
WorkstationName=defaultNamedNotOptArg,
ReturnString=defaultNamedNotOptArg,
ReturnStringLength=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x8, 1, (2, 0), ((8, 0), ((26, 8), 0), (2,
0)), 'RetrievePrintDeviceInfo', None, WorkstationName, ReturnString,
ReturnStringLength)

	def RetrieveProtocolType(self, ReturnString=defaultNamedNotOptArg,
ReturnStringLength=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x6, 1, (2, 0), (((26, 8), 0), (2, 0)),
'RetrieveProtocolType', None, ReturnString, ReturnStringLength)

	def Send(self, Data=defaultNamedNotOptArg,
DataLength=defaultNamedNotOptArg):
		return self._ApplyTypes_(0x3, 1, (2, 0), ((8, 0), (3, 0)), 'Send',
None, Data, DataLength)

	_prop_map_get_ = {
		"ApplicationName": (1, 2, (8, 0), (), "ApplicationName", None),
	}
	_prop_map_put_ = {
		"ApplicationName" : ((1, LCID, 4, 0),()),
	}

class _DTSHSWAPIEvents:
	CLSID = CLSID_Sink = pythoncom.MakeIID('{the class ID 2}')
	_public_methods_ = [] # For COM Server support
	_arg_transformer_ = arg_transformer
	_dispid_to_func_ = {
		        1 : "OnSessionStatus",
		        2 : "OnHostStatus",
		        5 : "OnLanStatus",
		        4 : "OnDataAvailable",
		        3 : "OnMessageError",
		}

	def __init__(self, oobj = None):
		if oobj is None:
			self._olecp = None
		else:
			import win32com.server.util
		
cpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)
			cp=cpc.FindConnectionPoint(self.CLSID_Sink)
			cookie=cp.Advise(win32com.server.util.wrap(self))
			self._olecp,self._olecp_cookie = cp,cookie
	def __del__(self):
		try:
			self.close()
		except pythoncom.com_error:
			pass
	def close(self):
		if self._olecp is not None:
			cp,cookie,self._olecp,self._olecp_cookie =
self._olecp,self._olecp_cookie,None,None
			cp.Unadvise(cookie)
	def _query_interface_(self, iid):
		import win32com.server.util
		if iid==self.CLSID_Sink: return win32com.server.util.wrap(self)

	# Handlers for the control
	# If you create handlers, they should have the following prototypes:
#	def OnSessionStatus(self, SubCondition=defaultNamedNotOptArg):
#	def OnHostStatus(self, SubCondition=defaultNamedNotOptArg):
#	def OnLanStatus(self, SubCondition=defaultNamedNotOptArg):
#	def OnDataAvailable(self, SubCondition=defaultNamedNotOptArg,
Data=defaultNamedNotOptArg, DataLength=defaultNamedNotOptArg,
EraseWrite=defaultNamedNotOptArg, LineAddress=defaultNamedNotOptArg):
#	def OnMessageError(self, SubCondition=defaultNamedNotOptArg):

[...]

# This CoClass is known by the name 'XXXXX.TSHSWAPICtrl.1'
class TSHSWAPI(CoClassBaseClass): # A CoClass
	CLSID = pythoncom.MakeIID("{the class ID 1}")
	coclass_sources = [
		_DTSHSWAPIEvents,
	]
	default_source = _DTSHSWAPIEvents
	coclass_interfaces = [
		_DTSHSWAPI,
	]
	default_interface = _DTSHSWAPI


[...]

CLSIDToClassMap = {
	'{the class ID 1}' : TSHSWAPI,
	'{the class ID 2}' : _DTSHSWAPIEvents,
	'{the class ID 3}' : _DTSHSWAPI,
}




More information about the Python-list mailing list