| This document describes some points you should know when you are going to |
| implement the internal counterparts to external DLL's. Only 32 bit DLL's |
| are considered. |
| |
| 1. The LibMain function |
| ----------------------- |
| These are the way to do some initialising when a process or thread is attached |
| to the dll. The function name is taken from a *.spec file line: |
| |
| init YourFunctionName |
| |
| the 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 build-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 and you the internal DLL. |
| When you -as example- fill a iconlist placed in the internal DLL the |
| application wont get the icons from the external DLL. |
| |
| To go around this you have to call the functions over pointer. |
| |
| /* 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> |