如何在DLL之间共享类

Jam*_*ale 0 c++ dll winapi

我有一个使用多个C++ DLL的非托管Win32 C++应用程序.每个DLL都需要使用类Foo - 定义和实现.

Foo.h和Foo.cpp在哪里生存,以便DLL链接并且最终不会在内存中复制代码?

这是合理的事吗?

[编辑] 下面的所有答案和评论都有很多好的信息- 不仅仅是我标记为答案的那些.感谢大家的投入.

Joh*_*ing 5

通过DLL以类的形式提供功能本身就很好.但是,您需要注意从实现中分离出接口.多么小心取决于你的DLL的使用方式.对于保留在内部的玩具项目或公用事业,您可能不需要考虑它.对于将由谁知道哪个编译器的多个客户端使用的DLL,您需要非常小心.

考虑:

class MyGizmo
{
public:
  std::string get_name() const;
private:
  std::string name_;
};
Run Code Online (Sandbox Code Playgroud)

如果MyGizmo要由第三方使用,这个课程将使您无所畏惧.显然,私有成员变量是一个问题,但返回类型get_name()也是一个问题.原因是因为std::string它的实现细节是它定义的一部分.标准规定了最小功能集std::string,但编译器编写者可以自由选择.一个人可能有一个名为realloc()处理内部重新分配的函数,而另一个函数可能有一个名为buy_node()或者其他的函数.数据成员也是如此.一个实现可以使用3 size_t和a char*,而另一个可以使用std::vector.重点是您的编译器可能认为std::string是n个字节并且具有某些成员,而另一个编译器(或者甚至是同一编译器的另一个补丁级别)可能认为它看起来完全不同.

对此的一个解决方案是使用接口.在DLL的公共头文件中,声明一个表示DLL提供的有用功能的抽象类,以及创建类的方法,例如:

DLL.H:

class MyGizmo
{
public:
  static MyGizmo* Create();
  virtual void get_name(char* buffer_alloc_by_caller, size_t size_of_buffer) const = 0;
  virtual ~MyGizmo();
private:
  MyGizmo();  // nobody can create this except myself

};
Run Code Online (Sandbox Code Playgroud)

...然后在你的DLL的内部,你定义一个实际实现的类MyGizmo:

mygizmo.cpp:

class MyConcreteGizmo : public MyGizmo
{
public:
  void get_name(char* buf, size_t sz) const { /*...*/ }
  ~MyGizmo() { /*...*/ }
private:
  std::string name_;
};

MyGizmo* MyGizmo::Create()
{
  return new MyConcreteGizmo;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一种痛苦,而且确实如此.如果您的DLL仅由一个编译器在内部使用,则可能没有理由去解决问题.但是,如果您的DLL将在内部或外部客户端使用我的多个编译器,那么这样做可以避免重大问题.