C++之DLL的动态加载与静态加载初尝试

【环境:VS2019】

【编写一个DLL并导出函数】

1、新建动态链接库:V_BJZ

[framework.h]

#pragma once

#define WIN32_LEAN_AND_MEAN
// 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
extern "C" _declspec(dllexport) int ReturnSum(int a, int b);
//导出声明,_declspec(dllexport)是关键字

[dll1.cpp]

#include "framework.h"
#include "pch.h"
int ReturnSum(int a, int b) //该DLL需要导出的函数功能:加法
{
    return a + b;
}

2、编译链接后的文件夹(划重点:之后要用的呀~)

【使用动态加载方式调用该函数】

1、新建项目V_DY

[DY.cpp]

#include<iostream>
#include<wtypes.h>
using namespace std;

typedef int(*pReturnSum)(int a, int b);
//函数指针声明
int main() {
    HINSTANCE hDLL;    pReturnSum ReturnSum;
    hDLL = LoadLibrary("G:\\Cplus_workspace\\V_1\\V_BJZ\\Debug\\V_BJZ.dll");
    //加载 DLL文件
    if (hDLL == NULL) {
        cout << "Error!!!\n";
    }
    ReturnSum=(pReturnSum)GetProcAddress(hDLL,"ReturnSum");
    //取DLL中的函数地址,以备调用
    int a, b, sum;
    cin >> a >> b;
    sum = ReturnSum(a, b);
    cout<<"sum = "<<sum<<endl;
    FreeLibrary(hDLL);
    return 0;
} 

【使用静态加载的方式调用该函数】

1、新建项目V_DY2

2、将V_BJZ项目中的framework.h文件和V_BJZ.lib,V_BJZ.dll置于V_DY2项目文件夹下

[DY2.cpp]

#include<iostream>
#include<wtypes.h>
#include "framework.h"
//引用V_BJZ项目中的头文件
#pragma comment(lib,"G:\\Cplus_workspace\\V_1\\V_DY2\\V_BJZ.lib")
//将V_BJZ.lib库文件连接到目标文件中(即本工程)
using namespace std;

int main()
{
    int a, b, sum;
    cin >> a >> b;
    sum=ReturnSum(a, b);
    cout<<"sum = "<<sum<<endl;
    return 0;
} 

【效果图】

【遇到的问题】

1、程序中使用的文件路径建议使用双斜杠。单斜杠会提示语法错

2、静态加载方式不仅要把文件放到项目文件夹下,还要在VS上导入一下(VS2019快捷键为Shift Alt A),否则提示语法错

3、静态加载方式EXE单独执行时需将调用的DLL文件放在同目录下,否则报错

4、头文件不需要的不建议写,会报出稀奇古怪的错误

5、静态加载方式将导入声明写上了反而报错,去掉就没问题了

原文地址:https://www.cnblogs.com/liqing45/p/11749882.html

时间: 2024-10-12 08:46:09

C++之DLL的动态加载与静态加载初尝试的相关文章

动态加载vs静态加载

动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载程序中有条件才运行的库. 4:热更新,在不停止程序的前提下进行更新. 5:复杂一些,需要显示获得函数地址. 6:dll没有对应的lib文件,此时只能进行动态加载. 静态加载: 1:简单方便 2:没有dll时,系统报错 3:加载运行很久的库 4:dll必需有相应的lib文件 加载方法: 1.确保有a.

Delphi静态加载DLL和动态加载DLL示例

下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btnEnableTouch: TButton; btnDi

Android在layout xml中使用include完成静态加载

Android在layout xml中使用include完成静态加载 include静态加载:不仅可以加载布局,还可以加载控件(控件标签名要在最外层)include标签中有个layout属性就是专门用来加载的. 在Android的layout样式定义中,可以使用xml文件方便的实现,有时候为了模块的复用,使用include标签可以达到此目的.例如: <include layout="@layout/otherlayout"></div> android开发的官方

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存. 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面.这是静态链接库的一个弊端. 动态链接库有两种加载方式:隐式加载和显示加载. 隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载入内存.隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受. 显式加载又叫运行

Android学习笔记之fragment的静态加载和动态加载

1.xml布局文件: main.xml 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="match_parent" 3 android:layout_height="match_parent" > 4 5 <LinearLayout 6 android:id="@+i

Java反射之静态加载和动态加载举例小记

静态加载: package com.imooc.加载类; public class Office_Static { public static void main(String[] args) { //new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类 if("Word".equals(args[0])){ Word w = new Word(); w.start(); } if("Excel".equals(args[0])){ Excel

java动态加载类和静态加载类笔记

JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class office { public static void main(String args[]) { if("word".equals(args[0]) { word w=new word(); word.run(); } if("excel".equals(args[0]) {

include的静态加载和动态加载

动态加载是jsp解析时就生成两个Servlet文件,静态加载是在jsp解析时生成一个Servlet文件. 两个Servlet之间可以传值,所以动态加载的时候可以传值. 静态加载的时候不能传值.

MiniUI treeGrid 动态加载数据与静态加载数据的区别

说明:treegrid静态数据加载时数据结构是一棵树包含children节点集合,而采用动态加载数据时数据是List结构的具体项. 静态加载数据 test1.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="ht