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も気にしないで使えるのでベストなのですが…。