artonです。

win32に特化した問題ですが、ruby-win32が止まっているようなのでこちらに振
ります。

主題:ruby-1.8.0添付のdlを利用してWIN32 APIを呼び出すとスタックポインタ
がずれる。元の話題はhttp://www.tietew.jp/beckrb/msg00113.html です。
詳細:WIN32 APIでは、引数のスタックからのポップを呼ばれた側が実行する。
しかし、dlは関数呼出し後に引数をスタックからポップする。そのため、引数の
分だけ余分にスタックポインタがポップされてしまう。

ただし、現状では問題が出ていないようです。MSVC版での動作の検証結果は
http://arton.no-ip.info/collabo/backyard/?StdDeclCDecl
に記述してあります。
しかし、WIN32版Rubyには、MSVC6版以外にMingw, bcc, cygwin, MSVC7などあっ
て、これらの場合についてまではわかりません。いずれにしろ、不正な動作なこ
とには変わらないため、現状が望ましいとも思えません。ちょっと検討した結果
は、
http://arton.no-ip.info/collabo/backyard/?DlPatch
にあります。が、ここで挙げているパッチ自体いささか中途半端だということと、
他のコンパイラではどうなのか、といった点が抜けています。
よろしければ、各コンパイラでの現状はどうなのか、どうすることが望ましいか、
について検討しませんか? 

なお、僕は、
1. WIN32APIについては従来通りwin32api.so、C関数についてはdl を使い分ける
2. dlがすべて(自動で)面倒見る
3. dlにWIN32API用とC関数用の2種類のクラスを持つ(他のプラットフォームで
は無意味)
の選択であれば、2.が望ましいと考えますが、3.はともかく、1.というオプショ
ンもあるので、これも検討の余地があると思います。
また、上記のように、MSVC6版については現状でほぼ問題ないので、そのまま置
いておくという選択肢もあるようにも思えます。

それでは。

-- 
arton <artonx / yahoo.co.jp>

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/