gpt4 book ai didi

c++ - 托管 C++ - 根据配置文件导入不同的 DLL

转载 作者:行者123 更新时间:2023-11-30 04:40:42 25 4
gpt4 key购买 nike

我目前正在编写一个应用程序,该应用程序将为多个客户端提供类似的目的,但需要调整它处理所提供数据的方式。从本质上讲,它将服务于相同的目的,但以完全不同的方式分发数据。

所以我决定像这样:-制作通用引擎库,将包含所有方式的通用功能,并提供默认界面,确保不同的引擎将以相同的方式响应。- 为每种功能编写一个特定的引擎....每个都编译成自己的 .dll。

所以我的项目最终会得到一堆库,其中一些看起来像这样:project_engine_base.dllproject_engine_way1.dllproject_engine_way2.dll

现在在我们用于用户首选项的配置文件中将有一个引擎部分,以便我们可以决定使用哪个引擎:

[ENGINE]
Way1

所以在代码的某处我们想要做的是:

If (this->M_ENGINE == "Way1")
//load dll for way1
Else If (this->M_ENGINE == "Way2")
//load dll for way2
Else
//no engines selected...tell user to modify settings and restart application

问题是...我将如何以这种方式导入我的 dll?有可能吗?如果不能,我能否就如何实现类似的功能方式获得一些建议?

我知道我可以在一开始就导入所有的 dll,然后选择要使用的引擎,但我的想法是我不想无意义地导入太多引擎并浪费资源,我们没有这样做。不想将所有这些 dll 发送给我们的客户。一位客户将使用一台发动机,另一位客户将使用另一台发动机。我们的一些客户可能会使用多个,因此我想将其外部化并允许我们的用户使用配置文件进行引擎切换。

有什么想法吗?

编辑:刚刚意识到,如果我的每个引擎在运行时动态加载并且没有在项目中全部引用,即使我的每个引擎都会呈现相同的界面,我的项目也不会编译。所以我别无选择,只能将它们全部包含在我的项目中,不是吗?

这也意味着它们都必须运送给我的客户。配置中的设置只会指示我用来初始化我的引擎成员的类。

我可以将这些引擎中的每一个都编译成相同的名称。在我的主项目中只导入一个 dll,并且将一直使用该特定引擎。这将使我的客户无法将我们的应用程序用于他们自己的多个客户。除非他们愿意手动切换 dll。

有什么建议吗?

编辑#2:在这一点上看到我的选择,我也可以制作一个包含基本引擎以及所有子引擎和我的配置的大 dll 来让用户选择。而不是引用多个 dll 并将它们全部发送。只需拥有一个巨大的,然后仅运送/引用那个。我也不太喜欢这个,因为它意味着将一个大的 dll 发送给我的所有客户,而不是仅仅满足他们需要的一两个小的 dll。不过,这仍然是我提出的最佳解决方案。

我仍在寻找更好的建议或我原来问题的答案。谢谢。

最佳答案

为每个引擎使用单独的 DLL 并使用 LoadLibrary在您的主项目中根据配置加载特定引擎。

将您的引擎接口(interface)放在一些通用头文件中,所有引擎都将从该头文件派生,并且该接口(interface)也将在您的主项目中使用。

它可能看起来像这样:

// this should be an abstract class
class engine {
public:
virtual void func1() = 0;
virtual void func2() = 0;
...
};

在每个不同的引擎实现中,从 DLL 中导出一个函数,如下所示:

// might aswell use auto_ptr here
engine* getEngine() { return new EngineImplementationNumberOne(); }

现在在您的主项目中,只需使用 LoadLibrary 加载您感兴趣的 DLL,然后使用 GetProcAddress 和 getEngine 函数。

string dllname;

if (this->M_ENGINE == "Way1")
dllname = "dllname1.dll";
else if (this->M_ENGINE == "Way2")
dllname = "dllname2.dll";
else
throw configuration_error();

HMODULE h = LoadLibraryA(dllname.c_str());
typedef engine* (*TCreateEngine)();

TCreateEngine func = (TCreateEngine)GetProcAddress(h, "getEngine");
engine* e = func();

导出函数的名称可能会被破坏,因此您可以在 DLL 中使用 DEF 文件或 extern "C",同时不要忘记检查错误。

关于c++ - 托管 C++ - 根据配置文件导入不同的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/864858/

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