Skip to content

FFI and CStruct [win32 example]

skandhas edited this page Feb 13, 2012 · 1 revision

##System Local Time Use FFI:

require 'ffi'
module Win
  extend FFI::Library

  class SystemTime < FFI::Struct
    layout :year, :ushort,
           :month, :ushort,
           :day_of_week, :ushort,
           :day, :ushort,
           :hour, :ushort,
           :minute, :ushort,
           :second, :ushort,
           :millis, :ushort
  end

  ffi_lib 'kernel32'
  ffi_convention :stdcall

  attach_function :GetLocalTime, [ :pointer ], :void
end

mytime = Win::SystemTime.new
Win.GetLocalTime(mytime)

args = [
  mytime[:month], mytime[:day], mytime[:year],
  mytime[:hour], mytime[:minute], mytime[:second]
  ]

puts "Date: %u/%u/%u\nTime: %02u:%02u:%02u" % args

use FFI and CStruct:

SYSTEMTIME in Windows SDK:

typedef struct _SYSTEMTIME { 
  WORD wYear; 
  WORD wMonth; 
  WORD wDayOfWeek; 
  WORD wDay; 
  WORD wHour; 
  WORD wMinute; 
  WORD wSecond; 
  WORD wMilliseconds; 
} SYSTEMTIME;

CStruct describe SYSTEMTIME is straightforward.

require 'ffi'
require 'cstruct/win32struct'
module Win
  extend FFI::Library

  class SYSTEMTIME < Win32Struct
    WORD :wYear
    WORD :wMonth
    WORD :wDayOfWeek
    WORD :wDay
    WORD :wHour
    WORD :wMinute
    WORD :wSecond
    WORD :wMilliseconds
  end 

  ffi_lib 'kernel32'
  ffi_convention :stdcall

  attach_function :GetLocalTime, [ :pointer ], :void
end

mytime = Win::SYSTEMTIME.new
Win.GetLocalTime(mytime.data) # or mytime.__data__

args = [
  mytime.wMonth,mytime.wDay,mytime.wYear,
  mytime.wHour, mytime.wMinute, mytime.wSecond
  ]

puts "Date: %u/%u/%u\nTime: %02u:%02u:%02u" % args
Clone this wiki locally