创建源文件
DLL的源代码中包含了需导出的函数及数据,还有内部函数及数据,另外可以有一个可选的入口函数。你可以使用任意支持创建基于Windows的DLL工具来创建DLL。
如果你的DLL需要支持多线程,应该让你的DLL做到“线程安全”。你必须同步DLL所有的全局数据以避免冲突发生,也必须确认你使用的库也是线程安全的。例如,Microsoft® Visual C++®包含了多个C运行时库,其中之一不是线程安全的,而另外两个是线程安全的。
出口函数
如何指定出口函数与开发工具有关,有些编译器允许在声明出口函数时使用一个修饰符即可,而对于另外一些而言,就必须在连接时指定一个出口声明文件。
例如,Visual C++中,就有两种导出DLL函数的方式:_declspec修饰符或者一个.def文件。如果指定了_declspec修饰符,就不必声明.def文件。
关于出口函数的更多信息,请参照开发工具的相关文档。
创建一个导入库
导入库(.lib)中包含了连接程序所需的出口函数的引用信息,通过这些信息,系统就可以在运行时定位所需的DLL及DLL出口函数。
例如, tabindex="0" keywords="_win32_createwindow" errorurl="../common/badjump.htm">要调用CreateWindow 函数,就必须连接时导入User32.lib库,之所以这样是因为CreateWindow函数处于User32.dll这个系统DLL文件中,User32.lib用来解析代码中到User32.lib出口函数调用。DLL载入后,调用DLL中的函数需要进行修正,一旦系统初始化程序,由于需要DLL中的出口函数,就会载入User32.dll,接着就会更新函数地址表入口,所有CreateWindow的调用都会转而请求User32.dll中的出口函数。
关于创建导入库的更多信息,请参照开发工具的相关文档。
警告 DLL中调用ExitProcess函数将会当值不可预料的程序或系统错误。从DLL中调用ExitProcess时需确认您确实知晓到底是哪个程序或系统组件会载入这个DLL,并且在上下文中调用是安全的。