From: Shigeo Kobayashi Date: 2000-02-04T20:20:58+09:00 Subject: [ruby-dev:9109] Re: xmalloc() in Windows 小林です。 ----- Original Message ----- 送信者 : KIMURA Koichi 件名 : [ruby-dev:9106] Re: xmalloc() in Windows > > >うう、ruby.defに序数を付けるとimport tableが名前じゃ > >なくなっちゃいますよね。 > >importできないときの情報が減ってしまう。 > > げ、そういう副作用(?)があったのですね。 > #序数意識してやったことが無いので^^;; > 名前でできないとGetProcAddressするときにも面倒ですよねえ。 > 単に表示が序数を表示しているだけのようです。 序数を付けても、以下のコードは動作します。 HANDLE h = LoadLibrary("RubyMw.dll"); FARPROC pf = GetProcAddress(h,"rb_mem_clear"); > >NT4.0SP6aでruby.defに序数を付けたrubymw.dllから序数を付けないもので > >作った拡張ライブラリがロードできることは確認しました。 > > > >つまり、名前で参照していれば序数が違っていてもOKと。 > > ということらしいですね。では、あのヘルプは何なのだ! (私は、あのヘルプに従って序数は付けるものと思ってい ました、失敗した記憶もかすかにあるし)。 で、過去に失敗した例を探しました。これが、Windows 3.1 の ときだったんですね!! まず、WIN32 では、def ファイルで NONAME を指定しない限 り DLL には名前と序数が共に含まれるので問題なしです (DEF ファイルの中を入れ替えたりしてやってみましたがOK でした)。メモリが豊富なWIN32 の時代で序数のメリットは NONAME を使用して特定の名前を DLL に組み込まない ようにして危険な関数等を使用しずらくするという消極的な 意味しかないようです。 ところが、サイズの制限がきつかった Win 3.1 の時代は特別 に RESIDENTNAME というキーワードを .DEF ファイルに付け ないと全ての名前が入らないということを思い出しました。 MSお勧めは RESIDENTNAME 無しです。 (序数も名前もメモリに常駐するので...) Petzold の本(古すぎる!)の例題にも、 RESIDENTNAME は 付いてないですね(説明はあります)。 WIN32では RESIDENTNAME は無視されます。 で、Lib ファイルを用いてリンクする場合は OK ですが前記の ようにダイナミックにロードする場合、名前がないので序数で しか関数アドレスが取得できなかったわけです(これが、 「失敗の記憶」だと類推しています)。 今では GetProcAddress(h,MAKEINTRESOURCE(...)) なん てやる人はいないと思うので、特に序数は要らないようで すね。あの、ヘルプはどうも Win 3.1 時代のものが残って いるような気がします。 おさわがせしました。 m(_ _)m # せっかく Ruby で序数を振ってから、編集したのに... 小林 茂雄 E-Mail: shigeo@tinyforest.gr.jp Home Page: http://www.tinyforest.gr.jp