zoukankan      html  css  js  c++  java
  • 加载动态库的方法

    库分两种,静态库和动态库,而动态库的加载方法又分两种,动态加载和静态加载

    做为外部库,这两种库的加载都不需要包含头文件,因为相关的信息已经在导入库了

    假设导入函数如下:add(int x, int y);

    头文件如下:

    extern "C" int __declspec(dllexport)add(int x, int y);

    extern "C"代表c风格的,同时如果用不同的语言,则必需用相同的导入或者导出

    源文件如下:

    #include "test.h"

    int add(int x, int y)
    {
       return x + y;
    }

    动态加载使用如下:

    typedef int(*lpAddFun)(int, int);

     HINSTANCE hDll; //DLL句柄

     pAddFun addFun; //函数指针

    hDll = LoadLibrary(TEXT("D:\\work\\dll\\dll\\Debug\\test.dll"));


    addFun = (lpAddFun)GetProcAddress(hDll, "add");

    int result = addFun(2, 3);//得到函数指针后使用

    先用windows函数LoadLibrary()得到dll的句柄,然后再根据句柄得到函数指针

    如果是动态加载,则在运行的时候才能加载上

    静态加载使用方式如下:

    #pragma comment(lib,"D:\\work\\dll\\dll\\Debug\\test.lib");

    //.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息

    extern "C"  int __declspec(dllimport)add(int x,int y);

    int result = add(3, 6);

    由此可见,动态加载使用比较方便,同时在运行的时刻加载,得到函数指针后直接使用.

    而静态加载程序一开始运行就加载,使用的时候如同程序内的函数一样,不需要LoadLibrary()即可

  • 相关阅读:
    Python——String类型操作符
    NLTK——NLP流程
    NLTK——常用函数
    Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream
    java——什么是浅表副本
    JavaWeb——<c:forEach varStatus="status">
    kubernetes安装
    [转]Jmeter + Grafana + InfluxDB 性能测试监控
    html转markdown网站
    golang的包管理---vendor/dep等
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1492541.html
Copyright © 2011-2022 走看看