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>
