动态链接库(一)

    一  概述 

     DLL实际上是一组源代码模块,提供一些供其他DLL或应用程序调用的函数。在使用DLL之前,必须将DLL映像文件映射到调用进程的相对应的地址空间,有两种载入方法:隐式链接和显示链接。

     隐式链接在进程创建的时候载入,一个新创建的进程只有在将可执行模块和所有的DLL模块隐射到进程的地址 空间后进程的主线程才开始执行,可以通过#pragram comment(lib, "动态链接库名.lib")或者link选项卡的Category:input 中添加(对于VC6.0编译器)。

     显示链接在需要时载入,通过调用API函数LoadLibrary,LoadLibraryEx,GetProcAddress,FreeLibrary.

     在DLL被映射到进程的地址空间后,对于进程中的线程而言,该DLL中的代码和数据就像是一些附加的代码和数据碰巧被放在进程的地址空间中。DLL中的函数创建的任何对象都为调用线程或进程所拥有。

     注意:DLL 中函数动态分配的内存块由于进程中各个模块链接到c/c++运行库的DLL版本可能不同最好有DLL提供函数在内部释放。

    1.1 对于一个DLL工程,当编译链接通完成后,将生成一个LIB文件和一个DLL文件,LIB文件包含导出的函数和变量的符号名,DLL文件包含实际的函数和数据。隐式链接需要LIB文件,DLL文件,H头文件,而显示链接 只需要DLL文件就可以了。

    1.2 一个DLL可以导出变量,函数,c++类。在实际开发中应该避免导出变量。对于c++类的导出只有在用同一家厂商提供的编译器的时候才可以。

    1.3

#define MYLIBAPI extern "C" _declspec(dllimport)

#define MYLIBAPI extern "C" _declspec(dllexport) ;

extern "C" 用来告诉编译器不要对导出的变量或函数名进行改编。在导入符号时不必使用_declspec(dllimport)但这可以是编译器提前知道我们的引用的符号来自DLL可以产生略微高效的代码。

 

通过DEF文件导出:

   EXPORTS

          dllGlobalVar CONSTANT

           MYFunc

如果DLL包含的符号未经过改编,链接到_MyFunc@8时连接器会做出正确的选择。

 

#pragma comment(linker, "export:MyFunc = _MyFunc@8")实际上两个函数都被导出。

注意:ordinal 指定序号为了与16位的windows代码保持向后兼容而保留的现在的程序不应该在使用。

 

MSDN:

 

EXPORTS definitions

This statement makes one or more definitions available as exports to other programs.

EXPORTS marks the beginning of a list of export definitions. Each definition must be on a separate line. The EXPORTS keyword can be on the same line as the first definition or on a preceding line. The .DEF file can contain one or more EXPORTS statements.

The syntax for an export definition is:

entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]

The optional keyword PRIVATE prevents entryname from being placed in the import library generated by LINK. It has no effect on the export in the image also generated by LINK.

There are three methods for exporting a definition, listed in recommended order of use:

  1. The __declspec(dllexport) keyword in the source code
  2. An EXPORTS statement in a .DEF file
  3. An /EXPORT specification in a LINK command

All three methods can be used in the same program. When LINK builds a program that contains exports, it also creates an import library, unless an .EXP file is used in the build.

 

 1.4 DLL的搜索路径:

       (1) 包含可执行文件的目录。

       (2)Windows的系统目录(GetSystemDirectory)。

       (3)16位的系统目录(windows目录中的system子目录)。

       (4)windows目录(GetWindowDirectory)。

       (5)进程的当前目录。

       (6)PATH环境变量中所列出的目录。

注意:从xp sp2后(1)搜索位于windows目录之后。可以改变这个顺序通过修改注册表HKLM/SYSTEM/CurrentControlSet/Control/Session Manager注册项的一个DWORD值。

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值