-
Notifications
You must be signed in to change notification settings - Fork 2
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