今日は少しプログラムのお話。
私は普段、CやC++は使っていません。簡単なツールはWSHやHSPでプログラムを書くことが多いからです。
しかし、DLLを作るときは話が違います。その際はCやC++用のコンパイラが必要になります。
というわけで、DLLのコンパイルには「lcc-win32」を使っているのですが、昨晩から書いていたプログラムがなぜかきちんと動作しない。
プログラム自体は合っているのに、どうしても正しい値が取れない。
似たようなことがないか、インターネットで調べまくったり、実験をしまくったりしたのですが、まったく原因は不明。
半日以上経って、ある可能性に気付きました。
「lcc-win32が古いのでは?」
その根拠となったのは、「DWORDLONG」にビットシフトをしようとしたらコンパイルエラーが出たこと。
それは「DWORDLONG」という値を正しくサポートしていない。つまり、そういった値があまり必要でない時代のコンパイラなのではないか?
というわけで、いつも使っている「lcc-win32」をダウンロードした日付を調べてみました。2001年7月10日。
これは、可能性として非常に高いなと思ったので、最新の「lcc-win32」をダウンロードしてみることにしました。
□lcc-win32
http://www.cs.virginia.edu/~lcc-win32/ 最新版をインストールしたら、なぜか「wedit.exe」が起動しない。えー、どういうわけですか(泣
仕方がないので、古い「wedit.exe」を探そうと思い、QSS Productsというページに飛んでみる。
□QSS Products - lcc-win32
http://www.q-software-solutions.de/products/lcc-win32/ 「Dec 2005 Wedit」を試してみるが、やっぱり起動しない。さらに「Nov 2005 Wedit」を試してみたら起動した。
やった。
これで改めてコンパイルしたら、無事にコンパイルできて問題が解決しました。
よかったです。
さて、何がしたかったかというと、メモリー量を取得す「GlobalMemoryStatus」と「GlobalMemoryStatusEx」の分岐処理を実装したかったわけです。
「GetProcAddress」で、「GlobalMemoryStatusEx」があればこちらを使うという分岐処理。
「MEMORYSTATUSEX」構造体が「DWORDLONG」を使っているので、古いコンパイラで正しくコンパイルできなかったようです。
こんな理由で無駄な時間を。
「めもりーくりーなー」を大容量メモリー(2GB超)のマシンで使っている人もいるようなので、この処理が必要だったわけです。
最近問い合わせが多いので。
問題は、私自身が大容量メモリーのマシンを持っていないので、2GB超でもきちんと動くかは確認できないことですが。理論上は大丈夫なはずなのですが。
でもまあ、うまくコンパイルできたのでよかったです。