动态链接库的简单应用

来源:岁月联盟 编辑:exp 时间:2012-01-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()  ;
}
 
 摘自 yue7603835的专栏