我使用过“CPPLoadLibrary”示例(来自 Microsoft All-in-One 框架) 好的,有两种方法可以从示例 DLL 中导出符号。
- 使用 .DEF 文件从 DLL 导出符号 模块定义 (.DEF) 文件是一个文本文件,其中包含一个或多个描述 DLL 各种属性的模块语句。创建 .DEF 文件并在构建 DLL 时使用 .def 文件。使用这种方法,我们可以按序号而不是按名称从 DLL 中导出函数。
- 使用 __declspec(dllexport) 从 DLL 导出符号 __declspec(dllexport) 将导出指令添加到目标文件,因此我们不需要使用 .def 文件。在尝试导出修饰的 C++ 函数名称时,这种便利最为明显。
所以我们有以下代码。
typedef int (_cdecl* LPFNGETSTRINGLENGTH1) (PCWSTR);
typedef int (CALLBACK* LPFNGETSTRINGLENGTH2) (PCWSTR);
LPFNGETSTRINGLENGTH1 lpfnGetStringLength1 = (LPFNGETSTRINGLENGTH1)
GetProcAddress(hModule, "GetStringLength1");
LPFNGETSTRINGLENGTH2 lpfnGetStringLength2 = (LPFNGETSTRINGLENGTH2)
GetProcAddress(hModule, "_GetStringLength2@4");
所以我的问题是如何确定符号的名称以便调用 GetProcAddress?在第一种情况下,它非常简单,我们从 .DEF 文件中获取符号名称。但是“_GetStringLength2@4”又是什么下划线呢?“@4”代表什么?谢谢。