Python COM - limit on size/complexity of returned object?
Konstantin Veretennicov
kveretennicov at yahoo.com
Fri Jun 25 10:12:58 EDT 2004
google at prodigycomputing.com (Paul Keating) wrote in message news:<51f8958a.0406240327.1b26a76f at posting.google.com>...
> I have a very simple COM server written in Python that is trying to
> return a two-dimensional array 268 x 20. The values it contains are
> some small integers, some short (<29 character) Unicode strings, and
> None.
>
> To isolate the problem I have taken out the code that builds the
> matrix from real data, and just substituted a literal tuple of tuples,
> like this:
>
> class AtlasSecurity:
> _reg_progid_ = 'Arena.Security'
> ...
> def GetProfileComponentMatrixEx(self):
> # self.BuildMatrix()
> self.matrix = ((u'ID', u'Name', u'Type', .... ),
> ... )) # a 268-tuple of 20-tuples
> self.last_result = (self.matrix,)
> return self.last_result
>
> Because I was having trouble calling it from Excel ("the server has
> disconnected from its clients"), to see what was going on I decided to
> call it from a Python client, like this:
>
> from win32com.client import Dispatch
> x = Dispatch("Arena.Security")
> print x.GetProfileComponentMatrixEx()
>
> This blows up in python22.dll with a C++ Runtime abort(), no matter
> what I try. I can write a method that I can call 268 times to return
> the data one 20-element vector at a time. This works, but is really
> only good for simple data structures and I need this to work with
> structures of arbitrary complexity and levels of nesting.
>
> Is there a restriction on the size or complexity of the SafeArray that
> pythoncom is constructing from the returned value? Or what else am I
> doing wrong?
>
> (I am using Python 2.2 because I am working with embedded Python and
> that is the version that is embedded.)
Well, I did some testing with python 2.3 (that's what I have).
Not sure if it will cheer you up, but I had no problems.
- kv
<server-code>
class AtlasSecurity:
_reg_clsid_ = '{92522CC6-05A5-4172-BFCA-56C65FD45467}'
_reg_desc_ = 'Arena Server'
_reg_progid_ = 'Arena.Security'
_public_methods_ = ['GetProfileComponentMatrixEx']
_public_attrs_ = []
_readonly_attrs_ = []
def GetProfileComponentMatrixEx(self):
self.matrix = ((u'ID', u'Name', u'Type') * 10,) * 268
self.last_result = (self.matrix,)
return self.last_result
if __name__ == '__main__':
import win32com.server.register
win32com.server.register.UseCommandLine(AtlasSecurity)
</server-code>
<python-client-code>
import win32com.client
from win32com.client import Dispatch
x = Dispatch("Arena.Security")
print x.GetProfileComponentMatrixEx()
</python-client-code>
<vb-client-code>
Dim A As Object
Set A = CreateObject("Arena.Security")
Dim V As Variant
Let V = A.GetProfileComponentMatrixEx()
</vb-client-code>
More information about the Python-list
mailing list