FAQ
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

Search Discussions

  • Mark Hammond at Dec 20, 2002 at 12:07 am
    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 at Dec 20, 2002 at 12:37 am
    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 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
  • Dale Strickland-Clark at Dec 20, 2002 at 12:59 pm

    Mark Hammond 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.
    You're right. It is the int.
    --
    Dale Strickland-Clark
    Riverhall Systems Ltd

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedDec 19, '02 at 6:49p
activeDec 20, '02 at 12:59p
posts4
users2
websitepython.org

People

Translate

site design / logo © 2022 Grokbase