DLL的隐式调用和显式调用

显式调用:

这个示例包括两部分:创建DLL和从主程序调用DLL。

1. 创建DLL

首先,我们创建一个简单的DLL,它导出一个函数Add,该函数接受两个整数并返回它们的和。

DLLProject.h

#ifndef DLLPROJECT_H
#define DLLPROJECT_H

#if defined(DLLPROJECT_EXPORTS)
#define DLLPROJECT_API __declspec(dllexport)
#else
#define DLLPROJECT_API __declspec(dllimport)
#endif

extern "C" {
    DLLPROJECT_API int Add(int a, int b);
}

#endif // DLLPROJECT_H

DLLProject.cpp

#include "DLLProject.h"

extern "C" {
    DLLPROJECT_API int Add(int a, int b) {
        return a + b;
    }
}

在Visual Studio中,你需要为DLL项目定义DLLPROJECT_EXPORTS宏。这通常是在项目配置的属性页中完成的,将/D "DLLPROJECT_EXPORTS"添加到预处理器的定义中。

2. 从主程序调用DLL(显式链接)

接下来,我们编写一个主程序来显式链接并调用上述DLL中的Add函数。

MainProgram.cpp

#include <iostream>
#include <Windows.h>

typedef int (*AddFunc)(int, int);

int main() {
    HINSTANCE hinstLib = LoadLibrary(TEXT("YourDllName.dll")); // 加载DLL
    if (hinstLib != NULL) {
        AddFunc addFunc = (AddFunc)GetProcAddress(hinstLib, "Add"); // 获取函数地址
        if (NULL != addFunc) {
            int result = addFunc(2, 3); // 调用函数
            std::cout << "Result: " << result << std::endl;
        }
        else {
            std::cerr << "Could not locate function Add." << std::endl;
        }
        FreeLibrary(hinstLib); // 释放DLL
    }
    else {
        std::cerr << "Could not load the DLL." << std::endl;
    }

    return 0;
}

在这个例子中,LoadLibrary函数用于加载DLL,并返回一个模块句柄。GetProcAddress函数用于通过函数名获取函数的地址。一旦有了函数地址,我们就可以像调用普通函数一样调用它。最后,我们使用FreeLibrary函数来释放DLL。

注意:在上面的代码中,将YourDllName.dll替换为你的DLL文件的实际名称(不带路径,如果DLL在系统的PATH中,或者与你的主程序在同一目录下)。

隐式调用:

在C++中,隐式调用DLL(动态链接库)通常涉及以下几个步骤:

  1. 创建DLL并导出函数(与显式调用相同)

  2. 在主程序中包含DLL的头文件

  3. 在链接器设置中添加DLL的导入库(.lib文件)

  4. 在主程序中直接调用DLL中导出的函数

以下是如何实现隐式调用DLL的示例:

1. 创建DLL(与显式调用相同)

确保你的DLL项目正确地导出了函数。例如,使用DLLPROJECT_API宏。

DLLProject.h

#ifndef DLLPROJECT_H
#define DLLPROJECT_H

#ifdef DLLPROJECT_EXPORTS
#define DLLPROJECT_API __declspec(dllexport)
#else
#define DLLPROJECT_API __declspec(dllimport)
#endif

extern "C" {
    DLLPROJECT_API int Add(int a, int b);
}

#endif // DLLPROJECT_H

DLLProject.cpp

#include "DLLProject.h"

extern "C" {
    DLLPROJECT_API int Add(int a, int b) {
        return a + b;
    }
}

2. 在主程序中包含DLL的头文件

在主程序中,包含DLL的头文件,以便能够访问DLL中导出的函数。

MainProgram.cpp

#include <iostream>
#include "DLLProject.h" // 包含DLL的头文件

int main() {
    int result = Add(2, 3); // 直接调用DLL中的函数
    std::cout << "Result: " << result << std::endl;
    return 0;
}

3. 在链接器设置中添加DLL的导入库(.lib文件)

在Visual Studio中,你需要将DLL项目生成的.lib文件添加到主程序的链接器输入中。这通常是通过项目属性的“链接器”->“输入”->“附加依赖项”来完成的。将.lib文件的名称(不带路径)添加到这个列表中。

4. 编译并运行主程序

现在,当你编译并运行主程序时,它会自动链接到DLL的导入库,并在运行时使用DLL中的函数。由于你使用了隐式链接,所以不需要在代码中显式加载和解析DLL中的函数地址。

请注意,隐式链接要求DLL和主程序使用相同的编译器和设置进行编译,以确保函数名在导出和导入时保持一致。此外,如果DLL的依赖项(如其他DLL)没有在主程序的搜索路径中,你可能需要在主程序的运行环境中设置这些路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值