win32com.client - parameter types
Alex Martelli
aleaxit at yahoo.com
Tue Feb 27 08:23:13 EST 2001
"Tom Danielsen" <tom at teikom.no> wrote in message
news:slrn99n5be.8f8.tom at tnt.teikom.no...
>
>
> I have a COM server with the following method:
>
> [id(0x60020016)]
> HRESULT getDict([out] IDispatch** pDictionary);
>
> which makepy made into:
>
> def getDict(self, pDictionary=defaultNamedNotOptArg):
> return self._ApplyTypes_(0x60020016, \
> 1, (24, 0), ((16393, 2),), \
> 'getDict', None,pDictionary)
Not to worry -- this may be slightly misleading, but it DOES
in fact work just right.
> This is, the method returns its value in parameter 1.
That's what it does COMwise, but, for Python, this output
parameter IS transformed into a return value!
> VB and VBscript handles this, but I cannot get Python (2.0) to work.
>
> Is there any way to get at this value in Python? Is there a way I
> can change the [out] to a [out, retval] and make Python return the
> value as the return value of the method call? If so, how?
Nothing more than the makepy you've already done.
To try it out, I built a toy (ATL) project (inproc server, just
one object, project name toyatl, object name Toy) with IDL:
// toyatl.idl : IDL source for toyatl.dll
//
// This file will be processed by the MIDL tool to
// produce the type library (toyatl.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(565B5BFD-0CB2-11D5-9E52-0060B0EB1D67),
dual,
helpstring("IToy Interface"),
pointer_default(unique)
]
interface IToy : IDispatch
{
[id(1), helpstring("method getDict")] HRESULT getDict([out]IDispatch**
pDictionary);
};
[
uuid(565B5BF1-0CB2-11D5-9E52-0060B0EB1D67),
version(1.0),
helpstring("Toy ATL project TLB")
]
library TOYATLLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(565B5BFE-0CB2-11D5-9E52-0060B0EB1D67),
helpstring("Toy Class")
]
coclass Toy
{
[default] interface IToy;
};
};
and the 'obvious' implementation (FinalConstruct of the CToy class builds an
instance member that's a CComPtr<IDispatch> with a CoCreateInstance on
ProgId "Scripting.Dictionary"; method getDisp just calls a CopyTo on that
member). After a makepy...:
D:\pybridge>python
Python 2.0 (#8, Oct 16 2000, 17:27:58) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
>>> from win32com.client import Dispatch as disp
>>> x=disp("toyatl.Toy")
>>> a=x.getDict()
>>> a
<win32com.gen_py.clareg 1.0 Type Library.IDictionary>
>>>
Alex
More information about the Python-list
mailing list