gpt4 book ai didi

c++ - 模块和类处理(动态链接)

转载 作者:行者123 更新时间:2023-11-28 03:50:35 26 4
gpt4 key购买 nike

遇到一点问题,我正在寻找最佳解决方案概念/理论。

我有一个需要使用对象的系统。系统使用的每个对象都有一个已知的接口(interface),可能作为抽象类实现。这些接口(interface)在构建时是已知的,不会改变。要使用的确切实现会有所不同,我事先不知道哪个模块将提供它。唯一的保证是他们会提供接口(interface)。类名和模块 (DLL) 来自配置文件或可以通过编程方式更改。

现在,我现在已经使用一个相对简单的系统设置了所有这些,设置类似这样的东西(重写伪代码,只是为了展示基础知识):

struct ClassID
{
Module * module;
int number;
};

class Module
{
HMODULE module;
function<void * (int)> * createfunc;

static Module * Load(String filename);

IObject * CreateClass(int number)
{
return createfunc(number);
}
};

class ModuleManager
{
bool LoadModule(String filename);

IObject * CreateClass(String classname)
{
ClassID class = AvailableClasses.find(classname);
return class.module->CreateObject(class.number);
}

vector<Module*> LoadedModules;
map<String, ClassID> AvailableClasses;
};

模块有一些导出函数来提供它们提供的类的数量以及这些类的名称/ID,然后将其存储。所有类都派生自 IObject,它有一个虚拟析构函数,存储源模块并有一些方法来获取类的 ID,它实现了什么接口(interface)等等。

唯一的问题是每个模块都必须手动加载到某个地方(目前列在配置文件中)。我想避免明确地这样做(在 ModuleManager 之外,在里面我并不真正关心它是如何实现的)。

我希望有一个类似的系统,而无需处理加载模块,只需创建一个对象(一旦设置完毕)它就会神奇地出现。

我相信这在某些方面类似于 COM 的意图。我简要地研究了 COM 系统,但它似乎有点矫枉过正,令人难以置信。我只需要我的系统中已知的类,不需要它处理的所有其他功能,只需要来自某处的接口(interface)的实现。

我的另一个想法是使用注册表并为所有已知/注册的类及其源模块和编号保留一个 key ,这样我就可以查找它们,它会显示 Manager::CreateClass 神奇地找到并制作了对象。这似乎是一个可行的解决方案,但我不确定它是否是最优的,或者我是否在重新发明一些东西。

所以,毕竟,我的问题是:如何处理这个问题?有没有现成的技术,如果没有,自己怎么设置最好?有什么我应该注意的问题吗?

最佳答案

COM 很可能就是您想要的。它非常广泛,但您不需要使用所有功能。例如,您不需要要求参与者注册 GUID,您可以定义自己的机制来创建接口(interface)实例。有许多模板和其他机制可以轻松创建 COM 接口(interface)。更重要的是,由于它是一个标准,因此很容易记录需求。

要牢记的一件非常重要的事情是,导入/导出 C++ 对象需要所有参与者使用相同的编译器。如果您认为这对您来说可能是个问题,那么您应该使用 COM。如果您乐于接受该限制,那么您可以继续保持现状。

关于c++ - 模块和类处理(动态链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5640602/

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