Subject:
[ruby-ffi] Re: Dealing with pointers and in/out struct params
From:
Daniel Berger
Date:
6/29/12 8:17 PM
To:
ruby-ffi



On Jun 29, 8:09 pm, Daniel Berger <djber...@gmail.com> wrote:
> Hi,
>
> There's a function called ReadFileScatter in the Windows API that
> takes an OVERLAPPED structure as its last (in/out) parameter. It looks
> like this, keeping in mind that I've simplified it a bit to only
> contain the bits I care about,  and it is the right size - 20.
>
> class Overlapped < FFI::Struct
>     layout(
>       :Internal, :pointer,
>       :InternalHigh, :pointer,
>       :Offset, :ulong,
>       :OffsetHigh, :ulong,
>       :hEvent, :ulong
>     )
> end
>
> The member I happen to care about specifically is :Internal, which the
> MSDN docs will tell you is a ULONG_PTR (either an unsigned long or
> unsigned int64, depending on whether or not you're x64).
>
> I created an instance using Overlapped.new and passed it to
> ReadFileScatter, which I can call successfully. The problem is that
> the overlap[:Internal] member isn't populated after the call. I also
> tried explicitly setting the :Internal member to an
> FFI::MemoryPointer.new(:ulong) before passing the struct, but that
> didn't seem to help.
>
> How do I get FFI to populate my overlapped struct's pointer?

Gah, disregard this. The struct members aren't actually pointers. I
was mislead by the typedef name.

Sorry for the noise.

Regards,

Dan