diff --git a/ext/fiddle/function.c b/ext/fiddle/function.c index e0da8b6..e843587 100644 --- a/ext/fiddle/function.c +++ b/ext/fiddle/function.c @@ -186,7 +186,7 @@ function_call(int argc, VALUE argv[], VALUE self) rb_funcall(mFiddle, rb_intern("last_error="), 1, INT2NUM(errno)); #if defined(_WIN32) - rb_funcall(mFiddle, rb_intern("win32_last_error="), 1, INT2NUM(errno)); + rb_funcall(mFiddle, rb_intern("win32_last_error="), 1, ULONG2NUM(GetLastError())); #endif ALLOCV_END(alloc_buffer); diff --git a/test/fiddle/test_function.rb b/test/fiddle/test_function.rb index de7c958..0e96fe4 100644 --- a/test/fiddle/test_function.rb +++ b/test/fiddle/test_function.rb @@ -10,6 +10,7 @@ module Fiddle def setup super Fiddle.last_error = nil + Fiddle.win32_last_error = nil if WINDOWS end def test_default_abi @@ -65,6 +66,18 @@ module Fiddle refute_nil Fiddle.last_error end + def test_win32_last_error + kernel32 = dlopen('kernel32') + args = [kernel32['SetLastError'], [TYPE_LONG], TYPE_VOID] + args << Function::STDCALL if Function.const_defined?(:STDCALL) + func = Function.new(*args) + + assert_nil(Fiddle.win32_last_error) + n = 1 << 29 | 1 + func.call(n) + assert_equal(n, Fiddle.win32_last_error) + end if WINDOWS + def test_strcpy f = Function.new(@libc['strcpy'], [TYPE_VOIDP, TYPE_VOIDP], TYPE_VOIDP) buff = "000"