gpt4 book ai didi

c++ - 何时将整个 C++ 类框架放入 DLL 中?

转载 作者:行者123 更新时间:2023-11-28 05:24:45 25 4
gpt4 key购买 nike

我即将编写一个 C++ 框架,稍后将由不同的 C++ 应用程序使用。该框架将提供一个主类,该类将由应用程序实例化。该主类将使用框架内的一些其他类。并且会有一些帮助类,供应用程序直接使用。

现在我在想我应该如何封装那个类框架。我可以像往常一样编写头文件和源文件,然后将它们包含在将使用该框架的应用程序中,以便所有这些都与应用程序一起编译。

但我不确定这对我来说是否是“最佳”方法。将整个框架放入一个 DLL,然后将该 DLL 链接到应用程序不是一个选择吗?然而,I also read让 DLL 导出整个类通常不是最好的主意,而且这种方法可能 lead to difficulties当使用 STL 模板作为数据成员时。

您能否向我推荐一种方法,也许是我上面没有提到的其他方法,包括。所有这些选择的优缺点?

最佳答案

您可以使用不透明指针创建 C 接口(interface),这在您的情况下是必需的,因为涉及的编译器类型和版本各不相同。请注意,您可能不会接受或返回非 C 类型,除非您还将它们包装在不透明的指针中。这并不难,但您需要做一些工作。

假设有一个类“YourClass”,您将创建一个包含您的 C++ 类代码的 YourClassImpl.h 和 YourClassImpl.cpp(如果需要)。

你的ClassImpl.h

class YourClass
{
private:
int value = 12345;

public:
YourClass() {}
~YourClass() {}

int getThing() { return value; }
void setThing(int newValue) { v = newValue}
};

然后您将创建一个 YourClass.h,它将是您的 C 头文件(由您的 DLL 的用户包含),其中包含一个不透明的指针 typedef 和您的 C 风格接口(interface)的声明。

你的类.h

#ifdef MAKEDLL
# define EXPORT __declspec(dllexport) __cdecl
#else
# define EXPORT __declspec(dllimport) __cdecl
#endif

extern "C"
{
typedef struct YourClass *YC_HANDLE;
EXPORT YC_HANDLE CreateYourClass();
EXPORT void DestroyYourClass(YC_HANDLE h);
EXPORT int YourClassGetThing(YC_HANDLE h);
EXPORT void YourClassSetThing(YC_HANDLE h, int v);
}

在 YourClass.cpp 中,您将定义这些函数。

你的类.cpp

#include "YourClass.h"
#include "YourClassImpl.h"
extern "C"
{
EXPORT YC_HANDLE CreateYourClass()
{
return new YourClass{};
}

EXPORT void DestroyYourClass(YC_HANDLE h)
{
delete h;
}

EXPORT int YourClassGetThing(YC_HANDLE h)
{
return h->getThing();
}

EXPORT void YourClassSetThing(YC_HANDLE h, int v)
{
h->setThing(v);
}
}

在您的用户代码中,它们将包含 YourClass.h。

他们的代码.cpp

#include "YourClass.h"

int ResetValue(int newValue)
{
YC_HANDLE h = CreateYourClass();
auto v = YourClassGetThing(h);
YourClassSetThing(h, newValue);
DestroyYourClass(h);

return v;
}

链接到您的 DLL 的最常用方法是使用 LoadLibrary/GetProcAddress - 我还建议将 .def 文件添加到您的项目以确保函数被命名为“漂亮”并且不难访问,因为任意名称修饰。

需要注意的一些问题:

  1. 只有标准的 C 基本类型可以通过接口(interface)来回传递。不要使用任何 C++ 特定类型或类。
  2. POD 和 POD 阵列对您来说可能是安全的,但要注意任何包装或对齐问题。
  3. 异常不得跨越接口(interface)边界 - 捕获抛出的任何内容并将其转换为返回代码或等效代码。
  4. 确保分配在边界两侧的内存在同一侧释放。

关于c++ - 何时将整个 C++ 类框架放入 DLL 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com