`
thecloud
  • 浏览: 951338 次
文章分类
社区版块
存档分类
最新评论

动态链接库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文件中
特点:程序较大,占用内存较大,但速度较快(免去 调用函数LOADLIB等)
测试:
需要 .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 \n", 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\n");
    }
    else
    {
        FunPtr funPtr = (FunPtr)GetProcAddress(h,"add");
        if(funPtr != NULL)
        {
            int result = funPtr(3, 3);
            printf("3 + 3 = %d \n", result);
        }
        else
        {
            printf("get process error\n");
            printf("%d",GetLastError());
        }
        FreeLibrary(h);
    }
 
    return 0;
}



分享到:
评论

相关推荐

    静态链接库lib和动态链接库dll区别

    静态链接库lib是将库中的所有指令都包含在最终生成的EXE文件中,而动态链接库dll则不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。 静态链接库的使用需要库的开发者...

    内存加载动态链接库(DLL)文件

    内存加载动态链接库(DLL)是Windows操作系统中的一个重要特性,它允许程序在运行时动态地加载和使用函数库。DLL不仅可以节省系统资源,还可以实现代码共享,提高软件的可维护性和扩展性。以下是对这个主题的详细...

    Windows10下Qt动态/静态加载DLL

    在Windows 10环境下开发基于Qt的应用程序时,有时我们需要加载外部动态链接库(DLL)以扩展功能或实现特定操作。动态加载DLL可以提供更大的灵活性,因为它允许在运行时加载和卸载库,而不必在编译时将其链接到应用...

    VC++动态链接库(DLL)编程深入浅出(全).pdf

    相比之下,使用动态链接库时,DLL文件可以独立于主程序存在,允许在运行时加载或替换,提供了更高的灵活性。 - **DLL的其他特点**: - **跨语言兼容性**:DLL的编写不受特定编程语言或编译器的限制,只要遵循约定的...

    静态加载动态链接库

    静态加载动态链接库是与运行时动态加载相对的一种方式,它在编译时就将DLL的功能整合到可执行文件中,使得程序在启动时无需额外查找和加载DLL。 静态加载动态链接库通常通过.lib文件实现。.LIB文件是静态链接库,它...

    VC 动态链接库(dll)编程深入浅出.pdf

    虽然本文的主要内容是关于动态链接库,但为了更好地理解DLL的作用,我们首先简要介绍一下静态链接库。静态链接库在编译时就会被链接到目标程序中,因此所有的库代码都会被包含在最终生成的可执行文件中。这使得应用...

    动态链接库DLL学习笔记

    动态链接库(DLL)是Windows操作系统中的一种机制,它允许多个程序共享同一段代码和数据,从而节省内存和磁盘空间。DLL文件包含了可执行代码和数据,而LIB文件则是DLL的导入库,用于静态链接。 在静态链接时,...

    静态、动态链接库的创建和调用

    静态链接库在编译时期与应用程序链接,而动态链接库则在运行时期加载。 首先,我们来谈谈静态链接库。创建静态库的过程中,我们需要一个项目,通过添加需要封装成库的代码文件(例如C/C++文件)。创建完成后,编译...

    动态链接库(DLL)编程深入浅出

    为了更好地理解静态链接库与动态链接库之间的差异,这里给出一个简单的静态链接库示例。 假设我们创建了一个名为`libTest`的静态链接库项目,该项目包含一个头文件`lib.h`和一个源文件`lib.cpp`。`lib.h`中定义了一...

    动态链接库之动态加载

    动态链接库(Dynamic Link Library,简称DLL)是Windows操作系统中的一种共享库机制,它允许多个应用程序共享同一块代码和数据,从而节省内存并提高系统效率。动态加载是DLL的一个重要特性,它允许程序在运行时根据...

    动态链接库DLL的编写与使用

    动态链接库(DLL)是Windows操作系统中的一个重要概念,它是一种可执行代码的共享库,允许多个应用程序同时使用相同的代码,从而节省内存并提高系统效率。本文将深入探讨DLL的编写和使用,以及如何进行显示隐式调用...

    深入浅出Visual_C++动态链接库(Dll)编程.pdf

    - **动态链接库**:相比之下,动态链接库(DLL)不会被直接嵌入到可执行文件中,而是在运行时按需加载。这不仅减少了可执行文件的大小,还允许多个应用程序共享同一份代码,从而节省内存资源。 #### DLL的特点 1. **...

    C# dll的调用(动态链接库创建与使用)

    在编程世界中,动态链接库(DLL,Dynamic Link Library)是一种重要的共享代码资源,它可以被多个应用程序同时调用,以节省内存并实现代码重用。C# 作为.NET框架的一部分,同样支持创建和调用DLL。本文将深入探讨C#...

    动态链接库DLL

    动态链接库(DLL,Dynamic Link Library)是Windows操作系统中一种重要的共享代码库,它包含了一系列可执行函数和数据,可供多个程序同时使用,以节省内存并实现代码复用。DLL文件在程序运行时动态地加载到内存中,...

    动态链接库dll详解

    ### 动态链接库DLL详解 #### 一、动态链接库(DLL)概念与作用 动态链接库(Dynamic Link Library,简称DLL)是一种共享库,主要用于Windows操作系统中。DLL文件包含了一系列预先编译好的函数、类或其他资源。通过...

    动态链接库与静态链接库 的区别

    ### 动态链接库与静态链接库的区别 在软件开发领域,链接库是软件构建过程中不可或缺的一部分,它们有助于提升代码的复用性、模块化以及性能优化。链接库大致可以分为两大类:静态链接库(Static Library)和动态...

    c++ 创建动态链接库dll并调用

    本解决方案详细介绍了如何创建C++动态链接库DLL以及如何从另一个C++程序中调用其功能。以下是对整个过程的详细说明: 1. **创建DLL项目(mydll)**: - 在Visual Studio或其他C++编译环境中,新建一个Win32项目,...

    VC++动态链接库(DLL)编程深入浅出 中老鳥必備.pdf

    与静态链接库相比,动态链接库不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。 动态链接库的概念是指一种仓库,它提供给你一些可以直接拿来用的变量、函数或类...

    动态链接库DLL编程2022优秀文档.ppt

    动态链接库DLL编程2022优秀文档.ppt 动态链接库(DLL)是Windows操作系统中的一种重要组件,它提供了一种灵活的方式来复用代码。下面是动态链接库DLL编程的知识点: 1. 动态链接库(DLL)的概念 动态链接库是一种...

Global site tag (gtag.js) - Google Analytics