| 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> |