创建D L L常常比创建应用程序更容易,因为D L L一般只包含独立存在的函数,这些函数可以很容易的被其他的应用程序所调用
。D L L中通常不支持消息循环的处理或者窗口的创建。
D L L只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个D L L将要调用的一组函数。当所有源代码文件编
译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个D L L来说,你必须设定linker程序的/ D L L开关。
这个开关使得链接程序能够向产生的D L L文件映像插入一些dll相关标识的信息,这样,操作系统加载程序就能将该文件映像视为一
个D L L而不是应用程序。
在应用程序(或另一个D L L)能够调用D L L中的函数之前,D L L文件映像必须被映射到调用进程的地址空间中。若要进行这
项操作,可以使用两种方法中的一种,即加载时的隐含链接(编译期加载)或运行期的显式链接(运行期加载)。编译期加载和运行期
加载都很有用处。
一旦D L L的文件映像被映射到调用进程的地址空间中, D L L的函数就可以供进程中运行的所有线程使用。实际上, D L L几
乎将丢失掉它作为D L L的全部特征。 对于进程中的线程来说,D L L的代码和数据看上去就像恰巧是在进程的地址空间中的额外代
码和数据一样。此时DLL可以退化为它可以导出的函数集合了。
当一个线程调用D L L函数时,该D L L函数使用的是线程的堆栈,参数的传递,任何局部变量的产生,使用的都是线程的堆栈。
DLL没有他自己的堆栈,切忌!!
此外, D L L中函数的代码创建的任何对象均由调用线程所拥有,而D L L本身从来不拥有任何东西。