DLL - 遅延ロード&ダイナミックローディング

 

 


パーフェクト:https://www.codeproject.com/Articles/6299/Step-by-Step-Calling-C-DLLs-from-VC-and-VB-Part-4


ダイナミックロード

あなたはDLLにリンクする場合、通常は、LIBファイルを経由して(例えば、MFCのDLL)、アプリケーションの起動時にDLLがロードされますロードのこの種は、と呼ばれる暗黙のリンクので、システムはすべてあなたがしなければならないとのリンクである-あなたのためのDLL読み込みの世話をするLIBファイル。

動的ロード又称動的リンク、明示リンク。

動的ローディング(別名動的リンク)手段そのアプリケーションをロードしますが、DLL内の関数を呼び出す直前にDLL動的ロードのために、あなたはないではない LIBファイルを使用します代わりに、何をやっていることは(Win32 API関数のペアを呼んでLoadLibrary/ GetProcAddress)そのロードDLL、その後、DLL内の関数のアドレスを取得します。あなたが明示的にこれらのAPIを呼び出すので、荷重のこの種とも呼ばれ、明示的なリンク

要約する:

  • 暗黙のリンク -ときにアプリが始まるDLLが自動的にロードされます
  • 明示リンク -あなたは、負荷のDLLにコードを書きます


使用する理由動的ロード?

:私は、動的にロードするDLLの詳細に入る前に、私は最初の質問に答える聞かせてそれが動的にDLLをロードすることが望ましいですか?ここでは一般的なシナリオは以下のとおりです。

  1. あなたはとのリンクへのlibファイルを持っていない -これはかなりラメの理由で、あなたはそれで働いていた場合は、LIBファイルを生成する可能性があるため。全体的に、しかし、LIBファイルを生成するだけで使用するよりも、おそらくより多くの仕事であるLoadLibrary/ GetProcAddress動的にDLLをロードすること。
  2. A DLLは常に存在しないかもしれない -あなたには、いくつかの優雅なプログラムの劣化を提供したい場合は、動的またはターゲット・マシン上に存在してもしなくてもよい任意のDLLをロードしなければなりません(例:UXTHEME.DLL、XPでのみ存在します)。あなたが暗黙のリンクを使用した場合、アプリケーションが正常に低下する機会を持っていることはない-システムは、単にあなたのアプリを起動することができないだろう、との代わりに、ユーザーにいくつかの驚くべきメッセージが表示されます。
  3. あなたは、複数の機能セットをサポートする必要がある -これは動的ロードを使用するための歴史的に正当な理由の一つです。あなたがその製品サポート多くの異なる特徴を持っている、とあなたは顧客がために支払われたことを特徴のみをロードしたい場合は、何をやっていることは、自身のDLL内の各機能セットをパッケージ化し、顧客へのDLLを出荷しているとき、彼受注それ。基本的に、それはオープンエンド作り、お使いの製品に:これはまた、(プラグインを読んで)新しい機能を追加するための非常に便利な方法です。
  4. あなたは、複数のプラットフォームをサポートする必要があり、これはまた、動的ロードを使用したため、歴史的に正当な理由の一つであります- 。あなたは、複数のプラットフォーム(Win98の、Win2000の、WinXPの)をサポートする必要があり、各プラットフォームは、いくつかの理由で、わずかに異なるコードが必要です。簡単な解決策は、独自のDLL内の各プラットフォーム用のコードを分離することです。
  5. あなたはそれがあなたのアプリケーションをロードするのにかかる時間を短縮する必要がある -これは動的ロードを使用するためのもう一つの歴史的な理由です。あなたはこれについて考え始めるだろう、お客様がお使いのアプリが負荷にあるスローどのように文句を開始するときアイデアはのDLLは、コアUIを表示するために必要なものを特定し、動的にアプリニーズことを他のすべてのDLLをロードすることです。

遅延ロード

