且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

动态链接库的简单应用

更新时间:2022-08-13 08:27:18

 动态链接库是windows下实现数据共享的一种重要方法,它提供了 二进制层上的共享。

动态链接库 可以很好的实现 项目模块之间的分离,如果某一模块出错不需要重新编译整个项目,只需要修改相应的模块 ,以及在产品的升级过程中 我们可以通过替换dll文件来实现产品的升级.

动态链接库包含2个文件  lib因入口 和dll动态链接库  ,我们在程序中通过已入库 来调用dll文件中 存储的函数 。

DLLMain函数 是DLL文件的入口函数 在dll进行初始化或者释放的时候都会调用这个函数,相对应的就是 LoadLibrary和 FreeLibrary  函数

在动态链接库中只有 指定为   _declspec(export)的函数 以及变量可以被 外部程序所调用 .

在外部程序调用的时候需要  声明为   _declspec(dllimport )  .......或者 extern.........声明 。。

在C/C++中我们是可以 这样使用 ,因为 VC这个IDE知道这个命名规范 , 

在VC中 动态链接库 默认 导出的 名字是         _FunctionName@参数表字节总数         ,那么我们就需要以这样的格式导入 函数  ,如果嫌函数声明麻烦 ,那么就声明模块定义文件

来固定函数名称 。,

  __stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

  1.参数传递顺序

  2.调用堆栈由谁(调用函数或被调用函数)清理

  常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

  __stdcall表示

  1.参数从右向左压入堆栈

  2.函数被调用者修改堆栈

  3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

  在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

下面是在VC6中简单的调用  dll中  类的 函数的代码

#define  DLLExport _declspec(dllexport)  //声明调用约定
#include <iostream>
using namespace std ;
 DLLExport void Show()
{
 cout<<"This is a simple  dll test !" <<endl ;
}

class DLLExport  MyClass  //放在关键字后面
{
public: 
 MyClass(int x ,int  y)
 {
   this->x=x ;
   this->y=y ;
 }
 void Show()
 {
  cout<<"x="<<x<<endl ;
     cout<<"y="<<y<<endl ;
 }
private:
 int x  ;
 int y   ;
};

 

下面是 在另一个工程中调用 dll

#pragma  comment(lib,"TestLibrary")
#define  DLLImport _declspec(dllimport)
DLLImport void Show() ;
class   DLLImport MyClass
{
public:
  int x ;
  int  y ;
public:
  MyClass(int x,int y) ;
  void Show() ;

};
void main()
{
Show() ;
MyClass cls(2,3);
cls.Show()  ;

}