显式调用:
这个示例包括两部分:创建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(动态链接库)通常涉及以下几个步骤:
-
创建DLL并导出函数(与显式调用相同)
-
在主程序中包含DLL的头文件
-
在链接器设置中添加DLL的导入库(.lib文件)
-
在主程序中直接调用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)没有在主程序的搜索路径中,你可能需要在主程序的运行环境中设置这些路径。