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