因此,我希望能够在运行时更改应用程序的行为,而不使用任何外部脚本语言。为了达到这个目的,我试着用dll。我有点像:
begin program;
load dll and function pointers;
init_func_ptr();
loop:
if(compiled_new_version)
{
pause threads;
unload dll;
overwrite expired dll with new dll;
load dll and function pointers;
resume threads;
}
update_func_ptr(state);
一开始我没有任何问题。然而,一旦我写了一些实际的代码,我开始崩溃后,重新加载的dll。我手动导出/重新加载的函数指针只有“init”和“update”。
一些关于我撞车的信息。它在某个地方崩溃了,调用堆栈中有一堆地址为“0xCDCDCDCD”的条目(值得一提的是,当我使用Visual Studio作为调试器并且应用程序在调试模式下编译时,就会发生这种情况)。
我相信,当我暂停线程时,其中一个或多个线程正在过期的dll中执行一些代码,所以当我卸载该dll并恢复导致崩溃的线程时。
我怎样才能解决这个问题?
最佳答案
您可能需要在DLL中编写代码,以检查卸载DLL是否安全。例如,进入时的每个函数都会增加一个DLL全局变量,并在退出时将其减去。只有当它为零时,才能安全地卸载DLL。
您可能还需要编写代码来管理DLL是否处于“关闭模式”,并且不应再调用该DLL。例如,一个包装器模块,包含所有导出函数的包装器,这些函数可以暂停调用线程,直到重新加载DLL。注意,这个模块可能不在DLL中。
我建议您首先制作一个框架应用程序来测试这个概念,它包含用于计数、同步和加载的最小函数。