COM / Variants / VT_BOOL
Alex Martelli
aleaxit at yahoo.com
Thu Dec 28 08:56:31 EST 2000
"Mark Hammond" <MarkH at ActiveState.com> wrote in message
news:3A4B2F8C.4000909 at ActiveState.com...
> Alex Martelli wrote:
>
>
> > *Almost* right... but not *quite*, and we hit this specific problem
> > quite recently (we weren't driving with Python, but I think that
> > would have made no difference).
>
> Quite possibly it would. If win32com had type information, it would
> have dont the right thing.
True -- because then calls would always go on the IDispatch side of
things; I had not considered this.
> > Setting the property .ValidateOnParse of the Xerces XML parser
> > (originally from IBM, now, I believe, from Apache), in its COM
> > setting, to 0 *or* 1, still keeps the parser non-validating; you
>
> Without type info, the parser should call VariantChangeType() to get a
> valid VT_BOOL back. So really the parser is at fault (or the client for
> ignoring it)
Except that we were using the custom-side of things (from C++),
not the dispatch-side, and therefore passing, not a 'variant',
but a VARIANT_BOOL directly. VARIANT_BOOL is a typedef for some
integral type (short int, I think), so, C++ happily accepts a
value of 1 and does no transformation on it. Not sure if the
VariantChangeType is being done on Xerces' side (I guess they'll
be using a normal CreateStdDispatch to make the dispatch-side
from the custom-side, like everybody else, so the changetype
should be happening IF a call comes in from the custom-side).
> > *Most* COM servers will happily accept 'server.BoolProp = 1'
> > as setting the property to 'true', but, I suggest, don't count
> > on that; use 'server.BoolProp = -1' and you might be safer.
>
> Also, a feature of the pythoncom type conversion means that you can say:
>
> true = 1==1
> false = 1==0
>
> And passing these variables (or the expression as a literal) _will_
> force a VT_BOOL of the correct type.
...if makepy, or whatever, has given Python the needed typelibrary
information, that is; or, failing that, the server is implementing
the needed change-type correctly.
There may be one chance in a hundred that any given problem comes
from a combination of these safeguards all failing at once... but,
using '-1' to indicate 'true' is a cheap enough price to pay for
that 1%-risk of disaster insurance, I think:-).
Alex
More information about the Python-list
mailing list