• 动态链接库dll的 静态加载 与 动态加载


    dll 两种链接方式  : 动态链接和静态链接(链接亦称加载)

    动态链接是指在生成可执行文件时不将所有程序用到的函数链接到一个文件,因为有许多函数在操作系统带的dll文件中,当程序运行时直接从操作系统中找。  
    静态链接就是把所有用到的函数全部链接到exe文件中。
    动态链接是只建立一个引用的接口,而真正的代码和数据存放在另外的可执行模块中,在运行时再装入;  
    而静态链接是把所有的代码和数据都复制到本模块中,运行时就不再需要库了。
     

    1. 生成  静态链接库 lib 和动态链接库 dll
     
    新建工程 ( newdll)  win32项目 ->  dll

    添加.h文件 
    betabinlib.h

    #ifndef BETABINLIB_H
    #define BETABINLIB_H
     
    #ifdef NEWDLL_EXPORTS   //自动添加的宏   右键工程-属性-配置属性-预处理器-..定义
    #define MYDLL_API extern "C" __declspec(dllexport)
    #else
    #define MYDLL_API extern "C" __declspec(dllimport)
    #endif
     
    MYDLL_API int add(int x, int y);  // 必须加前缀
    #endif


    添加.cpp文件  betabinlib.cpp

    #include "stdafx.h"
    #include "betabinlib.h"
     
    int add(int x, int y)
    {
        return x + y;
    }
    
    编译生成  .dll 和 . lib文件
     
    2. 使用

    (1)dll的静态加载--将整个dll文件 加载到  .exe文件中
    特点:程序较大,占用内存较大,但速度较快(免去 调用函数LOAD LIB等)
    测试:
    需要  . lib  和 .dll两个文件     (. lib 做 引导用),.h文件

    main.cpp

    #include <stdio.h>
    #include "betabinlib.h"
    #include <Windows.h>
    #pragma comment(lib, "newdll.lib")
     
    int main()
    {
        printf("2 + 3 = %d 
    ", add(2, 3));
        return 0;
    }
    (2) dll的动态加载--根据需要加载响应函数,随时可卸载。不会因为找不到dll, 导致程序不能运行(需要自己做判断处理)。

    只需要 .lib文件,不需要 .h文件

    main.cpp
    #include <stdio.h>
    #include <Windows.h>
     
    int main()
    {
        HINSTANCE h=LoadLibraryA("newdll.dll");
        typedef int (* FunPtr)(int a,int b);//定义函数指针
     
        if(h == NULL)
        {
        FreeLibrary(h);
        printf("load lib error
    ");
        }
        else
        {
            FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
            if(funPtr != NULL)
            {
                int result = funPtr(3, 3);
                printf("3 + 3 = %d 
    ", result);
            }
            else
            {
                printf("get process error
    ");
                printf("%d",GetLastError());
            }
            FreeLibrary(h);
        }
     
        return 0;
    }



  • 相关阅读:
    深度优先和广度优先
    水管工游戏(深度优先)
    炸弹人
    广度优先(迷宫找人)
    System.Data.Entity.Core.MetadataException: 无法加载指定的无数据资源
    Element Cascader 级联选择器 单选操作优化
    Windows服务 ProjectInstaller 获取 路径
    Quartz.NET ScheduledFireTimeUtc 当超过1分钟时出现的问题。
    记录:一个SQL SERVER奇怪的问题。
    log4.net 配置
  • 原文地址:https://www.cnblogs.com/pangblog/p/3315627.html
Copyright © 2020-2023  润新知