Aaron:
From the Python definition you show, PythonCOM is going to
treat your call-by-reference arguments as output values whether they're
supposed to be or not. This is for all the parameters defined with
type (16387, 2).
When you have parameters identified like that, your Python call has to
treat them as return values, not as calling arguments. In your
case, that means your call should look like Rows, Cols, X0,
Y0, Xext, Yext, ErrCode = app.TileGraphic (9, 0, 0, "Test.dxf",
"Results", 1.0, 940.0, 0) .
Of course, that may not actually solve all your problems. Mike Graham
and I had ongoing trouble even after we got the calling sequence right,
for completely different reasons. If that happens to you, I'm afraid
you'll have to get advice from someone much wiser than I. (There are a
lot of them monitoring this list, fortunately.)
- Greg Antal
Gregory W. Antal
Senior Technical Advisor
ATA Engineering, Inc.
11995 El Camino Real, Suite 200
San Diego, CA 92130
www.ata-e.com
greg.an...@ata-e.com
858-480-2072 (Phone)
858-792-8932 (Fax)
Aaron Hoover wrote, On 8/10/2009 1:34 PM:
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'
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32
|