Изменение DLL во время работы программы - PullRequest
0 голосов
/ 18 июня 2019

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

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

Чтобы проверить эту идею, я сделал простую программу и проект DLL в Codeblocks.Однажды консольная программа вызвала функцию thisIsAFunction() из DLL, которая вернула бы число для печати на консоль, например, «1», затем я бы заменил файл DLL другим файлом DLL, который имеет то же имя функции, но вместо этого возвращаетдругой номер для вывода на консоль.

Не работает.Пытаясь заменить файл DLL или файл library.a во время работы консольного приложения, Windows сообщает, что оно открыто в другом процессе.

Есть ли способ выполнить то, что я хочу сделать?То есть, чтобы изменить возвращаемое значение функции во время программы, используя файлы DLL или что-то еще?

РЕДАКТИРОВАТЬ: Прежде всего спасибо, Реми Лебо, за помощь в исправлении всех грамматических ошибок.Вскоре я соберу код для размещения здесь для справки, но некоторые из вас рекомендуют использовать язык сценариев, который тоже может сработать.Так что спасибо, я тоже буду в этом разбираться.Так стоит ли на самом деле проходить через все проблемы с DLL или мне просто нужно использовать что-то вроде Python или Lua?

1 Ответ

3 голосов
/ 18 июня 2019

Идея теоретически возможна, , но ...

Вы не можете использовать простую поддержку DLL, так как это загрузит thisIsAFunction() один раз. Вам необходимо перезагрузить эту функцию после изменения DLL. Это ручной процесс. Вам придется звонить LoadLibrary, GetProcAddress и FreeLibrary.

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

...