Я пишу (C) программу, которая использует систему плагинов через dlopen ().Камень преткновения, с которым я сталкиваюсь, заключается в том, что основная программа экспортирует несколько функций, которым действительно нужно знать плагин, который их вызвал (в основном, ведение записей, и поэтому плагин может быть выгружен правильно, так как он добавляет такие вещи, как указатели на функции в основнойпрограмма).
Я не могу найти чистый способ сделать это.Опции, которые я до сих пор предлагал:
- требуют, чтобы плагин предоставлял свое имя, или некоторые данные, которые я передаю при загрузке, в качестве аргумента для функций.
- Мне не нравится эта опция, потому что не все функции заботятся о том, от кого они были вызваны, поэтому это делает их непоследовательными и грязными.Кроме того, я хотел бы сделать так, чтобы плагину было как можно сложнее лгать о том, кто он такой:
- Используйте backtrace (), чтобы определить имя объекта предыдущей функции.
- Это выглядит довольно уродливо и непереносимо.
- Требуется, чтобы плагин поместил структуру уровня файла (или другую переменную), содержащую его имя (давайте назовем его'plugin_info' для обсуждения).Затем используйте dlsym () при загрузке плагина, чтобы найти переменную и проиндексировать ее (как в хэше) по ее имени.Затем вставьте в макрос #define, который используют плагины для вызова функций, и добавьте макрос
&plugin_info
в качестве аргумента. - Это то, что я сейчас использую, но кажется хакерским.Для одного вы должны пройти макрос '& plugin_info', если вы просто передадите 'plugin_info', то он извлекает 'plugin_info' из основной программы, а не из плагина.Ссылка на него по адресу, кажется, делает его таким, чтобы он компилировался с правильным, и что он не перемещался.Это заставляет меня не любить эту опцию, так как она выглядит как неопределенное поведение, однако она работает.Также макросы могут немного сбивать с толку, когда у разработчика плагина возникает проблема с вызовом функции (передача неверного типа аргумента или еще много чего).
Если есть другие идеи илитехники, я хотел бы любить знать.