简单的C / ++模块化指南?

时间:2010-02-19 00:58:08

标签: c++ windows modular

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

我在网上找到了几个解释但是我很想知道如何在最初不存在的保存菜单下显示新的选项(这可能是更多的Windows应用程序问题)如果你理解我的意思。

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

4 个答案:

答案 0 :(得分:3)

假设Win32api,你可以这样做:

  • 为您的应用程序设置一个插件目录。
  • 在加载应用程序时,列出该目录中的所有文件
  • 如果您使用扩展程序DLL,则可以使用LoadLibrary调用加载。
  • 您可以从dll中获取一些信息,告诉您插件的名称是什么
  • 您可以适当地创建菜单/ ui更改。

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

该例程在任何支持共享库的平台上都大致相似(DLL,等等)。

作为我的意思的代码示例,你可能有一个像这样的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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

除了Jerry关于在运行时填充菜单的说明之外,您可能还必须扫描一个set文件夹(比如Application Folder \ plugins)以获取新的dll文件,这些文件将提供某些功能,如encrypt / decrypt和plugin_name等.Windows具有在运行时在DLL文件中查找内容的工具。

答案 3 :(得分:0)

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

并且你真的应该在C#中做到这一点,只有真正的masochists会用C ++编写这种GUI客户端的东西(等待火焰燃烧)