动态链接库小结

  • 不能直接运行,也不能直接接受消息。

    API都在Dll中:

    Kernel32.dll 管理内存、进程、线程

    User32.dll 执行用户界面任务(窗口创建与消息传递)

    GDI32.dll画图与显示文本

     

    静态库:.lib,二进制文件,发布时不需要,仅仅在编译使用

    动态库:需要一个引入库和DLL,引入库中包含了被Dll导出的函数和变量的符号名。

     

    动态库的好处:

    1

    多种编程语言

    2

    增强产品功能

    3

    提供二次开发的平台

    4

    简化项目管理

    5

    节省磁盘空间和内存

    6

    资源共享

    7

    应用程序本地化

     

    Dumpbin 查看

    Vcvars32.bat 设置环境

     

    Dumpbin -exports dll1.dll 查看动态链接库的导出函数

     

    在动态库中需要导出的函数添加关键字:_declspec(dllexport)

    在使用动态库文件中声明:_declspec(dllimport)

     

    加载方式:

    隐式加载

    工程中设置库文件,文件中使用

    Extern int add(?)

    或者

    _declspec(dllimport) int add(?)

     

    定制一个动态库导出函数的头文件,为了使头文件通用,方法:

    dll1.h中:

    #ifdef DLL1_API

    #else

    #define DLL1_API extern "C" _declspec(dllimport)

    #endif

     

    dll1.cpp

    #define DLL1_API extern "C" _declspec(dllexport)

    #include "Dll1.h"

     

     

    导出整个类或者仅仅导出类中的某些成员函数:

    class DLL1_API  Point

    {

    public:

    DLL1_API void output(int x,int y);

    void test();

    };

     

    调用约定:

    DEphiC++调用约定不同!

    使用 extern "C" 关键字,保证导入导出命名统一,主要在C++C的名字改编问题。但这种方式只能用于全局变量和函数,不能适用于类。

     

    _stdcall关键字的使用:没有,为C调用方式。

     

    使用模块定义文件方式解决名字改编问题:

    模块定义文件,新建.def文件,加入工程

    Dll2.def

     

    LIBRARY Dll2

     

    EXPORTS        下面为导出函数名字

    add

    subtract

     

     

     

    显式加载

    LoadLibrary加载动态库或可执行程序

    HINSTANCE hInst;

    hInst=LoadLibrary("Dll3.dll");

    typedef int (/*_stdcall*/ *ADDPROC)(int a,int b);    定义函数指针类型

    //ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z");

    ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));

     

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值