2011-02-09 3 views
1

DLLを使用すると、標準的なWindowsのエラーを取得欠落している場合、DLLを使用してEXEを実行しようとすると、多くの場合:EXEはDLLに静的な依存関係を持つことができますか?

The program can't start because XXX.dll is missing from your computer. Try reinstalling the program to fix this problem.

これはビルトインすることがEXEにあなたのコードのいずれかが呼び出される前に思えます...どのように動作し、Visual Studioでプロジェクトをビルドするときに、どのようにセットアップされますか?

編集:私の特定のシナリオで

私は実際にそれらが存在しない場合は、私のDLLを登録すると、診断するのが少し難しいとなる障害が発生したので、他のDLLの「静電気」の依存関係を持っているDLLを持っています。しかし、私はむしろたくさんあるので、これまで使用されていたDLL関数を手動でリストアップしたくないでしょう!

答えて

7

DLLにリンクするときには、暗黙のリンクと明示的なリンクの2つの方法があります。あなたが遭遇しているのは、暗黙のリンクの失敗です。

暗黙的なリンクは、PE(Portable Executable)形式を使用する実行可能イメージに含まれるインポートテーブルと呼ばれるものを通して動作します。 PEフォーマットは、インポートテーブルとエクスポートテーブルの両方を定義します。エクスポートテーブルには、DLLによってエクスポートされた関数のリストとそのエントリポイントが含まれています。インポートテーブルには、他のモジュールへの暗黙的な依存関係が含まれています。

実行可能ファイルが開始されると、ローダーはインポートテーブルを読み取り、参照されているすべてのDLLとそれらのDLL内のすべての関数をロードしようとします。 DLLが見つからない場合、DLLが正常に読み込まれなかった場合、またはDLLに参照されている関数が含まれていない場合、これは失敗する可能性があります。 DLL検索パスにローダーがXXX.dllを見つけなかったため、あなたのケースでは失敗しています。

リンカはインポートテーブルを生成します。 C++では、通常、そのDLLの.libファイルを介して行われます。

明示的なリンクは、コードでLoadLibraryGetProcAddressを呼び出してDLLとその機能をロードする場所です。通常、この方法は、異なるシステム上で実行できるアプリケーションを作成する場合に使用されます。たとえば、OSの特定のバージョンにのみ存在する特定の機能を使用することができますが、古いバージョンのOSで実行すると他の動作に低下します。

という名前の静的は、DLLへのリンクを参照するときには使用しないでください。静的リンクは、関数の実装が外部ライブラリに含まれるのではなく画像に含まれる場合です。

このトピックのMSDN articleはすべてこれを説明しています。

+0

リンクされたMSDNページでは、「静的」という用語が使用されています...とにかく短い答えは、DLLの関連する.libを追加することです.VSは暗黙的にDLLをリンクさせますか?しかし、.libを追加しないと、.hファイルで宣言されたメソッドを呼び出すので、リンカーエラーが発生します。 VS _not_にDLLを暗黙的にリンクするように指示できますが、それ以外は同じ方法で動作しますか? –

+1

@John *暗黙的なリンクのためによく使われる他の用語を列挙しているときには*静的な*という言葉があります。私の見解では、動的*リンクを記述するための* static *の使用は誤用されています。 * static load *という用語を使用する際の問題は、全く異なる静的リンク*と混同しすぎることです。 –

+0

@Johnあなたの問題は暗黙的なリンクと明示的なリンクとは関係ありません。問題は、DLLが検索パスにないことです。それを検索パスに入れる必要があります。私はそれを解決する最良の方法が何かを知らない。あなたがDLLの出所について教えてくれたら、どこに置くべきかアドバイスすることができます。 –

関連する問題