[python-win32] Calling an OLE Automation (IDispatch) server which uses "out params"
Mark Hammond
mhammond at skippinet.com.au
Mon Dec 17 00:17:13 CET 2012
On 17/12/2012 12:54 AM, Dave Calkins wrote:
>
> On 12/16/2012 12:46 AM, Mark Hammond wrote:
>> That's very strange. pywin32 *will* be passing a second param - a
>> byref bstr. byref params do work in general, so you might need to
>> contact the vendor of the object for help.
>>
>> Cheers,
>>
>> Mark
>
> I'm the vendor of the object :) As I mentioned, I just created this
> small test app which reproduces the issue having just those 3 simple
> methods. However, I'm not able to talk to it via Python.
Is the source to this available?
> It seems to
> be a pretty simple interface. Any idea what else I might be missing?
> What do I need to do on the python side to call that method with the out
> params?
Nope - it should all be good. For example, check out:
http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/8b73631eeee0/com/TestSources/PyCOMTest/PyCOMTest.idl#l193
http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/8b73631eeee0/com/TestSources/PyCOMTest/PyCOMImpl.cpp#l133
and (slightly cryptic) Python code which calls it:
http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/8b73631eeee0/com/win32com/test/testPyComTest.py#l225
Which shows some "out" param tests (and while there is an inout bstr
test, there doesn't seem to be a specific test for an out bstr, so it's
still possible you have hit a pywin32 bug)
> You indicated that the out params should be converted to a return
> value. Why does the MakePy generated method signature not indicate
> this? i.e. why does it show 2 arguments?
The makepy signature really just reflects the params passed to the
interface itself - hence those params all have default values.
> You said above that pywin32 *will* be passing a second param - a byref
> bstr. That suggests to me that there's some other method I need to call
> which internally calls the real method from pywin32. Where is the method
> I need to call then? I don't see any method generated there with only a
> single arg?
InvokeTypes is what does all the magic - it takes the VT_* values and
builds real params in C++, and also builds the tuple (if necessary)
which is returned. The params mainly exist for when the interface is
*implemented* by Python rather than when called by Python - the same
generated classes are used in both directions.
Hope this clarifies...
Mark
More information about the python-win32
mailing list