条件は次のとおりです。
1) ロードされるバイナリは DLL としてコンパイルされました (gcc/ld を使用--shared
する場合、オプションを使用することを意味します。使用する場合--shared
、結果のファイルは dll になり、実行されません。以下を参照してください)。
2)IMAGE_FILE_DLL
ロードされるバイナリ ファイルの PE ファイル ヘッダーに設定されます。設定されている場合、ファイルは dll であり、Windows リンカーは、このファイルをプログラムにリンクするときにその関数を呼び出します (実行時またはコンパイル時DllMain()
のリンク方法は関係ありません)。そのためには、ファイルも (1) を満たす必要があります。ただし、このフラグを使用すると、ロードされるバイナリ ファイルは実行できなくなります。が設定されていない場合、ファイルがプログラムにロードされたときに呼び出されません。LoadLibrary()
-llibraryname
IMAGE_FILE_DLL
DllMain()
dll をコンパイルしてヘッダーから--shared
手動で削除するIMAGE_FILE_DLL
(つまり、16 進エディターを使用する) ことはできません。実行すると、DllMain()
実行されるだけで、fdwReason
定義されていない数値になります (0x28ffd4
私のマシンでは)。
アップデート
Windows 上のすべての DLL および EXE ファイルは PE ファイルです。違いは、リンク方法と、ヘッダーに設定されているフラグです。それが私が書く理由file being loaded
であり、ではありませんdll being loaded
。
最後の段落では、ファイルを dll としてコンパイルし、ヘッダーを変更して exe に変換するシナリオについても説明しています。うまくいきません。
命名はそれとは何の関係もありません (任意の名前を選択できます。いくつかのpexports
+dlltool
いじくり回しで、.exe ファイルのインポート ライブラリを作成し、それを次のようにリンクできます。-lexenamewithoutextension
明確にするために:
- なしでコンパイルした場合
--shared
:
IMAGE_FILE_DLL
設定されず、実行可能になりますが、リンク時に DllMain() は呼び出されません。
- でコンパイルした場合
--shared
:
IMAGE_FILE_DLL
その中に設定され、実行可能ではありませんが、リンクすると DllMain() が呼び出されます。
- なしでコンパイルする場合は、フラグを手動で
--shared
オンにします。IMAGE_FILE_DLL
- もう実行できなくなり、リンクしても DllMain() は呼び出されません。
- でコンパイルする場合は、フラグを手動で
--shared
オフにします。IMAGE_FILE_DLL
- 実行可能になりますが、main() の代わりに DllMain() が実行され、リンク時に DllMain() は呼び出されません。