If I make the following change to oleargs.cpp

--- oleargs.cpp.orig    2007-07-13 11:21:30.711416000 -0400
+++ oleargs.cpp 2007-07-13 11:22:46.764499200 -0400
@@ -834,6 +834,16 @@
                 if (FAILED(hres))
                         return PyCom_BuildPyException(hres);
                 long cElems = ub-lb+1;
+               for(UINT d = dimNo+ 1; d<=nDims; d++)
+               {
+                       hres = SafeArrayGetLBound(psa, d, &lb);
+                       if (FAILED(hres))
+                               return PyCom_BuildPyException(hres);
+                       hres = SafeArrayGetUBound(psa, d, &ub);
+                       if (FAILED(hres))
+                               return PyCom_BuildPyException(hres);
+                       cElems *= (ub - lb + 1);
+               }
                 long dataSize = cElems * sizeof(unsigned char);
                 PyObject *ret = PyBuffer_New(dataSize);
                 if (ret!=NULL) {

then I get the full array back, but of course it comes back as an  
array of 1 dimension. The original dimension information is lost.  
Which leads to the question of what is the correct object to return  
in this case.

I don't think that a tuple of buffers, as you describe below, is  
really the right thing. For that to work either you have to reverse  
the dimension order of the array, or the buffers have to contain data  
that originally wasn't contiguous (the buffers hold columns instead  
of rows). Neither seems particularly useful.

Would it make sense to return an object thats a buffer that holds the  
full array data, but also has some additional attribute that contains  
the original array dimensions? For my particular case that would be  
the idea, since I want to feed the data into PIL.Image.frombuffer,  
which takes a buffer plus a size tuple. But I'm not sure what the  
best choice would be for general use.

Also, what is the procedure for building a windows installer for  
pywin32? I can't seem to find any documentation on that. I'd like to  
create an installer that contains the above patch that I can use  
until fix makes it into an offical pywin32 release.

Thanks

  -J


On Jul 4, 2007, at 7:35 PM, Mark Hammond wrote:

>> On Jul 4, 2007, at 7:12 PM, Mark Hammond wrote:
>>>
>>> Arrays of type VT_UI1 are returned as buffers.  You should
>> find the
>>> length
>>> of f is 1536, and you can treat it as a string (ie, just
>> index into
>>> it to
>>> fetch the values, len() to get the length, slice it, etc).  This is
>>> primarily done as an optimization, so we don't need to waste time
>>> and space
>>> building lists of lists of integers when the data is more
>> naturally a
>>> 'string of bytes' anyway.
>>>
>>> Mark
>>>
>>
>> I don't quite follow.
>>
>> I understand (well, I think I understand) how a buffer works. The
>> problem is that the length is wrong.
>>
>> As shown above, the length of f is 2048. If the array was being
>> returned correctly
>> as a buffer, then the length should be 3145728 (2048 * 1536).
>
> Hrm - I misunderstood.  a 2048x1536 array of bytes *should* be  
> returned as a
> list with 2048 entries, each being a buffer of size 1536.  I guess  
> I'll need
> to try and reproduce this in the test suite...
>
> Mark
>

_______________________________________________
Python-win32 mailing list
Python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to