|  | This document describes some points you should know before implementing | 
|  | the internal counterparts to external DLL's. Only 32  bit DLL's | 
|  | are considered. | 
|  |  | 
|  | 1. The LibMain function | 
|  | ----------------------- | 
|  | This is the way to do some initializing when a process or thread is attached | 
|  | to the dll. The function name is taken from a *.spec file line: | 
|  |  | 
|  | init    YourFunctionName | 
|  |  | 
|  | then, you have to implement the function: | 
|  |  | 
|  |  | 
|  | BOOL32 WINAPI YourLibMain(HINSTANCE32 hinstDLL, | 
|  | DWORD fdwReason, LPVOID lpvReserved) | 
|  | { if (fdwReason==DLL_PROCESS_ATTACH) | 
|  | { ... | 
|  | } | 
|  | .... | 
|  | } | 
|  |  | 
|  |  | 
|  | 2. Using functions from other built-in DLL's | 
|  | -------------------------------------------- | 
|  | The problem here is, that you can't know if you have to call the function from | 
|  | the internal or the external DLL. If you just call the function you will get | 
|  | the internal implementation. If the external DLL is loaded the executed program | 
|  | will use the external DLL and you the internal one. | 
|  | When you -as an example- fill an iconlist placed in the internal DLL the | 
|  | application won't get the icons from the external DLL. | 
|  |  | 
|  | To work around this, you should always use a pointer to call such functions: | 
|  |  | 
|  | /* definition of the pointer type*/ | 
|  | void (CALLBACK* pDLLInitComctl)(); | 
|  |  | 
|  | /* getting the function address  this should be done in the | 
|  | LibMain function when called with DLL_PROCESS_ATTACH*/ | 
|  |  | 
|  | BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, | 
|  | LPVOID lpvReserved) | 
|  | { HINSTANCE32 hComctl32; | 
|  | if (fdwReason==DLL_PROCESS_ATTACH) | 
|  | { /* load the external / internal DLL*/ | 
|  | hComctl32 = LoadLibrary32A("COMCTL32.DLL"); | 
|  | if (hComctl32) | 
|  | { /* get the function pointer */ | 
|  | pDLLInitComctl=GetProcAddress32(hComctl32,"InitCommonControlsEx"); | 
|  |  | 
|  | /* check it */ | 
|  | if (pDLLInitComctl) | 
|  | { /* use it */ | 
|  | pDLLInitComctl(); | 
|  | } | 
|  |  | 
|  | /* free the DLL / decrease the ref count */ | 
|  | FreeLibrary32(hComctl32); | 
|  | } | 
|  | else | 
|  | { /* do some panic*/ | 
|  | ERR(shell,"P A N I C error getting functionpointers\n"); | 
|  | exit (1); | 
|  | } | 
|  | } | 
|  | .... | 
|  |  | 
|  | 3. Getting resources from a *.rc file linked to the DLL | 
|  | ------------------------------------------------------- | 
|  | < If you know how, write some lines> | 
|  |  | 
|  |  | 
|  |  | 
|  | ---------- | 
|  | <juergen.schmied@metronet.de> |