您的位置:首页 > 其它

动态链接库的简单应用

2012-01-18 12:33 176 查看
动态链接库是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() ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: