[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