« マウス | メイン | 書籍購入 »

2003年10月07日

STL→MFC

大失敗をやらかしてしまった。ここ1週間ほどWindows98/Me/2000/XPで動くActiveXコントロールを作っていて、先週でコーディングが終わって今日から検査フェーズに入る予定だった。検査担当に渡す前にちょっと触ってみたところ、開発PCのWindowsXPでは動くものの、Windows2000やMeでは動作しない。試してはいないけど、たぶん98も駄目っぽい。

どうもregsvr32で登録するのに失敗しているようなので原因を調べてみると、STLを色々と使っていたためにMSVCP60.DLLを必要としていたらしい。そりゃ素のままのOSに入っているわきゃないって。さて、困った。配布サイズは小さくしないといけないから、MSVCP60.DLLを同梱するなんてのは論外。理想的なのは必要なSTLのソースを組み込んで最小限のライブラリを作ってやることなんだけど、とても今からじゃ時間が足りない。仕方ないので、泣く泣くSTLで書いた部分をMFCで書き直すことにした。std::stringはCString、std::map<std::string, std::string>はCMapStringToStringてな具合に。コンテナはそれでいいとして、関数オブジェクトやメンバ関数アダプタとかはどうすりゃいいんだ。

修正を加えてどうにかWindows2000で動くようになった。これで一安心と思いきやWindowsMeではやっぱり動かない。何だ? MSVCP60.DLLの他に不足しているDLLがあるのか。Dependency Walkerで調べると、"GlobalMemoryStatusEx"が見つからないと怒られた。あー、これってWindows2000以降でしか使えないAPIじゃん、迂闊! こういうのは"GetProcAddress"で関数ポインタとして取得して、そのOSで使えるかどうか確かめないといけないのに。同じようなAPIで"GetDiskFreeSpaceEx"はちゃんとそうやって処理してるのに、何やってるんだよ俺は。

投稿者 sai : 2003年10月07日 01:09

コメント

コメントしてください




保存しますか?