Как использовать функции DLL в неизменяемом исходном коде? - PullRequest
0 голосов
/ 18 мая 2018

Я новичок, поэтому, пожалуйста, не стесняйтесь уточнять и объяснять, что вы имеете в виду.В настоящее время я работаю над сторонним исходным кодом на c ++, для которого я разрабатываю плагины, и который я не хочу изменять по понятным причинам (выходит новая версия, Sharability и т. Д.).Авторы стороннего кода подготовились к использованию плагинов с помощью внешнего файла инструкций, в котором параметры и тому подобное задаются с помощью ключевых слов.Создание объекта считывает ключевые слова в инструкции и находит на фабрике, было ли ключевое слово объявлено.Если это так, он вызывает указанный конструктор, в противном случае вызывает конструктор по умолчанию.До сих пор мне приходилось иметь дело только с такими объектами, связанными с фабрикой, поэтому я создал библиотеки DLL, которые определяют подклассы и вызывают связанный конструктор, используя файл инструкций.Затем я мог бы использовать перегруженные или переопределенные функции, определенные в dll, в остальной части основной программы (поскольку созданный объект принадлежал подклассу).

Причина этого вопроса в том, что я нехотите коснуться исходного исходного кода и все еще хотите перегрузить / переопределить функцию, используемую в основной программе, но она не определена в объекте, связанном с фабрикой.Это основная программная декларация функции в классе TrajectoryLoader:

namespace NAF {
    class TrajectoryLoader : public Object {
    public:
        NAF_CORE_API TrajectoryLoader() { _good = false; }
        NAF_CORE_API virtual ~TrajectoryLoader() {}
        NAF_CORE_API virtual bool LoadTrajectory(std::string filename);
        NAF_OBJ_DECLARES(TrajectoryLoader)
    private:
        CSVRange _range;
        bool _good;
    };

}

. Я хочу перегрузить / переопределить виртуальный bool LoadTrajectory NAF_CORE_API, который загружает и анализирует файл аргументов для создания "Траектория "объект будет использоваться позже.Мне нужно разрешить разные форматы файлов, поскольку теперь он получает только определенный синтаксис записи.

Я подумал, что мог бы создать подкласс для TrajectoryLoader и вызвать перегруженную версию LoadTrajectory, но основной кодвызывает LoadTrajectory следующим образом:

traj = std::make_shared<TrajectoryLoader>();
traj->NAFSetName(id);
traj->LoadTrajectory(v);

с "v" - полным именем файла, который я хочу загрузить.Даже с определенным подклассом, я ожидаю, что «traj» из родительского класса, Loadtrajectory будет не переопределенной функцией (я также проверял это).

Тогда возникают вопросы: Могу ли я сделатьэто второй фрагмент кода вызова для перегруженной версии LoadTrajectory?(Я предполагаю, что ответ будет отрицательным) и Как я могу заставить основную программу (которую я не хочу изменять) вызывать функции из моей собственной библиотеки DLL во время выполнения?

Я надеюсь, что я ясен в своем запросе, но я признаю, что только запустил C ++ для этого проекта, поэтому, возможно, я пропустил некоторые простые приемы, которые сработали бы.Я два дня искал в интернете, пытаясь найти способ, но не нашел.

Также возможно, что это невозможно сделать, и в этом случае мне придется искать другой способ заставить все работать.

Спасибо за вашу помощь, и извините за долгое времясообщение или, если это дубликат, я могу пропустить технический термин, чтобы найти то, что я хочу.

С любовью

Мортимер

править: пытаться уточнить вопрос.

1 Ответ

0 голосов
/ 18 мая 2018

Проблема в основном в следующем фрагменте из EXE:

traj = std :: make_shared ();traj-> NAFSetName (ID);traj-> LoadTrajectory (v);

Поскольку компилятор видел этот фрагмент при создании EXE-файла, он знает, что LoadTrajectory равно TrajectoryLoader::LoadTrajectory.Вместо фактического вызова компилятор может встроить функцию.Это означает, что он берет тело функции и вставляет его туда, где вы ожидаете, что инструкция по сборке CALL будет.

Evn, если это не будет сделано, компилятор вставит прямой вызов точноTrajectoryLoader::LoadTrajectory.

Теперь во время выполнения ОС знает о некоторых вызовах функций, когда компилятор (или программист) указал, что вызовы выполняются через библиотеки DLL.Вот как работает механизм плагинов.Но все вызовы функций, которые являются внутренними для EXE или DLL, невидимы для ОС.

...