これで、ダイナミック リンク ライブラリを静的ロード (必要なヘッダーを含め、#pragma コメント (lib、"xxx") を使用) および動的ロード (関数 LoadLibrary または LoadLibraryEx を使用) でロードできるようになりました。
一部の企業は、インタビューで Dynamic-Link ライブラリをロードする他の方法を尋ねています。
しかし、Dynamic-Link Libraries をロードする他の方法があるのだろうか?
これで、ダイナミック リンク ライブラリを静的ロード (必要なヘッダーを含め、#pragma コメント (lib、"xxx") を使用) および動的ロード (関数 LoadLibrary または LoadLibraryEx を使用) でロードできるようになりました。
一部の企業は、インタビューで Dynamic-Link ライブラリをロードする他の方法を尋ねています。
しかし、Dynamic-Link Libraries をロードする他の方法があるのだろうか?
あなたの質問には用語の混乱があります。DLL は「ダイナミックリンク ライブラリ」の略です。名前が示すように、常に動的にロードされます。静的にロードすることはできません。「静的」という用語は通常、静的ライブラリ、つまりまったく DLL ではないライブラリに関連して使用されます。
DLL は関数を使用して明示的にロードするか(「実行時リンク」または「手動リンク」と呼ばれることもあります)、またはいわゆるインポート ライブラリをプログラムにリンクし、従来の方法で関数を宣言することによって暗黙的に (「ロード時リンク」と呼ばれることもあります)、ロードすることができます。 」または「自動リンク」)。後者の方法には、 pre-loadとdelay-loadの2 種類があります。プリロードされた DLL は、プログラムの開始時に即座に無条件にロードされます。遅延ロードされた DLL は、最初に使用されたときにロードされます。LoadLibrary
GetProcAddress
したがって、この用語では、DLL をロードする主な方法はまだ 2 つしかありません。明示的と暗黙的です。後者の load メソッドには、たまたま 2 つの亜種があります。一部の人々は、この階層的な分類をフラットなものとして解釈することを好むかもしれません。最終的には 3 つのリンク/ロード方法になります。
ところで、暗黙的なリンクは、インポート ライブラリをプログラムにリンクすることによって実現されます。「ヘッダーを含める」だけではそれはできません。
「ロード」という用語は少しあいまいです。DLL が「ロード」されることはありません。「動的に読み込まれるライブラリ」という用語は、16 ビット Windows 時代のものです。現在、DLL の内容は、ページングを使用してメモリにマップされています。したがって、読み込みによって内容をメモリにコピーすることを意味する場合は、DLL を直接読み取ることで「読み込み」することもできます。
関数を呼び出すことを意味している場合は、DLL を「ロードせずに」実行することもできますrundll32.exe
。
LoadLibrary
もちろん、DLL の PE 構造を分析し、DllMain()
そのエクスポート テーブルを呼び出してスキャンすることにより、関数ポインターを初期化することで、いつでも何をするかを模倣できます。
もう1つの方法は、それらを遅延ロードすることです。これは静的リンクのようなものですが、実際にそこにある関数を呼び出すまでdllはロードされません