TClock Light を Visual C++ 2005 でコンパイルしてみるの巻

しばらく改造から遠ざかってたのでそれを追っかける意味でもトライしてみた。

ポイントは以下の通り。

  • NODEFAULTLIB を切って CRT がリンクされるようにする。
  • dll/tcdll.mak で COPT に /D_CRT_NON_CONFORMING_SWPRINTFS を定義。
    • システム情報の表示を組み込んでいると swprintf の所で warning が出る。無視して tclock.exe を起動すると explorer を巻き込んで落ちる。どうやら VC2005 から swprintf が ISO 準拠になったためパラメータが追加されたらしい。ソースの関数パラメータを修正してもいいんだけどそうすると過去の VC でコンパイルできなくなるのでこのシンボルを定義した。
  • すべての mak ファイルで COPT に /D_CRT_NO_SECURE_WARNINGS を定義。
    • これはセキュアでない CRT 関数を使っていると出る。これもソースを変更せずに warning を揉み消す方向で。

これでとりあえずコンパイルは通るようになった。次はシステム情報の表示で PC の搭載メモリが 2GB を超えると使用可能メモリ量が正しく表示されなくなるというもの。

これは dll/sysinfo.c の GlobalMemoryStatus を呼び出している所を Windows 2000 以降なら GlobalMemoryStatusEx を呼び出すようにすればよい。ただそのまま GlobalMemoryStatusEx を呼び出すと Windows 2000 以前の OS で TClock が起動できなくなるかもしれない(未確認)ので GetModuleHandle("kernel32")/GetProcAddress を使って動的に呼び出した方がいいかもしれない。

まぁざっとこんな感じでとりあえず使えるようになった。使用可能メモリ量の表示はバグと気づかなかったぐらいで初めにこの問題を解決してくれた tclock-071230-analog 版の id:egggarden 氏とそれを TClock Light に移植してくれた TClock Light- の slic 氏には感謝したい。