diff --git a/ChangeLog b/ChangeLog index 969666ce9b..2c9897e7a3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ -Mon Mar 2 10:50:53 2009 Nobuyoshi Nakada +Mon Mar 2 11:01:45 2009 Nobuyoshi Nakada + + * ext/dl/dl.h (dlerror): fixed on Windows. + + * ext/dl/handle.c (rb_dlhandle_initialize): returns handle to + libruby if nil is given on Windows as dlopen. * ext/dl/handle.c (rb_dlhandle_sym): get rid of buffer overrun, and try ASCII WINAPI versions too. diff --git a/ext/dl/dl.h b/ext/dl/dl.h index 753bd1c976..fb904bc561 100644 --- a/ext/dl/dl.h +++ b/ext/dl/dl.h @@ -24,7 +24,7 @@ # include # define dlclose(ptr) FreeLibrary((HINSTANCE)ptr) # define dlopen(name,flag) ((void*)LoadLibrary(name)) -# define dlerror() "unknown error" +# define dlerror() strerror(rb_w32_map_errno(GetLastError())) # define dlsym(handle,name) ((void*)GetProcAddress(handle,name)) # define RTLD_LAZY -1 # define RTLD_NOW -1 diff --git a/ext/dl/handle.c b/ext/dl/handle.c index b8752004bc..c4ee0b9c14 100644 --- a/ext/dl/handle.c +++ b/ext/dl/handle.c @@ -67,6 +67,13 @@ rb_dlhandle_initialize(int argc, VALUE argv[], VALUE self) rb_bug("rb_dlhandle_new"); } +#if defined(HAVE_WINDOWS_H) + if( !clib ){ + HANDLE rb_libruby_handle(void); + ptr = rb_libruby_handle(); + } + else +#endif ptr = dlopen(clib, cflag); #if defined(HAVE_DLERROR) if( !ptr && (err = dlerror()) ){ diff --git a/ruby.c b/ruby.c index ab15cd979a..b9a8ce27a5 100644 --- a/ruby.c +++ b/ruby.c @@ -325,6 +325,12 @@ DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved) libruby = dll; return TRUE; } + +HANDLE +rb_libruby_handle(void) +{ + return libruby; +} #endif void ruby_init_loadpath_safe(int safe_level);