0

因此,我希望能够在运行时更改应用程序的行为,而无需使用任何外部脚本语言。为了实现这一点,我尝试使用 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 后就开始崩溃。只有我手动导出/重新加载的函数指针是“初始化”和“更新”。

关于我遇到的崩溃的一些信息。它在不知不觉中崩溃,调用堆栈中有一堆地址为“0xCDCDCDCD”的条目(值得一提的是,当我使用 Visual Studio 作为调试器并且应用程序在调试模式下编译时会发生这种情况)。

我相信发生的是,当我暂停线程时,它们中的一个或多个正在过期的 dll 中执行一些代码,所以当我卸载该 dll 并恢复它们导致崩溃的线程时。

我怎么解决这个问题?

4

1 回答 1

2

您可能需要在 DLL 中编写代码以检查卸载 DLL 是否安全。例如,每个函数在进入时都会增加一个 DLL 全局变量,并在退出时将其递减。只有当它为零时,DLL 才能安全卸载。

您可能还需要编写代码来管理 DLL 处于“关闭模式”并且不应再被调用。例如,一个包含所有导出函数的包装器的包装器模块,它可以暂停调用线程,直到重新加载 DLL。请注意,此模块可能不能在 DLL 本身中。

我建议您首先制作一个框架应用程序来测试包含用于计数、同步和加载的最小功能的概念。

于 2016-09-17T15:20:01.233 回答