Python COM - limit on size/complexity of returned object?

Stefan Schukat SSchukat at
Mon Jun 28 18:20:26 CEST 2004

There was a reference bug in pythoncom.dll which lead to such errors.
This should be fixed by now.


-----Original Message-----
From: pywin32-checkins-admin at
[mailto:pywin32-checkins-admin at]On Behalf Of Mark
Sent: Saturday, May 01, 2004 1:31 AM
To: pywin32-checkins at
Subject: [pywin32-checkins] pywin32/com/win32com/src

Update of /cvsroot/pywin32/pywin32/com/win32com/src
In directory

Modified Files:
Log Message:
Fix a reference counting bug in the new arbitrary safearray code.  Large
arrays could cause a crash.

Index: oleargs.cpp
RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/oleargs.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** oleargs.cpp	25 Apr 2004 04:10:48 -0000	1.26
--- oleargs.cpp	1 May 2004 00:30:51 -0000	1.27
*** 489,492 ****
--- 489,493 ----
  			// Retrieve the stored size in this dimension 
  			ppyobDimension = PyInt_FromLong(lDimension);
+ 			// Note: No ref added by PyDict_GetItem
  			ppyobDimensionSize =
PyDict_GetItem(ppyobDimensionDictionary, ppyobDimension);
  			if (NULL == ppyobDimensionSize) {
*** 500,504 ****
  					// if not the same size => no new
- 					Py_XDECREF(ppyobDimensionSize);
--- 501,504 ----
*** 506,510 ****
- 			Py_XDECREF(ppyobDimensionSize);
--- 506,509 ----

-----Original Message-----
From: at
[ at]On Behalf Of
google at
Sent: Saturday, June 26, 2004 11:22 AM
To: python-list at
Subject: Re: Python COM - limit on size/complexity of returned object?

kveretennicov at (Konstantin Veretennicov) wrote in message
news:<5155aad2.0406250612.29d5039b at>...

> 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.

Thanks for the pointer. I tried it on another machine with 2.3 and
that works with no problems.

And I made some further discoveries on the 2.2 side: the problem isn't
a limit on the size of the returned object, it's cumulative. I amended
GetProfileComponentMatrixEx() to return the first n rows of the
matrix, to find out what the limit was: like this
>>> print len(GetProfileComponentMatrixEx(10))
>>> print len(GetProfileComponentMatrixEx(40))
>>> print len(GetProfileComponentMatrixEx(80))
But trying it repeatedly I found that I could only execute the
following line once: it crashed calling it with an argument of 40 the
second time:
>>> print len(GetProfileComponentMatrixEx(40))
>>> print len(GetProfileComponentMatrixEx(40))
And then I tried this repeatedly:
>>> print len(GetProfileComponentMatrixEx(10))
and -- surprise! -- it failed about the 7th or 8th invocation.

So, now there are two possibilities. 
1. It's a 2.2 problem that is fixed in 2.3 (though I looked in
Sourceforge for the bug reports and this did not show up there).
2. It's a side-effect of the module I'm importing to do the actual
work. On the machine running 2.3, I had to write a stub to represent
this module, because it is a home machine that can't see the work
server where the data is.

If the DLL is at fault, I'm going to have a hard time convincing the
vendor that they have to fix it. If I were them, I'd be sceptical. The
DLL is loaded by the import statement, but in this test it is never
called. It's hard to see what it's initialization code could possibly
be doing to break pythoncom.

More information about the Python-list mailing list