[python-win32] Calling COM methods that expect arguments by reference

Aaron Hoover amhoov at gmail.com
Mon Aug 10 22:34:13 CEST 2009


This question is similar to one posed by Mike Graham in a recent  
thread, but I thought I'd see if I could rustle up any additional  
feedback.

I'm trying to called a COM automation object using Python. The wrinkle  
is that the method I need uses arguments by reference to store output  
from its execution. The signature looks like this:

TileGraphic(int FileType, int Margin, intObjMargin, BSTR FileName,  
BSTR DestName, float KFactor1, float KFactor2, int* Rows, int*  
Columns, int* X0, int* Y0, int* XExtent, int* YExtent, long InMemory,  
int* ErrorCode)


The Python code generated by makepy looks like:

def TileGraphic(self, FileType=defaultNamedNotOptArg,  
Margin=defaultNamedNotOptArg, ObjMargin=defaultNamedNotOptArg,  
FileName=defaultNamedNotOptArg
			, DestName=defaultNamedNotOptArg, KFactor1=defaultNamedNotOptArg,  
KFactor2=defaultNamedNotOptArg, Rows=pythoncom.Missing,  
Columns=pythoncom.Missing
			, X0=pythoncom.Missing, Y0=pythoncom.Missing,  
XExtent=pythoncom.Missing, YExtent=pythoncom.Missing,  
InMemory=defaultNamedNotOptArg
			, ErrorCode=pythoncom.Missing):
			return self._ApplyTypes_(125, 1, (24, 0), ((3, 1), (3, 1), (3, 1),  
(8, 1), (8, 1), (4, 1), (4, 1), (16387, 2), (16387, 2), (16387, 2),  
(16387, 2), (16387, 2), (16387, 2), (3, 1), (16387,
									2)), 'TileGraphic', None,FileType
			, Margin, ObjMargin, FileName, DestName, KFactor1
			, KFactor2, Rows, Columns, X0, Y0
			, XExtent, YExtent, InMemory, ErrorCode)


I'm somewhat unsure how to call it. If I just pass in variables with  
integer values for the by reference arguments, this is the output:

## All args after 940.0 are just variables containing integers


 >>> app.TileGraphic(9, 0, 0, "Test.dxf", "Results", 1.0, 940.0, rows,  
cols,
x0, y0, xExtent, yExtent, 0, ErrorCode)
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (156, 0))

---------------------------------------------------------------------------
com_error                                 Traceback (most recent call  
last)

c:\users\aaron\code\<ipython console> in <module>()

C:\Python25\lib\site-packages\pywin32-210n1-py2.5-win32.egg\win32com 
\gen_py\DAE1
337F-69EF-4233-B4E3-27C348C3D9D6x0x1x0.pyc in TileGraphic(self,  
FileType, Margin
, ObjMargin, FileName, DestName, KFactor1, KFactor2, Rows, Columns,  
X0, Y0, XExt
ent, YExtent, InMemory, ErrorCode)
     648                         , Margin, ObjMargin, FileName,  
DestName, KFactor
1
     649                         , KFactor2, Rows, Columns, X0, Y0
--> 650                         , XExtent, YExtent, InMemory, ErrorCode)
     651
     652         def TurnLaserOff(self, CardNum=defaultNamedNotOptArg):

C:\Python25\lib\site-packages\pywin32-210n1-py2.5-win32.egg\win32com 
\client\__in
it__.pyc in _ApplyTypes_(self, dispid, wFlags, retType, argTypes,  
user, resultCL
SID, *args)
     446                 return self._get_good_object_(
     447                     self._oleobj_.InvokeTypes(
--> 448                               dispid, 0, wFlags, retType,  
argTypes, *arg
s),
     449                     user, resultCLSID)
     450

com_error: (-2147352567, 'Exception occurred.', (0,  
'winlase.Automate', 'Error d
uring Tiling', None, 0, -2147467259), None)


I have also tried using pythoncom.Missing and pythoncom.ArgNotFound  
per Mark Hammond's suggestion. I thought by reference input variables  
were supposed to be converted to output tuples by makepy. Am I missing  
something here? If I try and execute the method without any of the  
input reference variables, I get this error:

TypeError: int() argument must be a string or a number, not 'NoneType'


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20090810/e47a716b/attachment-0001.htm>


More information about the python-win32 mailing list