[C/C++]Windows动态链接库的创建与调用

一、创建动态链接库

创建Win32项目

  1. 文件 - 新建 - 项目
  2. 模板 - Visual C++ - Win32,选择Win32项目,填写名称dlldemo
  3. 下一步 - 选中DLL - 选中空项目,点击 完成

代码

  1. 创建头文件 Dlldemo.h
#pragma once;
#ifdef DLLDEMO_EXPORTS
#define DLLDEMO_API __declspec(dllexport)
#else
#define DLLDEMO_API __declspec(dllimport)
#endif

class DLLDEMO_API Dlldemo
{
public:
    Dlldemo();
    ~Dlldemo();

    void hello2();
    int swap2(int n2);

private:

};

extern "C" DLLDEMO_API void hello();

extern "C" DLLDEMO_API int swap(int n);
  1. 创建cpp文件 Dlldemo.cpp
#include "Dlldemo.h"
#include <iostream>
using namespace std;

Dlldemo::Dlldemo()
{
}

Dlldemo::~Dlldemo()
{
}

void Dlldemo::hello2()
{
    cout << "hello world2========" << endl;
}

int Dlldemo::swap2(int n2)
{
    return n2 * n2 * n2;
}

DLLDEMO_API void hello()
{
    cout << "hello world" << endl;
}

DLLDEMO_API int swap(int n)
{
    return n * n * n;
}
  1. 创建入口文件 DllMain.cpp
#include <Windows.h>

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

生成动态库

  1. 选择Release,点击 生成 - 生成解决方案
  2. Release目录生成.dll和.lib文件

二、调用动态链接库

调用动态库的方式分为隐式调用和显示调用,其中显示调用又分静态调用和动态调用两类。

1.隐式调用

  1. 创建空项目 dlltest
  2. 在项目(代码目录)内创建include和lib两个文件夹,include存放.h头文件,lib存放.lib文件,将Dlldemo.h和dlldemo.lib分别放到include和lib目录
  3. 将dlldemo.dll文件放到Debug目录
  4. 项目属性 - 配置属性 - C/C++ - 常规 - 附加包含目录 - 选择include目录
  5. 项目属性 - 配置属性 - 链接器 - 常规 - 附加库目录 - 选择lib目录
  6. 项目属性 - 配置属性 - 链接器 - 输入 - 附加依赖项 - 加入dlldemo.lib
  7. 创建main.cpp文件
#include "Dlldemo.h"
#include <iostream>
using namespace std;

int main()
{
    Dlldemo *dlldemo = new Dlldemo;
    dlldemo->hello2();
    int s1 = dlldemo->swap2(4);
    cout << "swap 2 is " << s1 << endl;

    cout << "========================" << endl;

    hello();
    int s = swap(2);
    cout << "swap 2 is " << s << endl;

    return 0;
}

输出结果

hello world2========
swap 2 is 64
======================>==
hello world
swap 2 is 8

请按任意键继续…

2.显示调用

2.1静态调用

  1. 创建空项目dlltest2
  2. 在项目(代码目录)内创建include和lib两个文件夹,include存放.h头文件,将Dlldemo.h放到include目录
  3. 将dlldemo.dll文件放到Debug目录
  4. 创建main.cpp
#include <iostream>
#include "include\Dlldemo.h"
using namespace std;
#pragma comment(lib, "dlldemo.lib")

_declspec(dllimport) int swap(int n);
_declspec(dllimport) void hello();

int main()
{
    cout << "swap is " << swap(2) << endl;
    hello();

    return 0;
}

输出结果:

swap is 8
hello world
请按任意键继续…

2.2动态调用

  1. 创建空项目 dlltest3
  2. 将dlldemo.dll文件放到Debug目录
  3. 创建main.cpp
#include <iostream>
#include <Windows.h>
#include <string.h>
using namespace std;

//1. 声明函数类型
typedef int (*SWAP)(int n);
typedef void(*HELLO)(void);

int main()
{
    //2. 获得动态库 hModule
    string strPath = "dlldemo.dll";
    HMODULE hModule = LoadLibrary(strPath.c_str());
    if (hModule == NULL || hModule == INVALID_HANDLE_VALUE)
    {
        return -1;
    }

    //3. 获得相关函数
    SWAP swap = (SWAP)GetProcAddress(hModule, "swap");
    cout << "swap(2) is " << swap(2) << endl;

    HELLO hello = (HELLO)GetProcAddress(hModule, "hello");
    hello();

    FreeLibrary(hModule);

    return 0;
}

输出结果:

swap(2) is 8
hello world
请按任意键继续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值