码迷,mamicode.com
首页 > 编程语言 > 详细

C++动态链接库

时间:2014-09-13 12:03:05      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   ar   strong   文件   div   问题   

1、动态链接库概述:

  • 动态链接库通常都不能直接运行,也不能接受消息;只有在其他模块调用动态链接库中的函数时,它才发挥作用。
  • Windows API中所有的函数都包含在动态链接库中。
  • 动态链接库分静态库和动态库。

2、动态链接库的创建:

要导出的函数的形式为:

extern "C" _declspec(dllexport) int add(int a, int b)
{
      return a+b;   
}

为解决名字改编问题,可为工程添加一个模块定义文件.def

LIBRARY 
         MFC-Add

EXPORTS 
         add    

要导出的类的形式为:

class _declspec(dllexport) Point
{
public:
      void OutPut(int x, int y);
};

编译之后会生成:一个DLL(.dll)文件、一个引入库(.lib)文件等

注:若在声明类时,指定了导出标志,那么该类中的所有函数均被导出;否则只导出那些声明时指定了导出标志的类成员函数

3、动态链接库的加载:

 (1) 隐式加载

利用 extern 或 _declspec(dllimport) 声明外部函数(最好将此声明写在一个头文件*.h中)

_declspec(dllimport) int add(int a, int b);

导入对应的引入库(.lib)文件:在项目“设置”中链接lib库 或 在源文件中使用代码链接lib库:

#pragma comment(lib, "*.lib")

将动态链接库文件所在目录添加到系统的环境变量:path中

 (2) 显式加载

将指定的可执行模块映射到调用进程的地址空间

#include <Windows.h>
HINSTANCE handlerDLL = NULL;
handlerDLL = LoadLibrary(_T("..\\..\\MFC-Add\\Debug\\MFC-Add.dll"));

获取该动态链接库中导出函数的地址

typedef int(_stdcall *ADDPROC)(int a,int b);//声明MESSAGE为指向函数的指针类型,函数返回值类型为int; _stdcall即标准调用约定
ADDPROC AddProc;
AddProc = (ADDPROC)GetProcAddress(handlerDLL,_T("add"));

调用导出函数

AddProc(5,6);

当不需要访问dll时,释放对dll的引用

FreeLibrary("..\\..\\MFC-Add\\Debug\\MFC-Add.dll");

注:

  • Dumpbin 和 Depends 工具
  • 调用约定:_stdcall:标准调用约定即WINAPI调用约定,也就是pascal调用约定,非C调用约定
  • 名字改编:C++编译器在生成DLL时,会对导出函数进行名字改编,且不同的编译器使用的改编规则不同

C++动态链接库

标签:style   blog   color   使用   ar   strong   文件   div   问题   

原文地址:http://www.cnblogs.com/gaohongchen01/p/3969583.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!