[#38470] ruby-dev summary 21403-21530 (draft) — Minero Aoki <aamine@...>

青木です。

25 messages 2003/10/07
[#38475] Re: ruby-dev summary 21403-21530 (draft) — maili31s@... (SugHimsi==SUGIHARA Hiroshi) 2003/10/07

すぎむし。

[#38480] Re: ruby-dev summary 21403-21530 (draft) — Minero Aoki <aamine@...> 2003/10/08

青木です。

[#38481] marshal_dump (was Re: ) — m_seki@... 2003/10/08

[#38484] Re: marshal_dump (was Re: ) — matz@... (Yukihiro Matsumoto) 2003/10/09

まつもと ゆきひろです

[#38486] Re: marshal_dump (was Re: ) — Masatoshi Seki <m_seki@...> 2003/10/09

咳といいます

[#38489] exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to>

<http://www.unixuser.org/~ysjj/diary/?200310a&to=200310082#200310082>

29 messages 2003/10/09
[#38490] Re: exit status on exit! — Koji Arai <JCA02266@...> 2003/10/09

新井です。

[#38503] Re: exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to> 2003/10/10

In Message-Id: <20031010.082218.74733862.JCA02266@nifty.ne.jp>

[#38505] Re: exit status on exit! — Koji Arai <JCA02266@...> 2003/10/10

新井です。

[#38507] Re: exit status on exit! — matz@... (Yukihiro Matsumoto) 2003/10/11

まつもと ゆきひろです

[#38514] Re: exit status on exit! — YANAGAWA Kazuhisa <kjana@...4lab.to> 2003/10/11

In Message-Id: <1065883639.405037.23137.nullmailer@picachu.netlab.jp>

[#38515] Re: exit status on exit! — WATANABE Hirofumi <eban@...> 2003/10/11

わたなべです。

[ruby-list:38712] [Win32] GetLastError() with dl.so

From: "Shirai,Kaoru" <shirai@...>
Date: 2003-10-31 14:50:22 UTC
List: ruby-list #38712
白井です。

Win32APIのCreateMutexをRuby-1.8.0-mswin32から使おうとして気付いたので
すが、dl.so(Win32API.soも)でAPIを呼び出した後に、GetLastError()の値が
直前の呼び出しに基づいたものになりません。

================================================================
require "dl/import"

module Win32
  extend DL::Importable
  dlload "kernel32.dll"
  extern "void SetLastError(DWORD)"
  extern "DWORD GetLastError()"
end #/Win32

Win32.setLastError(1234)
p Win32.getLastError #=>0
================================================================

おそらく、2つのdl_sym_call()の間に別のAPI呼び出しが発生しているのだと
思います。CreateMutexなどを使う場合はエラーコードを判定したいので、こ
れだと少し困ります。拡張ライブラリを書けば別なんですが。

とりあえず、応急的にsym.cをいじってDL.win32_last_errorメソッドを追加し
て取得できるようにしてみました。(スレッド非対応)cygwin,mingw版では動
作確認していませんが、これで取得できるようにはなりました。

Win32.setLastError(1234)
p DL.win32_last_error   #=>1234
p Win32.getLastError    #=>0

何か他に良いアプローチは無いでしょうか。
-- 
Shirai,Kaoru <shirai@korinkan.co.jp>
Korinkan Ltd. - http://www.korinkan.co.jp/

Attachments (1)

dl-sym-win32err.diff (1.07 KB, text/x-diff)
Index: ext/dl/sym.c
===================================================================
RCS file: /src/ruby/ext/dl/sym.c,v
retrieving revision 1.19
diff -u -r1.19 sym.c
--- ext/dl/sym.c	29 Mar 2003 02:56:18 -0000	1.19
+++ ext/dl/sym.c	31 Oct 2003 14:37:41 -0000
@@ -316,6 +316,16 @@
   return size;
 }
 
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+DWORD rb_dl_win32_lasterror = 0;
+VALUE
+rb_dl_win32_get_lasterror(VALUE self)
+{
+  return INT2NUM(rb_dl_win32_lasterror);
+}
+#endif
+
 VALUE
 rb_dlsym_call(int argc, VALUE argv[], VALUE self)
 {
@@ -675,6 +685,9 @@
       rb_raise(rb_eDLTypeError, "unknown type `%c'", sym->type[0]);
     }
   }
+#ifdef _WIN32
+  rb_dl_win32_lasterror = GetLastError();
+#endif
   }
 #else /* defined(DLSTACK) */
   switch(ftype){
@@ -835,4 +848,8 @@
   rb_define_method(rb_cDLSymbol, "to_s", rb_dlsym_cproto, 0);
   rb_define_method(rb_cDLSymbol, "to_ptr", rb_dlsym_to_ptr, 0);
   rb_define_method(rb_cDLSymbol, "to_i", rb_dlsym_to_i, 0);
+
+#ifdef _WIN32
+  rb_define_singleton_method(rb_mDL, "win32_last_error", rb_dl_win32_get_lasterror, 0);
+#endif
 }

In This Thread

Prev Next