DLL在c中交换,我做错了吗?

时间:2016-09-17 14:28:19

标签: c windows dll reloading

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

有关我遇到的崩溃的一些信息。它在不知名的地方崩溃,在callstack中有一堆条目带有地址' 0xCDCDCDCD'(值得一提的是,当我使用Visual Studio时会发生这种情况因为调试器和应用程序是在调试模式下编译的。)

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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

我建议你首先制作一个骨架应用程序,用于测试包含计数,同步和加载的最小函数的概念。