2012-06-12 1 views
3

Предположим, что у вас есть функция read_key и обычно это что-то не так. Вы должны быть в состоянии заменить его своей функцией read_key_myfunction, и он делает другие вещи. Общий подход, разумеется, заключался бы в создании указателей функций массива и регистров или с использованием простых операторов switch (или обоих).Динамический интерфейс для функций в C

Но моя цель немного шире: люди должны иметь возможность писать свой C-материал и НЕ мешать моему коду, и он все равно должен регистрироваться. Конечно, я говорю им, какой интерфейс реализовать.

Теперь они в основном выполняют программу для моего программного обеспечения, которое я динамически загружаю на основе параметра конфигурации. Подумайте об этом как о механизмах OpenSSLs: каждый может написать свой собственный движок, скомпилировать его как dll/so и распространить. Им не нужно изменять (или знать) код OpenSSLs, если они придерживаются определенного интерфейса.

Я просто хочу то же самое (в конце концов это будет оболочка для функций двигателя OpenSSL) для моей программы.

Коллега предложил мне использовать функцию в каждом файле и динамически загружать библиотеки. Это звучит как хорошее решение для меня, но я не совсем удовлетворен, так как я не вижу OpenSSL, используя любую не зависящую от двигателя функцию в своем коде двигателя.

Если некоторые вещи непонятны вот мой конкретный пример:

Я простирающаяся программу под названием sscep, который реализует протокол для автоматического обновления сертификата. В будущем в HSM будет много криптографии (и сейчас это должно происходить в Windows Key Management (к которому обращается капитальный движок OpenSSL)).

Хотя OpenSSL уже обслуживает общий интерфейс, есть некоторые вещи, которые мне нужно сделать заранее, и это зависит от используемого двигателя. Я также хочу открыть возможность для всех остальных быстро продлить его, не вникая в мой код (например, я имел от человека передо мной).

Если у кого-то есть идеи, было бы полезно увидеть какой-то ориентир. Заранее спасибо.

ответ

2

То, что вы описываете, обычно называется плагиновой архитектурой/плагином. Вам необходимо объединить функции кросс-платформенной dlopen/LoadLibrary с некоторой логикой для регистрации и выполнения поиска экспортируемых функций. Вы должны найти примеры того, как это сделать в Интернете.

+0

Я буду изучать это, но мне кажется, что это то, что мне нужно. Спасибо. – javex

Смежные вопросы