最近すこし嵌ったこと
ミッション:よそのチームが管理している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のイベントビューアーが役に立つことがある