[python-win32] Input-only vs. In/Out Function Parameters
Smith, Brian (CR)
smithbk at aecl.ca
Thu Oct 19 22:10:46 CEST 2006
Yup, still trying to figure this one out but I've got a little bit more
information.
To summarise: I created a Python COM Server to be used by Visual Basic
and found an issue with in/out parameters because of the lack of type
information. To fix this, I created a type library but this led to the
following two problems:
1) The function calls on the COM object failed unless I explicitly returned
an HRESULT in addition to returning the other output parameters.
2) After adding an HRESULT as the first element of the returned tuple, I
found that the *last* element of the returned tuple was being used as
the function's return value instead of the *first* value (or second after
the HRESULT?) as expected.
I've now tried registering the COM object with --debug and viewed the trace
output from PythonWin's trace collector utility. After calling a function
that does not add an HRESULT, I ended up getting the following traceback:
Traceback (most recent call last):
File "C:\DevTools\Python23\lib\site-packages\win32com\universal.py", line
188, in dispatch
raise TypeError, "Expected %s return values, got: %s" %
(len(meth._gw_out_args) + 1, len(retVal))
exceptions.TypeError: Expected 3 return values, got: 2
Looking at universal.py, I found this in the dispatch() function of
class Definition:
...
if type(retVal) == types.TupleType: # Like pythoncom, we special case a
tuple.
# However, if they want to return a specific HRESULT,
# then they have to return all of the out arguments
# AND the HRESULT.
if len(retVal) == len(meth._gw_out_args) + 1:
hr = retVal[0]
retVal = retVal[1:]
else:
raise TypeError, "Expected %s return values, got: %s" %
(len(meth._gw_out_args) + 1, len(retVal))
else:
retVal = [retVal]
retVal.extend([None] * (len(meth._gw_out_args)-1))
retVal = tuple(retVal)
WriteFromOutTuple(retVal, meth._gw_out_args, argPtr)
return hr
I'm not sure what the original intent was, but the wording in the comment
seems to imply that returning a specific HRESULT should be optional.
However, the code seems to make it mandatory and this would explain
problem #1. I'm not sure if this is a bug or by design.
I also tried looking at the source for WriteFromOutTuple() to determine the
cause of problem #2, but with limited SWIG knowledge I didn't get far. It
seems like the function verifies data types, but I didn't see where any
"Writing" actually occurred.
Brian
CONFIDENTIAL AND PRIVILEGED INFORMATION NOTICE
This e-mail, and any attachments, may contain information that
is confidential, subject to copyright, or exempt from disclosure.
Any unauthorized review, disclosure, retransmission,
dissemination or other use of or reliance on this information
may be unlawful and is strictly prohibited.
AVIS D'INFORMATION CONFIDENTIELLE ET PRIVILÉGIÉE
Le présent courriel, et toute pièce jointe, peut contenir de
l'information qui est confidentielle, régie par les droits
d'auteur, ou interdite de divulgation. Tout examen,
divulgation, retransmission, diffusion ou autres utilisations
non autorisées de l'information ou dépendance non autorisée
envers celle-ci peut être illégale et est strictement interdite.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/python-win32/attachments/20061019/d260e6aa/attachment.html
More information about the Python-win32
mailing list