动态链接库是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() ;
}