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
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to