DLL(MSJAVA.dll)の依存関係でエラー


WindowsXP/VisualStudio2008環境で作成したソフト(EXE/DLL)を
Windows2003Server環境で動作させようとした場合、
エラーとなり起動しません。

ツールDependencyWalkerにて調査したところ、
作成したDLLの依存関係に問題があるようでした。

①Windows2003サーバーでの依存関係
自作DLL → ~中略~ → MSHTML.dll → MSJAVA.dll
===> MSJAVA.dllがPC内に存在しないため、エラーとなる。

②WindowsXPでの依存関係
自作DLL → ~中略~ → MSHTML.dll
===> PC内にMSHTML.dllは存在しないが、そもそもMSHTML.dllからMSJAVA.dllが
コールされていないため、問題ない。

ちなみに①のMSHTML.dllのバージョンは、6.0.3790.1830
②のMSHTML.dllのバージョンは、8.0.6001.19120でした。

回避策をご教授ください。

回答の条件
  • URL必須
  • 1人3回まで
  • 13歳以上
  • 登録:2011/09/11 13:48:10
  • 終了:2011/09/13 09:16:38

ベストアンサー

id:cx20 No.3

cx20回答回数606ベストアンサー獲得回数1072011/09/13 02:03:14

ポイント198pt

Dependency Walker の表示結果で、対象モジュールの直近の依存関係(ツリーのルート直下)に「?」マークがあるようであれば、先に、それについて調査してください。

例えば「MSVCRxx.dll」のようなファイルが「?」マークで表示される場合は、VC++ のランタイムが無いケースが考えられます。

■ 再配布する DLL の決定

http://msdn.microsoft.com/ja-jp/library/8kche8ah(VS.90).aspx

■ ダウンロード詳細 Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)

http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2

また、「?」マークがついていても、エラーにならないケースもあります。

注意深く見ると「?」マークの左に「砂時計」のアイコンが表示されているものがあるかと思いますが、これは、DLL の遅延ロード(Delay Load)を表しているものになります。

■ リンカーによる DLL の遅延読み込み

http://msdn.microsoft.com/ja-jp/library/151kt790.aspx

この遅延ロードの指定がある場合は、実際に、DLL 内の関数が呼ばれたタイミングで、ロードされる為、その関数が使われていなければ、DLL 自体、ロードされません。


恐らく、MSJAVA.DLL も「砂時計」マークがついているのでは?と思います。

Dependency Walker の FAQ にも MSJAVA.DLL が黄色く表示されるが無視できると記載されているので、無視して構わないかと思います。

■ Dependency Walker Frequently Asked Questions (FAQ)

http://www.dependencywalker.com/faq.html

(残念ながら、2011.9.13 現在では、サイトが表示できないようです。)

その他の回答(2件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/09/11 13:56:54

ポイント1pt

MSHTML.dllを使用しないようにして コンパイルすればいいかと思います。

MSHTML.dll自体は なくても動くようなので、不要なものです。

それを参照しないようにすればいいのでは ないでしょうか?


http://support.microsoft.com/kb/917425/ja

id:Jupiter2100 No.2

じゅぴたー回答回数444ベストアンサー獲得回数742011/09/11 17:03:00

ポイント1pt

プログラムの概要が分からないのですが、IEを操作するためにMicrosoft.mshtml.dllを利用しているのでしょうか? だとすると、Officeがインストールされている必要があります。(WindowsXP側にはOfficeがインストールされているのではありませんか?)


回避策としては、Microsoft.mshtml.dllの代わりに Type.InvokeMemberメソッドを利用して操作する方法に変更してはどうでしょう。

http://d.hatena.ne.jp/mikihiro/20110717/p1

id:cx20 No.3

cx20回答回数606ベストアンサー獲得回数1072011/09/13 02:03:14ここでベストアンサー

ポイント198pt

Dependency Walker の表示結果で、対象モジュールの直近の依存関係(ツリーのルート直下)に「?」マークがあるようであれば、先に、それについて調査してください。

例えば「MSVCRxx.dll」のようなファイルが「?」マークで表示される場合は、VC++ のランタイムが無いケースが考えられます。

■ 再配布する DLL の決定

http://msdn.microsoft.com/ja-jp/library/8kche8ah(VS.90).aspx

■ ダウンロード詳細 Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)

http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2

また、「?」マークがついていても、エラーにならないケースもあります。

注意深く見ると「?」マークの左に「砂時計」のアイコンが表示されているものがあるかと思いますが、これは、DLL の遅延ロード(Delay Load)を表しているものになります。

■ リンカーによる DLL の遅延読み込み

http://msdn.microsoft.com/ja-jp/library/151kt790.aspx

この遅延ロードの指定がある場合は、実際に、DLL 内の関数が呼ばれたタイミングで、ロードされる為、その関数が使われていなければ、DLL 自体、ロードされません。


恐らく、MSJAVA.DLL も「砂時計」マークがついているのでは?と思います。

Dependency Walker の FAQ にも MSJAVA.DLL が黄色く表示されるが無視できると記載されているので、無視して構わないかと思います。

■ Dependency Walker Frequently Asked Questions (FAQ)

http://www.dependencywalker.com/faq.html

(残念ながら、2011.9.13 現在では、サイトが表示できないようです。)

  • id:cx20
    Visual Studio 2008 で作成されたソフトとのことですが、
    DLL は Microsoft Visual C++ 2008 で作成されたものでしょうか?

    なんとなくですが、MSJAVA.dll が直接的な原因ではなく、
    VC++ のランタイムが無いために、エラーになっているような気がします。
    (MSJAVA.DLL 以外に依存関係のエラーが無いか確認してみてください。msvcr90.dll などがエラーになっているようであれば、VC++ のランタイムが無い為のエラーになります。)

    <参考情報>
    ■ VS2005 VC++ で WIN32プロジェクトで作成したDLL の MSVCR80D.DLLがスタティックリンクできません。
    http://social.msdn.microsoft.com/Forums/ja/vcgeneralja/thread/e1cefe9c-1578-4ac8-a5f9-bd2844a6f6e3
    ■ 再配布する DLL の決定
    http://msdn.microsoft.com/ja-jp/library/8kche8ah(VS.90).aspx
    ■ ダウンロード詳細 Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
    http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2
  • id:ID0102
    カイザ- 2011/09/11 19:44:38
    ↑と同じ
  • id:tomato_bank
    cx20さんの回答を参考に解決できました。

    cx20さん>>
    差し支えなければ、回答欄にコメント頂けないでしょうか?
    ポイントを差し上げたいのですが。。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません