2014年3月22日土曜日

Windows2008ServerでVC++6.0で作成したプログラムを動かす


Windows2003ServerからWindows2008R2へのサーバリプレース作業がありました。
DBもSQLServer2000からSQLServer2008へアップグレード。

このWindows2003サーバ本来持っている機能は作成しなおしここまでは問題なく作業終了。

ところが現地で問題が発覚
本来、別サーバで動いているべきアプリがいつの間にかリプレース対象のサーバで動いていたことが発覚!
当然、仕様落ちだし作業範囲外。とは、言ってもその動いていたアプリをWindows2008で動かさねば。


このアプリVC6.0++ で作成されていてすんなり動くことはなく多々、問題がありそう。

機能
コンソールアプリで通信を行い受信したデータを別サーバのDBへ書き込む。
書き込む先はWindows2000サーバでDB接続はODBC。
実行ファイルの他にdllが2つある。


問題となりそうなところ

1.64bitOSで32bitで作成されたアプリが動くのか?
  
2.DLLが動作するのか?

3.ODBC接続でうまく接続できるのか?


早々に対応しないといけないのでVMにWindows2008R2の試用版を入れて動作確認。

まず、アプリをそのままコピーして起動してみる。
起動した時点で、DLLが見つかりませんとメッセージが表示される。
そのためDLLを”Windows\System32”へコピーしてみるが状況は変わらず。
次に別に作成した”c:\work”へコピーし環境変数のPATHにこのフォルダを追加して実行すると起動は出来る。

PATHを追加しなくても動作出来ないのか調べたところ、WOW64で32Bit 版のアプリを検出すると、CPUを32bitプログラムが動く「Compatibility Mode」に変更するそうで、その際参照するシステムフォルダは”Windows\SysWOW64”になるとのこと。
それならと、DLLをコピーしてみる。(当然System32、PATHは元に戻して)
実行すると何とか起動が出来るようになった。

さすがにマイクロソフトも考えてくれて傷んだね。

これで1,2の問題は解決出来そう。

次が3.のODBC接続。
現地と同じようにODBC接続を設定する。
ODBC設定の動作確認で接続完了まで行っているので設定自体は問題無いと思うが残念ながらアプリはエラーメッセージを吐き出し接続できない。
こちらも調べてみると32Bit版のODBC接続を設定すれば良いそうです。
32bit版のODBC設定画面は”Windows\SysWOW64\odbcad32.exe”を起動して同じ設定にすれば良いらしい。
設定後再起動すると確かにDBへ接続できている様子。
通信用のデータを流してDBへ書き込むところまでひと通り確認できた。
※但しこの時点で接続しているDBはWindowsXP+SQLServer2005で現地とは異なる


ODBCドライバの説明で下位のSQLServerへの互換性は保証しているなんて記載を見つける。
裏切られることの多いマイクロソフトを信じて現地のサーバへセットアップに。

嬉しいことに一発でうまく行きました。


まとめ、Windows7、Windows2008R2など64bitOSで32bit版を動作させるにはSysWOW64を使用すればうまく行きます。