It's so clear that there are three type dlls: regular dll, extension dll and non-MFC dll on windows. Below table from MSDN shows how to initialize it:
Typically, your DLL has initialization code (such as allocating memory) that must execute when your DLL loads. When using Visual C++, where you add code to initialize your DLL depends on the type of DLL you are building. If you do not need to add initialization or termination code, there is nothing special you have to do when building your DLL. If you need to initialize your DLL, the following table describes where to add your code.
DLL type | Where to add initialization and termination code |
---|---|
Regular DLL | In the DLL's CWinApp object's InitInstance and ExitInstance. |
Extension DLL | In the DllMain function generated by the MFC DLL Wizard. |
Non-MFC DLL | In a function called DllMain that you provide. |
In Win32, all DLLs might contain an optional entry-point function (usually called DllMain) that is called for both initialization and termination. This gives you an opportunity to allocate or release additional resources as needed. Windows calls the entry-point function in four situations: process attach, process detach, thread attach, and thread detach.
The C run-time library provides an entry-point function called _DllMainCRTStartup, and it calls DllMain. Depending on the type of DLL, you should have a function called DllMain in your source code or you should use the DllMain provided in the MFC library.
A. Key Points Of Initialization Of Extension dll
1. For DLL_PROCESS_ATTACH: it must call AfxInitExtensionModule(). You should check the return value of AfxInitExtensionModule; if a zero value is returned from AfxInitExtensionModule, return zero from your DllMain function. And Creating a new CDynLinkLibrary object during initialization allows the extension DLL to export CRuntimeClass objects or resources to the client application.
2. For DLL_PROCESS_DETACH: AfxTermExtensionModule is not must to be called. Only If your extension DLL will be explicitly linked to an executable (meaning the executable calls AfxLoadLibrary to link to the DLL), you should add a call to AfxTermExtensionModule. This function allows MFC to clean up the extension DLL when each process detaches from the extension DLL (which happens when the process exits or when the DLL is unloaded as a result of a AfxFreeLibrary call). If your extension DLL will be linked implicitly to the application, the call to AfxTermExtensionModule is not necessary.