VC++ソフトは実行環境の確認が大切!

最近すこし嵌ったこと

 

 

ミッション:よそのチームが管理しているVC++で作成されたDLLの動作を調査する

 

前提:

 ・私のPCにはVisualStudio2010、2012がインストールされている

 ・これまでの開発でバージョンに起因する問題は発生していない

 ・DLLのソースコードは一部しかなく、自分でビルドすることはできない

 ・DLLは動的呼び出しをすることになっていて、呼び出すだけのテストプログラムは作成済み

 ・そのDLLは他メンバーのPC上では呼び出せているので、あとは入出力パスなどの環境を整えるだけのハズ

 

 

事件:

 私のPCではなぜかDLLの動的読み込みに失敗 

 DLLはバージョン違い(A.dll、B.dll)があり、B.dllは読めたが、A.dllが読み込めない 

 さらに、VM上のテスト環境で実行すると、両方とも読み込めない

 メインの調査対象はB.dllなので一応動作確認を進められるが、最新のテストデータを入力すると正常動作しない

 

調査:

 自分のVisualStudio2012で簡単なIFでDLLを作成し同じように呼び出してみると、やっぱりVMでは失敗する

 VMには開発環境が入っていないので、それが開発環境に付随するコンポーネントが足りないと推測

 

 google先生にDLLが足りないならDependency Walkerを使いなさいと教えてもらったので使ってみる

 なんかエラーがあると表示しているが、使い慣れないツールは見方がさっぱりわからず、、、

 

 ここで、VM上のWindowsのイベントログを確認(Windowsメニューからアクセサリのイベントビューアーを選択)

 B.dll呼び出し時に発生したエラーとして、MSVC?80?.dllが無いというエラー発見!!

 

 調べてみると、どうやらVC++2005でビルドしたC++アプリ用のコンポーネントらしい

 というわけで、VC++2005再配布可能パッケージというものを探す

 x86/x64用があるのはまだわかるが、さらにSP1用まであったりして、とりあえず片端からインストール

 

 ここまででやっとVM側でもB.dllが読める状態になったけど、やっぱりA.dllは読み込めない

 次にA.dll呼び出し時のイベントログを確認

 足りないのは?????.Debug.dllだそうな

 

 つまりA.dllはデバッグビルドなので、再配布可能パッケージではなく開発環境そのものがなければ実行できない 

 自分のPCには開発用にいろいろインストールしていて、認識しないままVC++2005再配布可能パッケージも

 含まれていたけど、VC++2005の開発環境ではないので、A.dllが読み込めなかった

 他メンバーはたまたま別件でVC++2005の開発環境をインストールしていて読み込めていたというわけ

おまけ:

 結局B.dllは読み込めることが確認できたけど、特定のバージョンのテストデータでないと動作しない

 つまり最新のテストデータ用のDLLが別途必要なのでは?

 というわけで、最新のバージョンのDLL(C.dll)をもらってやっと動作確認できる状態になりました

 

考察:

 さんざんVisualStudioで開発してきたが、あまり実行環境を意識していなかったことを反省

 これがEXEや静的呼び出しのDLLなら、起動エラーダイアログが出るのでこの問題にはすぐ気づいたはず

 ⇒★なんかよくわからない異常が発生したときは、Windowsのイベントビューアーが役に立つことがある