在一个单独的类或者模块中调用动态库

在实际的企业级开发中,我们绝对不会 把所有的代码都塞在 main 函数里。通常,我们会把对 DLL 的调用封装在一个单独的类或者模块中,让 main 函数保持干净。

这里的核心思路是:把我们刚才在 main.cpp 里写的"黑科技"(相对路径引入头文件 + #pragma 链接库)转移到你新建的 .cpp 文件中。 这样不仅做到了代码隔离,还能隐藏 DLL 的实现细节。

下面新建一个 MyCalculator 类,在这个类的 .cpp.h 文件中调用 DLL。

第一步:在项目中新建 .h.cpp 文件

  1. 在 VS 的"解决方案资源管理器"中,右键点击 TestApp 项目。

  2. 选择 "添加" -> "新建项"

  3. 选择 "头文件(.h)" ,命名为 MyCalculator.h,点击添加。

  4. 再次右键点击项目,选择 "添加" -> "新建项"

  5. 选择 "C++ 文件(.cpp)" ,命名为 MyCalculator.cpp,点击添加。

此时,项目目录中多了这两个文件。

第二步:编写头文件 (MyCalculator.h)

在头文件中,我们只做声明。注意:这里不需要引入 DLL 的任何东西! 我们要让外部完全感觉不到 DLL 的存在。

打开 MyCalculator.h,输入以下代码:

复制代码
#pragma once

// 这是一个普通的 C++ 类,用来封装对 DLL 的调用
class MyCalculator {
public:
    // 构造函数
    MyCalculator();

    // 封装一个计算并打印的方法
    void calculateAndPrint(int a, int b);
};

第三步:编写源文件 (MyCalculator.cpp) ------ 魔法转移!

这里是关键!我们需要把包含 DLL 头文件和链接 .lib 的指令写在这里。

打开 MyCalculator.cpp,输入以下代码:

复制代码
#include "MyCalculator.h"
#include <iostream>

// 【关键点 1:把黑科技移到这里】
// 相对路径包含 DLL 的头文件
#include "include/MathFuncs.h" 

// 【关键点 2:在这里链接 .lib 文件】
#pragma comment(lib, "lib/MyMathDLL.lib") 

// 构造函数实现
MyCalculator::MyCalculator() {
    std::cout << "MyCalculator 对象已创建,准备使用 DLL 工具箱!" << std::endl;
}

// 核心计算方法的实现
void MyCalculator::calculateAndPrint(int a, int b) {
    std::cout << "--- 正在 MyCalculator 类内部调用 DLL ---" << std::endl;
    
    // 直接调用 DLL 提供的 Add 和 Subtract 函数
    int sum = Add(a, b);
    int sub = Subtract(a, b);

    std::cout << a << " + " << b << " = " << sum << std::endl;
    std::cout << a << " - " << b << " = " << sub << std::endl;
    std::cout << "----------------------------------------" << std::endl;
}

为什么这样做很优雅? 因为 #pragma comment#include "include/MathFuncs.h" 都在 .cpp 文件里。这意味着,如果在其他地方(比如 main.cpp)包含了 MyCalculator.h,它们完全不知道 MathFuncs.h.lib 的存在。这就是典型的高内聚、低耦合

第四步:让 main 函数变得极其清爽 (TestApp.cpp)

现在回到你的主程序 TestApp.cpp。清空之前的内容,改为:

复制代码
#include <iostream>
// 我们现在只需要包含自己的类,不需要管 DLL 了!
#include "MyCalculator.h" 

int main() {
    std::cout << "主程序启动..." << std::endl;

    // 实例化你刚才写的类
    MyCalculator myCalc;

    // 调用类的方法,DLL 的调用在类内部悄悄完成了
    myCalc.calculateAndPrint(500, 200);

    std::cout << "主程序运行结束,按任意键退出..." << std::endl;
    std::cin.get(); 
    
    return 0;
}

第五步:编译并运行

  1. 确认之前的 MyMathDLL.dll 依然静静地躺在你的 x64/Debug 文件夹里(和即将生成的 TestApp.exe 在一起)。

  2. 点击 "本地 Windows 调试器" (或按 F5) 运行。

你会看到控制台输出了由 MyCalculator 类封装打印的计算结果!

相关推荐
kkeeper~1 小时前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行1 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker1 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
盲敲代码的阿豪2 小时前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6162 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报2 小时前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080162 小时前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap3 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成3 小时前
Java学习30
java·开发语言·学习
三品吉他手会点灯3 小时前
C语言学习笔记 - 40.数据类型 - scanf函数的编程规范与非法输入处理
c语言·开发语言·笔记·学习