Windows API 中的所有函数都包含在D L L中:
K e r n e l 3 2 . d l l,它包含用于管理内存、进程和线程的各个函数;
U s e r 3 2 . d l l,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;
G D I 3 2 . d l l,它包含用于画图和显示文本的各个函数。
A d v A P I 3 2 . d l l包含用于实现对象安全性、注册表操作和事件记录的函数;
C o m D l g 3 2 . d l l包含常用对话框(如File Open和File Save);
C o m C t l 3 2 . D L L则支持所有的常用窗口控件。
使用DLL的优点:
• 它们扩展了应用程序的特性。由于D L L能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。例如,当一家公司开发了一种产品,想要让其他公司改进或增强该产品的功能时,那么就可以使用D L L。
• 它们可以用许多种编程语言来编写。可以选择手头拥有的最好的语言来编写D L L。也许你的应用程序的用户界面使用Microsoft Visual Basic编写得最好,但是用C + +来处理它的商用逻辑更好。系统允许Visual Basic程序加载C++ DLL、Cobol DLL和Fortran DLL等。
• 它们简化了软件项目的管理。如果在软件开发过程中不同的工作小组在不同的模块上工作,那么这个项目管理起来比较容易。但是,应用程序在销售时附带的文件应该尽量少一些。我知道有一家公司销售的产品附带了1 0 0个D L L——每个程序员最多有5个D L L。这样,应用程序的初始化时间将会长得吓人,因为系统必须打开1 0 0个磁盘文件之后,程序才能执行它的操作。
• 它们有助于节省内存。如果两个或多个应用程序使用同一个D L L,那么该D L L的页面只要放入R A M一次,所有的应用程序都可以共享它的各个页面。C / C + +运行期库就是个极好的例子。许多应用程序都使用这个库。如果所有的应用程序都链接到这个静态库,那么s p r i n t f、s t r c p y和m a l l o c等函数的代码就要多次存在于内存中。但是,如果所有这些应用程序链接到DLL C/C++运行期库,那么这些函数的代码就只需要放入内存一次,这意味着内存的使用将更加有效。
• 它们有助于资源的共享。D L L可以包含对话框模板、字符串、图标和位图等资源。多个应用程序能够使用D L L来共享这些资源。
• 它们有助于应用程序的本地化。应用程序常常使用D L L对自己进行本地化。例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的D L L。
• 它们有助于解决平台差异。不同版本的Wi d n o w s配有不同的函数。开发人员常常想要调用新的函数(如果它们存在于主机的Wi n d o w s版本上的话)。但是,如果你的源代码包含了对一个新函数的调用,而你的应用程序将要在不能提供该函数的Wi n d o w s版本上运行,那么操作系统的加载程序将拒绝运行你的进程。即使你实际上从不调用该函数,情况也是这样。如果将这些新函数保存在D L L中,那么应用程序就能够将它们加载到Wi n d o w s的老版本上。当然,你仍然可以成功地调用该函数。
• 它们可以用于一些特殊的目的。Wi n d o w s使得某些特性只能为D L L所用。例如,只有当D L L中包含某个挂钩通知函数的时候,才能安装某些挂钩(使用S e t Wi n d o w s H o o k E x和S e t Wi n E v e n t H o o k来进行安装)。可以通过创建必须在D L L中生存的C O M对象来扩展Windows Explorer的外壳程序。对于可以由We b浏览器加载的、用于创建内容丰富的We b页的A c t i v e X控件来说,情况也是一样.
DLL的显示和隐试的使用方法
一些经验:
一般使用extern "C" _declspec(dllexport)导出变量,函数等,一般不导出类,为了何其他的兼容。。。。。。。。。
e x t e r n“C”用于c++编译为能够让c兼容的,即保证函数名不被修改。
若要使用与其他编译器供应商的工具链接的M i c r o s o f t的工具创建一个可执行模块,必须告诉M i c r o s o f t的编译器输出没有经过改变的函数名。可以用两种方法来进行这项操作。第一种方法是为编程项目建立一个. d e f文件,并在该. d e f文件中加上类似下面的E X P O RT S节:
如果想避免使用. d e f文件,可以使用第二种方法输出未截断的函数版本。在D L L的源代码模块中,可以添加下面这行代码:
#pragma comment(linker, "/export:MyFunc=_MyFunc@8")
(MyFunc wei函数名字)