static int w32_dlclose(void *ptr) { # ifndef _WIN32_WCE if( ptr == w32_coredll() ) return 0; # endif if( FreeLibrary((HMODULE)ptr) ) return 0; return errno = rb_w32_map_errno(GetLastError()); }
static VALUE make_api_error(const char* msg) { DWORD w32_err; int myerrno; w32_err = GetLastError(); myerrno = rb_w32_map_errno(w32_err); return rb_syserr_new( myerrno == EINVAL ? w32_err : myerrno, msg); }
static VALUE console_info(VALUE io) { int fd = NUM2INT(rb_funcallv(io, rb_intern("fileno"), 0, 0)); HANDLE h = (HANDLE)rb_w32_get_osfhandle(fd); CONSOLE_SCREEN_BUFFER_INFO csbi; if (h == (HANDLE)-1) rb_raise(rb_eIOError, "invalid io"); if (!GetConsoleScreenBufferInfo(h, &csbi)) rb_syserr_fail(rb_w32_map_errno(GetLastError()), "not console"); return rb_struct_new(rb_cConsoleScreenBufferInfo, INT2FIX(csbi.dwSize.X), INT2FIX(csbi.dwSize.Y), INT2FIX(csbi.dwCursorPosition.X), INT2FIX(csbi.dwCursorPosition.Y), INT2FIX(csbi.wAttributes)); }