2010-02-19 58 views
0

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

我在网上找到了一些解释,但我主要是努力让我的头在如何得到新的选项出现在最初不存在的保存菜单下(这可能更多的Windows应用程序问题),如果你明白我的意思。

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

回答

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 

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

int GetPluginType() 
{ 
    return PLUGIN_CRYPTO; 
} 

然后你可以在此函数的结果之间切换分配函数指针要运行正确的程序。对于implenentation

更多信息:

只是因为,Linux操作系统(POSIX)当量:

  • dlopen - 动态库开放。
  • dlsym - 相当于GetProcAddress - 获取函数ptr到符号名称。
  • dlclose - 相当于FreeLibrary则
0

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

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

0

随着填充在运行时菜单的杰里的解释,你可能会扫描一组文件夹(比如应用程序文件夹\插件)为新的DLL文件,这将提供某些功能,比如加密/解密和plugin_name等.Windows具有在运行时查找DLL文件的功能。

0

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

,你真的应该做它在C#中,唯一真正的受虐狂会写这样的GUI客户端的东西在C++(用于燃烧站在)