[python-win32] Wrong default value for optional argument in makepy signature.

Åsmund Hjulstad asmund.hjulstad at gmail.com
Tue Nov 9 19:03:37 CET 2010


2010/11/9 Tim Roberts <timr at probo.com>:
> Åsmund Hjulstad wrote:
>> I keep getting the following exception when making some calls on a
>> ActiveX DLL library (PISDK). Problem partially solved, posting in case
>> others may find it usefull.
>>
>> TypeError: The Python instance can not be converted to a COM object
>>
>> I have traced it down to an optional parameter, that is set to 0, but
>> should (probably) be set to None.
>>
>> the makepy signature is:
>>
>> GetPoints(self, WhereClause=<PyOleEmpty object>, pAsynchStatus=0)
>>
>> Doing the call using
>>
>> server.GetPoints(" tag = 'FT12345/*' ", None)
>>
>> works fine. ...
>>
>> As the optional parameter is easy to forget, especially when querying
>> interactively in ipython, is it possible to make makepy understand
>> that the optional parameter should be None, instead of 0?
>
> Makepy makes an educated guess, based on the data type of the
> parameter.  However, some people lie about their data types when they
> make an interface like this.  Instead of declaring it a pointer, they'll
> declare it as an integer.  Makepy isn't omniscient.
>
> Do you have the IDL that describes the function, or a web page
> reference?  Can you show us the script that makepy generated?

The function is described like this in the accompanying .h file:  (
This is from pisdk.h )

        virtual /* [helpstring][helpcontext][id] */ HRESULT
STDMETHODCALLTYPE GetPoints(
            /* [in] */ BSTR whereClause,
            /* [in] */ PointSearchTypeConstants eSearchType,
            /* [defaultvalue][in] */ /* external definition not
present */ _NamedValues *pnvExtraTableList,
            /* [defaultvalue][in] */ /* external definition not
present */ _NamedValues *pnvServerList,
            /* [defaultvalue][in] */ /* external definition not
present */ _PIAsynchStatus *pAsynchStatus,
            /* [retval][out] */ _PointList **ret) = 0;


with _PIAsynchStatus described in pisdkcommon.h

    interface _PIAsynchStatus
    {
        CONST_VTBL struct _PIAsynchStatusVtbl *lpVtbl;
    };

There are two different DLLs, pisdk.dll and PISDKCommon.dll (which the
first one depends on)

The generated python code for the relevant method is

	# Result is of type _PointList
	def GetPoints(self, WhereClause=defaultNamedNotOptArg, pAsynchStatus=0):
		"""Search for PIPoints on this server."""
		ret = self._oleobj_.InvokeTypes(21, LCID, 1, (9, 0), ((8, 1), (9,
49)),WhereClause
			, pAsynchStatus)
		if ret is not None:
			ret = Dispatch(ret, u'GetPoints', '{EF9DDE15-265F-11D2-80F4-00A0240B7FDC}')
		return ret


Please let me know if more information can be of help.


More information about the python-win32 mailing list