VS通过隐式链接加载一个DLL,这个DLL里有很多C++类和接口,那么所有的类都会自动被导出吗
时间: 2024-02-05 15:04:48 浏览: 102
不是所有的类都会自动被导出,只有在类定义中加上了 `__declspec(dllexport)` 才会被导出。这个关键字是用来告诉编译器将这个类的定义导出到 DLL 中,以便其他程序可以使用它。如果没有使用这个关键字,那么这个类的定义就不会被导出到 DLL 中,其他程序就不能使用它。另外,如果这个类使用了其他的导出类或导出函数,也需要将这些类或函数的定义加上 `__declspec(dllexport)` 才能正确导出。
相关问题
c++隐式调用dll
在C++中,可以通过使用动态链接库(DLL)来实现动态加载和调用函数。要使用DLL,需要使用Windows API中的LoadLibrary函数加载DLL,并使用GetProcAddress函数获取DLL中导出的函数地址。使用这些函数,可以在运行时动态地加载DLL并调用其中的函数。
下面是一个示例代码,演示了如何使用DLL并调用其中的函数:
```cpp
#include <iostream>
#include <windows.h>
typedef int (*AddFunc)(int, int);
int main() {
HINSTANCE hDLL = LoadLibrary("mydll.dll");
if (hDLL == NULL) {
std::cout << "Failed to load DLL." << std::endl;
return 1;
}
AddFunc add = (AddFunc)GetProcAddress(hDLL, "Add");
if (add == NULL) {
std::cout << "Failed to get function address." << std::endl;
return 1;
}
int result = add(1, 2);
std::cout << "Result: " << result << std::endl;
FreeLibrary(hDLL);
return 0;
}
```
在上面的代码中,我们首先使用LoadLibrary函数加载名为mydll.dll的DLL。然后,使用GetProcAddress函数获取名为Add的导出函数的地址。最后,我们调用Add函数,并输出其返回值。注意,我们使用了typedef来定义了一个函数指针类型AddFunc,这是为了方便地使用函数指针调用Add函数。
需要注意的是,在使用DLL时需要确保DLL文件已经被正确地编译和链接。否则,可能会出现链接错误或运行时错误。
二、实验准备知识: 1、动态链接库入口函数 DllMain() 2、动态链接库导入/导出函数 -declspec(dllexport) -declspec(dllimport) 3、动态链接库的链接方式 隐式链接:extern “C” 显式链接:LoadLibrary() 三、实验内容 1、建立一个动态链接库(A simple DLL project类型),在其中自行编制1-2个函数。 2、使用DumpBin.exe查看导入导出函数。 3、创建新程序,在新程序中使用隐式或者显式方式调用动态链接库中的函数,输出相关说明。 3、截图并完成实验报告。
实验准备:
1. Visual Studio 2019
2. Windows操作系统
实验步骤:
1. 创建一个动态链接库项目
打开Visual Studio,选择File->New->Project,在弹出的对话框中选择Visual C++->Windows Desktop->Windows Desktop Wizard,然后选择DLL(动态链接库)项目类型。
2. 编写动态链接库函数
在项目中添加一个C++源文件(.cpp),编写一个简单的函数。例如,以下是一个计算两个整数之和的函数:
```c++
#include <iostream>
extern "C" __declspec(dllexport) int add(int a, int b) {
std::cout << "Calling add() function in DLL..." << std::endl;
return a + b;
}
```
这个函数使用了`extern "C"`来指定C语言风格的函数名,以便在动态链接库中正确导出函数。`__declspec(dllexport)`用于指定函数是导出函数。
3. 生成动态链接库
在Visual Studio中,选择Build->Build Solution,生成动态链接库文件(.dll)和相关的库文件(.lib)。
4. 查看导入导出函数
使用DumpBin.exe工具查看导入导出函数。在Visual Studio命令提示符中,输入以下命令:
```
dumpbin /exports yourdll.dll
```
其中`yourdll.dll`是你创建的动态链接库文件名。将会输出类似以下的内容:
```
ordinal hint RVA name
1 0 00001000 add
```
其中`add`就是我们刚刚编写的导出函数。
5. 创建新程序并调用动态链接库函数
创建一个新的控制台应用程序,在其中调用动态链接库中的函数。以下是一个简单的例子:
```c++
#include <iostream>
#include <Windows.h>
typedef int (*AddFunc)(int, int);
int main() {
HMODULE dllHandle = LoadLibrary("yourdll.dll");
if (dllHandle == NULL) {
std::cout << "Failed to load DLL!" << std::endl;
return 1;
}
AddFunc add = (AddFunc)GetProcAddress(dllHandle, "add");
if (add == NULL) {
std::cout << "Failed to get function address!" << std::endl;
return 1;
}
std::cout << "Calling add() function in DLL..." << std::endl;
int result = add(1, 2);
std::cout << "Result: " << result << std::endl;
FreeLibrary(dllHandle);
return 0;
}
```
在这个例子中,我们使用`LoadLibrary`函数加载动态链接库文件,并使用`GetProcAddress`函数获取导出函数的地址。然后我们就可以像调用普通函数一样调用动态链接库中的函数了。
6. 运行程序并查看结果
编译并运行新程序,将会输出以下内容:
```
Calling add() function in DLL...
Result: 3
```
这表明我们成功地调用了动态链接库中的函数,并获得了正确的结果。
实验总结:
本次实验我们学习了如何创建和使用动态链接库。动态链接库可以将代码和数据封装成一个可重用的模块,以便在不同的程序中调用。我们还学习了如何使用DumpBin.exe工具查看动态链接库中的导入导出函数。
阅读全文