Простое модульное руководство на C / ++? - PullRequest
0 голосов
/ 19 февраля 2010

Я думаю, что модульный это правильный термин;привести базовый пример, если бы я должен был создать приложение для шифрования, которое можно было бы напечатать как блокнот, а затем сохранить в зашифрованном виде, однако в меню «Сохранить» есть варианты сохранения для методов шифрования, для которых у вас есть плагины, такие как AES, Blowfish и т. д., а также позволяют кодировать новые методы в плагине и распространять их без необходимости перекомпиляции основного приложения.

Я нашел несколько объяснений в Интернете, но я в основном изо всех сил пытаюсь понять, как выесли бы вы поняли то, что я имею в виду, в меню сохранения появилось бы новое меню в меню сохранения, которое изначально не существовало (возможно, это скорее вопрос приложения Windows).

Поскольку модульная разработка кажется очень специфичной для платформы, яЯ пока остановлюсь на примерах Windows и, надеюсь, постараюсь разобраться с этим.

Ответы [ 4 ]

3 голосов
/ 19 февраля 2010

Предполагая Win32api, вы делаете что-то вроде этого:

  • Есть каталог плагинов для вашего приложения.
  • При загрузке приложения перечислите все файлы в этом каталоге
  • Любой с расширением DLL загружается с помощью вызова LoadLibrary .
  • Вы получаете некоторую информацию от dll, которая говорит вам, как зовут плагин
  • Вы соответствующим образом создаете изменения меню / пользовательского интерфейса.

Теперь, когда вы создаете свою DLL, у вас есть стандартный набор функций, общих для всех плагинов. Или стандартный набор функций для каждого типа плагина и функция, которая идентифицирует это с вашим приложением. Таким образом, вы можете протестировать каждый плагин правильной формы и на лету вызывать методы в динамической библиотеке без необходимости компилировать / связывать их с вашей основной программой.

Процедура в целом похожа на любую платформу, которая поддерживает общие библиотеки (DLL и т. Д.).

В качестве примера кода, который я имею в виду, у вас может быть файл plugin.h, подобный этому:

#ifndef PLUGIN_H_
#define PLUGIN_H_

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

#endif 

Затем вы # включаете этот заголовок как в основную программу, так и во все создаваемые плагины. В plugin-dll.cpp (снова пример) у вас есть такой метод:

int GetPluginType()
{
    return PLUGIN_CRYPTO;
}

Затем вы можете переключаться между результатами этой функции и назначать указатели функций для правильных подпрограмм, которые вы хотите запустить.

Подробнее об имплантации:

  • GetProcAddress () - найти имя функции в библиотеке. Пример с включенными указателями на функции.
  • FreeLibary - для освобождения чего-либо, открытого с помощью LoadLibrary.
  • FindFirstFileEx , FindNextFile и CloseFind для поиска в каталоге.

Только потому, что Linux (POSIX) эквиваленты:

  • dlopen - Динамическая библиотека открыта.
  • dlsym - эквивалент GetProcAddress - получить функцию ptr для имени символа.
  • dlclose - эквивалент FreeLibrary
0 голосов
/ 19 февраля 2010

Если вы напишите это на C #, вы можете использовать MEF http://www.codeplex.com/MEF

, и вам действительно следует делать это в C #, только настоящие мазохисты могли бы написать этот тип GUI-клиента на C ++ (готовность к)

0 голосов
/ 19 февраля 2010

Наряду с объяснением Джерри о заполнении меню во время выполнения, вам, вероятно, придется сканировать заданную папку (скажем, Папка приложения \ плагины) на наличие новых файлов DLL, которые будут обеспечивать определенные функции, такие как encrypt / decrypt и plugin_name, и т. Д.имеет средства для поиска вещей в DLL-файлах во время выполнения.

0 голосов
/ 19 февраля 2010

Windows включает функцию с именем ModifyMenu, которая позволит вам вставлять, удалять и переставлять пункты меню во время выполнения. Более сложная (хотя и не партия более сложная) часть соединяет вещи, поэтому пункт меню фактически вызывает дополнительные функции.

При выборе пункта меню в программу отправляется сообщение, содержащее определенный номер. У обычной программы на Си будет большой оператор switch, чтобы решить, что делать на основе этого числа. Для плагина, который добавляется во время выполнения, вы не можете использовать оператор switch, поэтому вместо этого вы обычно используете какую-то структуру карты.

...