MeでのDLLの読み込み

 Meで32bitDLLを「LoadLibrary()」で読み込もうとすると失敗する件に関して。


 部室のPCに何故か(?)Me搭載のマシンがあるので、
動作チェック用に使わせてもらっているのですが、
拙作を動かそうとした所、初期化で失敗して終了する…。
原因を調べてみると、どうも「LoadLibrary()」で失敗しているらしい。
 おそらく、Meも9x系OSなので16bit時代のAPIに準拠していて、
32bitDLLの読み込みは失敗してしまうのではないかと推測してみる。
(timeSetEvent()で16bitのタイマが使用されているようですし)


…で、何かないかと調べてみたところ、

  • LoadLibrary16()FreeLibrary16()GetProcAddress16()

というものがあるらしいことを発見。


 早速必要なライブラリを作製し、プロトタイプを記述して動かしてみた所、
LoadLibrary16()は成功するものの、今度はGetProcAddress16()で失敗する
よくよく考えてみると、「DLL自体は32bit」なので、
そこから「16bitで関数を取り出そうとしている」わけですから失敗して当然といえば当然ですね…(苦笑)
 後で気付いたこととしては、「GetProcAddress16()」ではなく「GetProcAddress()」でも試せばよかったなということ。
「16bitで読み込んで」「32bitで関数を取り出す」って明らかにおかしいのですが、
引数や返り値の型の関係上普通に通るはずなので。





 はてさて、というわけで他に手はないかというと、

  • DLL自体を16bitにしてしまう
  • あきらめて、NT系のみを対象にする

…といった所でしょうか。(一つは諦めてますが…(苦笑))
 ちなみに、「16bitにしてしまう」というのは、32bitと16bit両方のDLLを用意するという手段なのですが、
如何せん、現状では「(DLLのみならず)16bitでビルド出来る環境」の構築が困難なのですよね…。
 ビルドさえ出来てしまえば(16bitの)読み込みは前述の方法で出来るはずなので、
使う側としては16bitも32bitも気にしないで使えるのでベストなのですが…。