Windows——创建DLL

一、定义DLL

dll.h

#pragma once

#ifdef DLLEXPORT
	#define DLLAPI _declspec(dllexport)
#else
	#define DLLAPI _declspec(dllimport)
#endif

extern "C" DLLAPI int Add(int a, int b);

注意:需要在项目属性->预处理器->预处理器定义,添加DLLEXPORT声明
dll.cpp

#include "test1dll.h"

int Add(int a, int b) {
	return a + b;
}

二、隐式链接

#include <iostream>
#include "../test1dll/test1dll.h"
#pragma comment(lib,"test1dll.lib")
using namespace std;


int main()
{
    int a = 4;
    int b = 5;
    cout << Add(a, b);
}
注意:需要在项目属性->链接器->附加库目录,添加test1dll.lib的路径

三、显式链接

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

typedef int(*PAdd)(int a, int b);

int main()
{
    HMODULE hDLL = LoadLibrary(L"../Debug/test1dll.dll");
    if (hDLL == NULL) {
        cout << "加载DLL文件失败" << endl;
        return 0;
    }
    PAdd pAdd = (PAdd)GetProcAddress(hDLL, "Add");
    int a = 4;
    int b = 5;
    cout << pAdd(a, b);

    FreeLibrary(hDLL);
}

四、疑问与解答

  • 为什么函数定义要声明extern “C”
    因为不声明,将使用C++编译器进行编译,C++支持函数的重载,会对函数名重写。这样,当动态链接调用**GetProcAddress()**时,就不再是原来的函数名称,就会出现找不到函数名的错误。
  • 可不可以不声明extern “C”
    可以,借用dependency的工具去找到经过C++编译器执行后的新函数名,使用该函数名直接可以调用GetProcAddress()
  • 能否不使用_declspec(dllimport),不使用也不会报错?
    当使用DLL中的静态数据时,必须定义_declspec(dllimport),如果只是导出函数,将不会有太大影响。但是定义它可以加快函数在内存中的检索速度。
  • 能否不使用_declspec(dllexport),_declspec(dllimport),extern “C” 等关键字完成DLL的创建?
    可以,微软提供了一种“模块定义文件”-> .def,通过编写该文件,即可完成DLL的创建与函数的导出。
    LIBRARY test1dll
    EXPORTS
    Add
    
    注意:项目->添加->新建项->代码-> .def
    
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值