COM: Returning IDispatch or NULL
Juan Carlos CORUÑA
jcc at ibdosnorte.com
Tue Oct 1 23:21:07 CEST 2002
jcc at ibdosnorte.com (=?ISO-8859-1?Q?Juan_Carlos_CORU=D1A?=) wrote in message news:<a230569c.0209232353.2710adc8 at posting.google.com>...
> Mark Hammond <mhammond at skippinet.com.au> wrote in message news:<Z5Oj9.12374$6g7.37565 at news-server.bigpond.net.au>...
> > Juan Carlos CORUÑA wrote:
> > > Hello,
> > >
> > > I'm trying to develop a COM Server in python, that has a method that
> > > returns an IDispatch object but sometimes it must return nothing. See
> > > the following example programmed in C/SIDE (Microsoft Navision
> > > Financials ERP):
> > >
> > > --->
> > > otherCOMServer := COMServer.returnOtherCOMServer();
> > > IF ISCLEAR(otherCOMServer) THEN MESSAGE('otherCOMServer is clear');
> > > <----
> > >
> > > Definition of ISCLEAR (extracted from MS Navision help):
> > > The return value is TRUE if:
> > > -the automation variable has not been created. See CREATE.
> > > -the automation variable has been cleared. See CLEAR.
> > > -the automation variable has been assigned NULL by an automation
> > > server.
> > >
> > > I thing that in this case I must assign NULL to the otherCOMServer
> > > variable in order to keep the otherCOMServer variable CLEARED.
> > > What must I return from "COMServer.returnOtherCOMServer()" method to
> > > assign NULL?
> > > I have tried:
> > > return None
> > > return wrap(None)
> > > return 1==0
> > > return
> > >
> > > but without success. The environment responds "data type not
> > > supported".
> > None is the way to do this. What responds "data type not supported"?
> > Have you registered your object for debugging and seen the output?
> > There may be a traceback printed.
> > Mark.
> After executing "return None" Navision responds "This data type is not
> supported by C/SIDE".
> The debugging output is correct:
> OutMessage created <NAVISIONSPREADLib.OutMessage instance at
> Object with win32trace dispatcher created
> (object=<NAVISIONSPREADLib.OutMessage instance at 0x02406260>)
> Returning wrapped <PyIDispatch at 0x24fde14 with obj at 0x2406468>
> in _Invoke_ with 1000 1024 1 (<PyIDispatch at 0x24fde14 with obj at
> in _Invoke_ with 1002 1024 1 (1000,)
> returning None
> The invoke with 1002 is the call to the method that returns NULL or an
> object after 1000 ms of timeout.
In order to discover the problem I created a simplistic method in
Visual Basic and the same in python. Here is the method in VB:
Public Function AMethod() as Object
Set AMethod = Nothing
Here is the method in Python:
return # I also test with return None
The type library look identical for the both methods.
And the result if I invoke the methods from python is "None" in both
cases, but if I invoke the methods from C/SIDE (Navision) the
behaviour of the VB method is as expected, but the python object
returns an error message saying that this type of data is not
supported by C/SIDE.
Since I don't know the internals of python COM implementation, can
anyone help me to discover the problem?
Mark, I suspect there must be a bug in the python COM implementation,
because of the different behaviour of the VB and the python method.
More information about the Python-list