在程序运行时更改DLL

时间:2019-06-18 05:00:41

标签: c++ dll codeblocks

我一直想用C ++编写一个游戏,编写与小舰一起战斗的程序。

其中之一是,我希望能够在游戏运行时对其进行编辑,而不必退出并重新编译整个程序。父亲告诉我,我可以使用DLL来执行此操作,方法是让游戏复制所选的DLL文件并从中运行功能,然后在游戏中按重新加载时,它将停止脚本并复制到新的DLL中,继续游戏。

为了测试这个想法,我在Codeblocks中创建了一个简单的程序和DLL项目。控制台程序从DLL一次调用了一个函数$ ls -l /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java -rwxr-xr-x 1 root root 5464 Mar 13 17:50 /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java ,它将返回一个数字以打印到控制台,例如“ 1”,然后我将DLL文件替换为另一个具有相同函数名但而是返回一个不同的数字以打印到控制台。

它不起作用。 Windows试图在运行控制台应用程序时替换DLL文件或thisIsAFunction()文件,但Windows表示它在另一个进程中处于打开状态。

有什么方法可以完成我想做的事情?也就是说,要在程序使用DL​​L文件或其他方法更改函数返回值?

编辑:首先,感谢您,雷米·勒博(Remy Lebeau)帮助解决了所有语法错误。我将很快收集代码以供参考,但似乎有些人建议使用脚本语言代替,这也可能起作用。因此,谢谢您,我也会对此进行调查。因此,解决DLL的所有麻烦真的值得吗?或者我真的应该只使用Python或Lua之类的东西吗?

1 个答案:

答案 0 :(得分:3)

这个想法在理论上是可行的,但是 ...

您不能使用简单的DLL支持,因为它将仅加载一次thisIsAFunction()。您需要在更改DLL后重新加载该功能。这是一个手动过程。您将必须呼叫LoadLibraryGetProcAddressFreeLibrary

此外,除了功能之外,您还需要确保由DLL创建的所有对象均已消失。由于卸载了DLL,因此也要卸载其中的所有析构函数,因此,在析构函数仍处于加载状态时,必须销毁所有需要这些析构函数的对象。