小松です。

In the message of [ruby-dev:8633] Re: Win32API (Re: Ruby 1.4.3 binaries for Cygwin and DJGPP)
    on 1999/12/12 22:46:03 Yoshida Masato <yoshidam / yoshidam.net> wrote:
> 0x80000000 以上のとき INT2NUM すると負の Bignum になってしま
> うので,NUM2ULONG では元に戻らないような気がします。

アドレスは、98だと"0xbff9170e"、NTだと"0x77e52aa8"とかになりました。
NUM2ULONG (rb_num2ulong) は……Bignumの絶対値を返すんですか。ひえー。

> とりあえず以下の部分を NUM2INT に戻すと動くと思うのですが,
> これが正しいのかどうかはわかりません。

Cygwin B20.1 + Cygwin CD 1.0のcygwin1.dllおよびmswin32で
問題なく動作しました。

> -    ApiFunction = (FARPROC)NUM2ULONG(obj_proc);
> +    ApiFunction = (FARPROC)NUM2INT(obj_proc);

98でもNTでもobj_procはFixnumの範囲外でBignumになるので、ここを
NUM2ULONGのままにして、__proc__を設定する方をunsignedにしようかと
思ったら、とうぜんあるものと思ったUINT2NUMがruby.hになかった……

ということで、ruby.hにUINT2NUMの追加を希望します。

--- ruby.h-1.3	Wed Nov 17 16:30:36 1999
+++ ruby.h	Mon Dec 13 20:32:00 1999
@@ -118,4 +118,6 @@ typedef unsigned long ID;
 VALUE rb_int2inum _((long));
 #define INT2NUM(v) rb_int2inum(v)
+VALUE rb_uint2inum _((unsigned long));
+#define UINT2NUM(v) rb_uint2inum(v)
 
 #define FIX2LONG(x) RSHIFT((long)x,1)

--
小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>