0

我认为模块化是正确的术语。举一个基本的例子,如果我要创建一个加密应用程序,你可以像记事本一样输入,然后保存加密,但是在保存菜单下,有一些选项可以保存你有插件的加密方法,比如 AES、Blowfish 等,并且还允许将新方法编码到插件中并分发,而无需重新编译主应用程序。

我在网上找到了一些解释,但我大部分时间都在努力弄清楚如何让新选项出现在最初不存在的保存菜单下(这可能更像是一个 Windows 应用程序问题),如果你明白我的意思。

鉴于模块化开发似乎是非常特定于平台的,我现在将坚持使用 Windows 示例,并希望在此之后尝试扩大范围。

4

4 回答 4

3

假设 Win32api,你做这样的事情:

现在,当你创建你的 dll 时,你就有了一组所有插件通用的标准函数。或者,每种插件类型的一组标准函数和一个用您的应用程序标识它的函数。这样,您可以测试每个插件的格式是否正确并即时调用动态库中的方法,而无需将它们编译/链接到您的主程序。

该例程在任何支持共享库(DLL、so's 等)的平台上都大体相似。

作为我的意思的代码示例,您可能有一个这样的 plugin.h 文件:

#ifndef PLUGIN_H_
#define PLUGIN_H_

#define PLUGIN_CRYPTO   1
#define PLUGIN_FORMAT   2
#define PLUGIN_EXAMPLE  3

#endif 

然后你在你的主程序和你创建的任何插件中都#include这个头文件。在 plugin-dll.cpp (再次示例)中,您有一个这样的方法:

int GetPluginType()
{
    return PLUGIN_CRYPTO;
}

然后,您可以在此函数的结果之间切换,并将函数指针分配给您要运行的正确例程。

更多实施信息:

仅仅因为,Linux (POSIX) 等价物:

  • dlopen - 动态库打开。
  • dlsym - 等效于 GetProcAddress - 获取函数 ptr 到符号名称。
  • dlclose - 相当于 FreeLibrary
于 2010-02-19T01:06:35.287 回答
0

Windows 包含一个名为 ModifyMenu 的函数,可让您在运行时插入、删除和重新排列菜单条目。更困难的(虽然不是困难)部分是将事物连接起来,因此菜单条目实际上调用了附加功能。

当您选择一个菜单项时,将向程序发送一条包含特定数字的消息。传统的 C 程序将有一个大的 switch 语句来根据该数字决定要做什么。对于在运行时添加的插件,您不能使用 switch 语句,因此您通常使用某种映射结构来代替。

于 2010-02-19T01:04:41.847 回答
0

除了 Jerry 对在运行时填充菜单的解释外,您可能还必须扫描一个设置文件夹(例如 Application Folder\plugins)以查找新的 dll 文件,这些文件将提供某些功能,如加密/解密和 plugin_name 等。Windows 具有以下功能在运行时查找 DLL 文件中的内容。

于 2010-02-19T01:07:33.417 回答
0

如果你写这是c#,你可以使用MEF http://www.codeplex.com/MEF

而且你真的应该用 C# 来做,只有真正的受虐狂才会用 C++ 编写这种 GUI 客户端的东西(等待燃烧)

于 2010-02-19T01:30:52.507 回答