あなたは細心の注意を払っていた場合、私は用語を使用していますなぜ、あなたは「歴史的な」今では不思議に思われるでしょう。あなたが以外の動的ロードを実装するために、より現代的な方法があると思うならLoadLibrary/ GetProcAddress技術は、あなたが正しいです。シナリオ上記4と5では、あなたはと呼ばれる技術を使用することができるかもしれ遅延ロード非常に少ない作業で、効率的にアプリケーション内の動的ロード機能を実装することを。

OK、その遅延ロードは何ですか?これは、Visual C ++®新によって実装されている6.0で導入された新機能である/のDELAYLOADのリンカオプション遅延ロードについての興味深いところは、任意のオペレーティングシステムのサポートに依存しないということです-あなたは後でVC 6または下の遅延ロードを使用してアプリケーションをリンクしたら、それはどんな上で動作しますのWindows OS。VC ++ 6リンカが実際にコードを生成するためです(以前のMSリンカーは、これまで前にコードを生成していませんでした)。あなたが遅延ロードを使用すると、あなたのVC ++アプリケーションは、単にVBアプリケーションのように動作します- あなたは、その機能の一つに電話をかけるまでは遅延がロードされるように指定したDLLが読み込まれません(個人的に、私はマイクロソフトでは、この「ジャストでタイムロード」呼び出さないでトリックを逃したと思います)。実際には、何をするだろうことは、いくつかの条件をテストして、条件に応じて、いくつかのコードを実行します:

IF(IsWinXP())
    DisplaySpiffyXPThemedUI(); 
    DisplayBoringUI();

内部はDisplaySpiffyXPThemedUI()、あなたはで関数を呼び出すために安全である知っているUXTHEME.DLLあなたはすでにあなたがXP上で実行していることを確認しましたので、。最初UXTHEME.DLLの呼び出すこと関数が原因となりますUXTHEME.DLLはリンカが生成したスタブによってロードされます。

きちんとした事は、すべてこれは透過的に行われていることです。あなたは(もちろん、あなたが確認することを確認する必要があり、除いて遅延ロードを使用するすべての任意のコードを変更する必要はありませんUXTHEME.DLLは、その機能を呼び出すしようとする前に、マシン上に存在しています)。

注意:

遅延ロードとダイナミックロードの間に1つの違いがあります:

遅延読み込みと、あなたはまだへのリンクに必要なの.LIB、ファイルリンカは遅延ローディングスタブを作成するために、この情報を必要とするため。

 

 

動的ロードの使用

動的ロードを達成するための一般的な手順。窓は使用する必要がありGetProcAddress()、その中に配置された関数アドレスDLLから関数を。

以下の通りであるハンス・ディートリッヒは、この記事にまとめる。さらに、プラグイン提供carsim会社非現実engine4をcarsim DLLを使用する場合(動的にロードするためのコードを使用https://www.unrealengine.com/marketplace/en -US /製品/ CarSimな車両ダイナミクス)と同じ手順に従います。

使用GetProcAddress()DLL内の関数のアドレスを取得します。ここでの手順は以下のとおりです。

  1. ライブラリをロードします。
    CXLoadLibrary LIB; 
    (!lib.LoadLibrary(_T( "DLL3.dll")))であれば
        リターン。
    
  2. 定義typedefの使用を注意してください- DLL内の関数のために__stdcall
    void *型のtypedef(__stdcall * CreateFn)();
    
  3. 関数のアドレスを取得します。
    CreateFn pfnCreate = 
        (CreateFn)のGetProcAddress((HINSTANCE)LIB、_T( "CreateDll3"));
    
  4. 経由して関数を呼び出しtypedef「D変数:
    void *型をObjPtr = pfnCreate();
    

警告:この記事で紹介した例は、エラーチェックにskimpedています。使用している場合GetProcAddress()、あなたはしなければならないリターンアドレスを確認してください!

 

参考:

https://www.codeproject.com/Articles/6299/Step-by-Step-Calling-C-DLLs-from-VC-and-VB-Part-4

 

公開された341元記事 87ウォンの賞賛 ビュー220 000 +

おすすめ

転載: blog.csdn.net/qq_35865125/article/details/104334803