PythonCOM in ASP: very dodgy behaviour

Mark Hammond mhammond at skippinet.com.au
Thu Dec 19 19:07:43 EST 2002


My guess is that ASP is writing the *value* of your COM object, not the 
object itself - ie, in VB, this would be like dropping the "Set".

You should print what
 > wrapWibble = Session("Wibble") # retrieve from session object
Is before attempting the unwrap.  My guess it is your int.

I won't have time to look more at this until I get back from holidays in 
a couple of weeks.

Mark.

Dale Strickland-Clark wrote:
> This is turning into a bit of a puzzle. I posted about the problem a
> while ago but didn't get much response. We really need to sort this
> out now. 
> 
> We are trying to store a Python object in the ASP session object but
> it won't play ball. The object retrieved isn't the same as the one
> that went in.
> 
> I've reduced the problem to two small modules. One ASP/Python, the
> other pure Python.
> 
> The Python module is a simple object with a COM interface. The ASP
> module instantiates the Python object and then tries to wrap it as a
> COM object to store in the ASP Session object.
> 
> The output and error is: 
> 
> 246 -1- 492 
> Python ActiveX Scripting Engine error '80020009' 
> 
> Traceback (most recent call last): File "<Script Block >", line 13, in
> ? objWibble = unwrap(wrapWibble) File
> "C:\Python22\lib\site-packages\win32com\server\util.py", line 36, in
> unwrap ob = pythoncom.UnwrapObject(ob) ValueError: argument is not a
> COM object 
> 
> ?, line 0 
> 
> ob = pythoncom.UnwrapObject(ob)
> 
> So in summary: what goes into the Session object doesn't seem to come
> out again.
> 
> Any and all help gratefully received.
> 
> Further info: Python 2.2.2 with Win32all 150 (or 148) on Win2K
> 
> ---- COMHarness.asp ----
> <% @Language=Python %>
> <%
> import COMHarness2
> from win32com.server.util import wrap, unwrap
> objWibble = COMHarness2.COMWibble() # Get Object
> 
> Response.Write(objWibble.Wibble()) # Test object works
> Response.Flush()       # Flush output
> 
> wrapWibble = wrap(objWibble) # wrap object in COM wrapper
> objWibble = unwrap(wrapWibble) # unwrap again
> 
> Response.Write(" -1- ") # id. output
> Response.Write(objWibble.Wibble()) # test unwrapped object
> Response.Flush()
> 
> Session.SetValue("Wibble", wrapWibble) # store wrapped object in
> Session object
> 
> wrapWibble = Session("Wibble") # retrieve from session object
> objWibble = unwrap(wrapWibble) # unwrap retrieved object
> 
> Response.Write(" -2- ")	# id. output
> Response.Write(objWibble.Wibble()) # test unwrapped object.
> Response.Flush()
> %>
> ----------END-----------
> 
> ---- COMHarness2.py ----
> class COMWibble:
>     _public_methods_ = ['Wibble']
>     _public_attrs_ = ['Wobble']
>     _reg_progid_ = 'Wibble.Test.1'
>     _reg_clsid_ = '{E871E6D2-BCBF-45E3-AF4A-791A7E153070}'
> 
>     def __init__(self):
>         self.Wobble = 123
> 
>     def Wibble(self):
>         self.Wobble *= 2
>         return self.Wobble
> 
>     def Wobble(self):
>         return self.Wobble
> 
>     _value_ = Wobble
> 
> if __name__ == '__main__':
>     print "Registering COM server..."
>     import win32com.server.register as reg
>     reg.UseCommandLine(COMWibble)
> ----------END-----------
> 
> --
> Dale Strickland-Clark
> Riverhall Systems Ltd




More information about the Python-list mailing list