Back

/ 2 min read

Windows编程02-动态导入

使用DEF导出一个类

  1. 创建一个DLL项目,并删除所有默认生成的文件,且关闭预编译头选项(配置属性->C/C++->预编译头->不使用预编译头)。
  2. 配置使用最新的C++标准,并且打开配置属性-> C/C++ ->语言->启用实验性的C++标准库模块,以及同路径中的生成ISO C++23标准库模块
  3. 创建三个文件:Module.ixxModule.cppSource.def

向文件中填写内容:

Module.ixx
export module Module;
export class ModuleClass {
public:
ModuleClass();
ModuleClass(int);
void MyFunc();
private:
void MyFunc(int);
public:
int m_value = 1001;
static int s_value;
};
export int ModuleClass::s_value = 2002;
export ModuleClass* __stdcall CreateModuleClass();
export ModuleClass* __stdcall CreateModuleClass(int value);
Module.cpp
module Module;
import std;
void __thiscall ModuleClass::MyFunc() {
std::cout << "ModuleClass::MyFunc() called" << std::endl;
}
void __thiscall ModuleClass::MyFunc(int) {
std::cout << "ModuleClass::MyFunc(int) called" << std::endl;
}
ModuleClass::ModuleClass(int value){
m_value = value;
std::cout << "ModuleClass::ModuleClass(int) called" << std::endl;
}
ModuleClass::ModuleClass() {
std::cout << "ModuleClass::ModuleClass() called" << std::endl;
}
ModuleClass* __stdcall CreateModuleClass() {
return new ModuleClass();
}
ModuleClass* __stdcall CreateModuleClass(int value) {
return new ModuleClass(value);
}
Source.def
LIBRARY
EXPORTS
ModuleClass_MyFunc=?MyFunc@ModuleClass@@QAEXXZ
ModuleClass_MyFunc_Int=?MyFunc@ModuleClass@@AAEXH@Z
ICreateModuleClassWithInt=??0ModuleClass@@QAE@H@Z
ICreateModuleClass=??0ModuleClass@@QAE@XZ
ModuleClass_s_value=?s_value@ModuleClass@@2HA DATA
CreateModuleClassWithInt=?CreateModuleClass@@YGPAVModuleClass@@H@Z
CreateModuleClass=?CreateModuleClass@@YGPAVModuleClass@@XZ

​ 其中,Source.def文件编写要注意两点:

  • 导出成员函数、函数重载时要注意,只能写被名称修饰后的名称,不能够写原始名称。
image-20240802173114166