dll

来源:互联网 发布:microsoft windows官网 编辑:程序博客网 时间:2024/05/06 11:47

1.DLL有两种调用方法:  
  (1).用LoadLiabrary调用,不用注册。  
  (2).用CoCreateInstance,通过CLSID,必须注册,目录没关系,只是移动位子以后,必须重新注册。

 

2.如果DLL是COM组件的话,一定要注册;如果是一般的DLL,不用注册。   
  DLL在哪个目录并不重要,只要调用它的程序找得到就可以了。

 

3.注册COM时,在注册表中HKEY_CLASS_ROOT/CLSID/中会保存有关信息,如DLL的路径,住所模式等。所以CoCreateInstance()可以找到DLL,这也是为什么将该dll移到他处必须重新注册的原因。

注册表里包含了DLL文件的地址,具体位置在HKEY_CLASS_ROOT/CLSID/{........./*CLSID*/}/InprocServer32下。

 

4.静态链接库: 函数和数据被编译成一个二进制文件,通常扩展名为.lib。链接器把库中的函数和应用程序的模块组合成最终的可执行文件,发布时不需要使用静态库。

   动态链接库: 包括.lib引入库和.dll输入库两个文件。这个.lib是引入库文件,它包含dll导出的函数和变量的符号,链接器只链接引入库文件,发布时需要提供使用的dll文件。

 

 生成.lib,.dll时,生成的.exp是输出库文件。

 

 在调用程序中 #pragma comment(lib,".lib") 起配置附加依赖项的作用

 若dll工程中没有要export的函数,编译后不产生lib文件.

 

5.动态链接库有两种加载方式:隐式链接......和显示加载......。

6.在函数声明最前面加 _declspec(dllexport) ,使用函数成为导出函数

   symbian e32def.h中有声明

   #define IMPORT_C __declspec(dllexport)
   #define EXPORT_C __declspec(dllexport)

   可能__declspec, _declspec两种写法编译器都支持

7.msvcrtd.dll 是C运行时库.

 

8.在函数声明前加上extern关键字表示函数是在外部定义的。

   在函数声明前加上 _declspec(dllimport) 关键字表示函数是从动态链接库中引入的。它比使用extern关键字效率高。 

 

9.在class关键字和类名间加入导出标识符,就可以导出整个类了,类中的所有函数都被导出。

   也可以只在要导出的成员函数声明中的返回值和函数名间加入导出标识符,就可以只导出这个函数而不是整个类了。

 

10.为了支持函数重载,c++编译器对函数名称会有不同规则的名字改编(名字粉碎),而C编译器不会。

     若希望动态链接库函数在编译时,导出函数的名称不要发生改变,在定义导出函数时,需要在导出标识符前加上限定符:extern "C",字母C要大写。 

     extern "C" 只能用于导出全局函数的情况,不能用于导出一个类的成员函数,因为类不是C语言的特性。

     extern "C"是针对显示加载的方式,如果客户端采用隐式链接,编译dll时应该可以不使用 extern "C"。

 

11.调用约定对名称改编的影响......

12.DllMain函数,是dll的入口函数,该函数是可选的,如果提供了DllMain函数,当系统加载该dll时,会调用该函数。

原创粉丝点击