RE: [ctypes-users] ctypes.com
Brought to you by:
theller
From: Stefan S. <SSc...@ds...> - 2005-02-14 08:22:29
|
> -----Original Message----- > From: Thomas Heller [mailto:th...@py...] > "Stefan Schukat" <SSc...@ds...> writes: >=20 > >> > 4. Properties with multiple signatures > >> > > >> > I've seen a couple of cases where interfaces have both a > >> > _put_Property() and _putREF_Property() > >> > > >> > I think this can be coped with without much trouble, but note it=20 > >> > for reference. > >>=20 > >> I have no idea about the difference between a propput and a=20 > >> propputref - > >> can someone explain why a COM object would implement both? > > > > This is a VB helper for properties which expose objects. > > You could write=20 > > > > Window.Caption =3D "Text" > > > > which is internally translated to=20 > > > > Window.Caption.Value =3D "Text" // calls propput method > > > > if value is the default property (DISPID=3D0) of the Caption=20 > interface. > > If you want to set the Caption Object, e.g. > > > > Window.Caption =3D Caption =20 > > > > you have to write > > > > Set Window.Caption =3D Caption // calls propputref method > > > > which exchanges the caption object. Therefore in pywin32 an extra > > method SetCaption is generated in addition to the Caption=20 > put/get property > > entries. This could lead to errors if the "SetCaption"=20 > method already > > exists, but that is a rare case. > > > > > > Stefan > Stefan, thanks for this explanation. >=20 > I've scanned a few typelibs, and most of them, if they have proputref, > don't have propput for the same property. And they have a COM=20 > interface > pointer as parameter in this case. > The IDictionary::Item, in windows\system32\scrrun.dll on XP Pro, is > different. It has this (thats what oleview disassembles): >=20 > interface IDictionary : IDispatch { > [id(00000000), propputref, helpstring("Set or get the=20 > item for a given key"), > helpcontext(0x00214b3a)] > HRESULT Item( > [in] VARIANT* Key,=20 > [in] VARIANT* pRetItem); > [id(00000000), propput, helpstring("Set or get the=20 > item for a given key"), > helpcontext(0x00214b3a)] > HRESULT Item( > [in] VARIANT* Key,=20 > [in] VARIANT* pRetItem); > [id(00000000), propget, helpstring("Set or get the=20 > item for a given key"), > helpcontext(0x00214b3a)] > HRESULT Item( > [in] VARIANT* Key,=20 > [out, retval] VARIANT* pRetItem); >=20 > So, there are propputref, propput, and propget on the Item property. > propput and propputref take exactly the same parameter types=20 > - would there > be any difference in what happens when you call them? >=20 > Thomas As described above the internal IDispatch implementation would forward = the call=20 to the default value of the interface, i.e. in pseudo code if wflags =3D=3D DISPATCH_PROPERYPUT: if RetItem.vt =3D=3D VT_DISPATCH: InternalItemList[Key].DefaultValue =3D RetItem.DefaultValue else: InternalItemList[Key].DefaultValue =3D RetItem if wflags =3D=3D DISPATCH_PROPERYPUTREF: if RetItem.vt =3D=3D VT_DISPATCH: InternalItemList[Key] =3D RetItem Stefan |