21xrx.com
2025-03-31 08:12:07 Monday
文章检索 我的文章 写文章
C++动态库导出类的方法
2023-07-04 02:23:15 深夜i     13     0
C++动态库 导出类 私有接口 __declspec(dllexport) def文件

在程序开发中,我们有时需要把一些功能封装到类中以便于复用和维护,而动态链接库(DLL)则是常用的提供模块化代码的方式。那么如何在C++动态链接库中导出类呢?下面就来介绍一下。

1. 定义导出函数

在导出类之前,我们需要先定义一个导出函数,用于将类的实例指针传给外部调用者。

extern "C" __declspec(dllexport) MyClass* CreateClassInstance();

在上面的代码中,我们使用了`__declspec(dllexport)`关键字,它的作用是告诉编译器将这个函数导出为DLL的符号。`CreateClassInstance`函数的作用是创建`MyClass`类的实例,然后将其返回给外部调用者。

2. 定义类

接着,我们定义`MyClass`类,这里只简单定义一个成员函数,用于输出一句话。

class MyClass {
public:
  void print() world!" << std::endl;
  
};

3. 实现导出函数

然后,我们在实现文件中实现`CreateClassInstance`函数,实现代码如下:

MyClass* CreateClassInstance() {
  return new MyClass();
}

这里我们只是简单地返回了一个`MyClass`的实例指针。

4. 使用导出的类

最后,我们来看一下如何在另一个程序中使用这个导出的类。假设我们有一个`main.cpp`文件,代码如下:

#include <iostream>
#include <windows.h>
typedef MyClass* (*CreateClassInstanceFn)();
CreateClassInstanceFn createClassInstance;
int main() {
  // 加载动态链接库
  HMODULE hModule = LoadLibrary("MyDll.dll");
  if (!hModule)
    std::cout << "Failed to load DLL file." << std::endl;
    return 0;
  
  // 获取函数指针
  createClassInstance = (CreateClassInstanceFn)GetProcAddress(hModule, "CreateClassInstance");
  if (!createClassInstance)
    std::cout << "Failed to get function address." << std::endl;
    return 0;
  
  // 使用类的实例
  MyClass* pMyClass = createClassInstance();
  pMyClass->print();
  // 释放资源
  delete pMyClass;
  FreeLibrary(hModule);
  return 0;
}

在上面的代码中,我们首先通过`LoadLibrary`函数加载`MyDll.dll`文件,然后通过`GetProcAddress`函数获取`CreateClassInstance`函数的地址。接着,我们就可以使用这个函数创建`MyClass`类的实例,并调用其成员函数`print`来输出一句话。最后,我们释放资源。

总结:

通过上述方法,我们就可以将C++类导出为动态链接库,以便于其他程序能够调用和使用。除此之外,我们还可以将多个类都导出到DLL文件中,以便于实现更为复杂的程序开发。

  
  

评论区

请求出错了