Hey I think I got it!

Instead of:
data = POINTER(c_ubyte)()

I did:
data = (c_ubyte*2048)()

Now it's working perfectly!

On Mon, Aug 17, 2009 at 12:13 AM, px<p...@qualm.net> wrote:
> Hi, Sorry to bring this back up but I'm still stumped, and I feel very
> close!!  Thomas I took your suggestion and changed the 'out' to 'in'.
>
> From:
>   COMMETHOD([], HRESULT, 'Read',
>             ( ['out'], POINTER(c_ubyte), 'data' ),
>             ( ['in'], c_int, 'len' ),
>             ( ['out'], POINTER(c_int), 'actual' )),
>   ...]
>
> To:
>   COMMETHOD([], HRESULT, 'Read',
>             ( ['in'], POINTER(c_ubyte), 'data' ),
>             ( ['in'], c_int, 'len' ),
>             ( ['out'], POINTER(c_int), 'actual' )),
>   ...]
>
> However defining it this way, it now seems to expect a single c_ubyte
> instead of a pointer to a c_ubyte.
>
> When I try:
>  data = POINTER(c_ubyte)()
>  res = y.Read(byref(data), len)
>
> I get this exception, which seems odd since we defined it as
> POINTER(c_ubyte) in the type library:
> ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>:
> expected LP_c_ubyte instance instead of pointer to LP_c_ubyte
>
> However, when I try:
>  data = c_ubyte()
>  res = y.Read(byref(data), len)
>
> then it executes successfully, but of course data only has 1 value and
> Python crashes after the next Read attempt.
>
> I think maybe I need to redefine to something else?
>
> Thanks again for your help so far.
>
> On Thu, Jun 18, 2009 at 11:57 AM, px<p...@qualm.net> wrote:
>> Thanks Thomas.  I tried your suggestion and changed out to in but it seems
>> to not expect a pointer
>>
>>   COMMETHOD([], HRESULT, 'Read',
>>             ( ['in'], POINTER(c_ubyte), 'data' ),
>>             ( ['in'], c_int, 'len' ),
>>             ( ['out'], POINTER(c_int), 'actual' )),
>>   ...]
>>
>> --
>>
>> data = POINTER(c_ubyte)()
>> len = 2
>> res = y.Read(byref(data), len)
>>
>> ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected
>> LP_c_ubyte instance instead of pointer to LP_c_ubyte
>>
>>
>>
>> On Wed, Jun 17, 2009 at 2:06 AM, Thomas Heller <thel...@ctypes.org> wrote:
>>>
>>> px schrieb:
>>> > Thanks Thomas! This was very helpful indeed.  Working great now :)
>>> >
>>> > Came across another problem trying to read back an unsigned byte
>>> > buffer..
>>> > I'm pretty stumped
>>> >
>>> > #    COMMETHOD([], HRESULT, 'Read',
>>> > #              ( ['out'], POINTER(c_ubyte), 'data' ),
>>> > #              ( ['in'], c_int, 'len' ),
>>> > #              ( ['out'], POINTER(c_int), 'actual' )),
>>> >
>>> > When I call Read(2048), I always just get 13 back for the data field
>>> > (first
>>> > element in returned tuple) but I actually expect more bytes.
>>> >
>>> > I took a shot at doing a ctypes style call, but when I try to make the
>>> > call
>>> >   x.Read(byref(data), len, byref(actual))
>>> > I get
>>> >   TypeError: call takes exactly 2 arguments (4 given)
>>> >
>>> > It seems that comtypes only wants the in 'len' parameter.
>>> >
>>> >>From the IDL:
>>> >     HRESULT Read(
>>> >         [out, size_is(length), length_is(*actual)] BYTE* data,
>>> >         [in] long length,
>>> >         [out] long* actual);
>>>
>>> comtypes isn't able to handle the 'length_is(...)' attribute.  Besides,
>>> the info from this attribute isn't present in the TLB at all.  So,
>>> you should override the generated 'Read' method in this way,
>>> which passes the pointer as 'in' argument, and later unpacks it:
>>>
>>>
>>>   COMMETHOD([], HRESULT, 'Read',
>>>             ( ['in'], POINTER(c_ubyte), 'data' ),
>>>             ( ['in'], c_int, 'len' ),
>>>             ( ['out'], POINTER(c_int), 'actual' )),
>>>   ...]
>>>
>>>   def Read(self, len):
>>>       data = POINTER(c_ubyte)()
>>>       actual = self._Read(byref(data), len)
>>>       result = data[:actual]
>>>       # I guess you need to free the memory here?
>>>       # windll.ole32.CoTaskMemFree(data)
>>>       return result
>>>
>>> Thomas
>>>
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Crystal Reports - New Free Runtime and 30 Day Trial
>>> Check out the new simplified licensing option that enables unlimited
>>> royalty-free distribution of the report engine for externally facing
>>> server and web deployment.
>>> http://p.sf.net/sfu/businessobjects
>>> _______________________________________________
>>> comtypes-users mailing list
>>> comtypes-users@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/comtypes-users
>>
>>
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
comtypes-users mailing list
comtypes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/comtypes-users

Reply via email to