C ++でのWinMain、mainとDllMainの違い
-
03-07-2019 - |
質問
3つの関数の違いとそれらをいつ使用するか?
解決
WinMainは、プロセスの開始を示すためにアプリケーション(.exeで終わる)に使用されます。プロセスのコマンドライン引数を提供し、プロセスのユーザーコードエントリポイントとして機能します。 WinMain(またはmainの別のバージョン)も必要な機能です。 OSには、実行中のプロセスを開始するために呼び出す関数が必要です。
DllMainはDLLに使用され、さまざまなシナリオを示します。最も顕著なのは、次の場合に呼び出されます
- DLLはプロセスにロードされます:DLL_PROCESS_ATTACH
- DLLはプロセスからアンロードされます:DLL_PROCESS_DETACH
- プロセスでスレッドが開始されます:DLL_THREAD_ATTACH
- プロセスでスレッドが終了しました:DLL_THREAD_DETACH
DllMainはオプションの構成体であり、多くの暗黙のコントラクトが関連付けられています。たとえば、別のDLLを強制的にロードするコードを呼び出すべきではありません。一般に、正しく機能するのはかなり難しい機能であり、非常に特別な必要がない限り、避けるべきです。
他のヒント
main()は、プログラムがコンソールアプリケーションであることを意味します。
WinMain()は、プログラムが GUIアプリケーション- -つまり、コンソールを表示する代わりにウィンドウとダイアログボックスを表示します。
DllMain()は、プログラムが DLL であることを意味します。 DLLは直接実行できませんが、上記の2種類のアプリケーションで使用されます。
したがって:
- ウィンドウなどを表示するプログラムを作成するときは、WinMainを使用します。
- DLLの作成時にDLLMainを使用します。
- 他のすべての場合にmainを使用します。
[質問への補遺]
また、DllEntryPointを忘れないでください:
-
読み込み時間が関係する場合、エントリポイントはDllMainです。
(例:COMインプロセスサーバーDLL)。 -
実行時間が関係する場合、エントリポイントはDllEntryPointです。
(例:LoadLibraryが呼び出されます)。