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