PythonCOM in ASP: very dodgy behaviour

Dale Strickland-Clark dale at riverhall.NOTHANKS.co.uk
Thu Dec 19 19:37:08 EST 2002


Thanks for the response, Mark. 

That may be true. 

It may not be related but until we added the _value_ attribute to the
COMWibble class, wrap bombed, complaining that it had no default
value. We only added it to shut wrap up.

I'd test your theory but I can't get to a PC with a working web server
at the moment. I'll do it first thing tomorrow.




Mark Hammond <mhammond at skippinet.com.au> wrote:

>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

--
Dale Strickland-Clark
Riverhall Systems Ltd



More information about the Python-list mailing list