DLL 在 c 中交换,我做错了吗?
DLL swapping in c, am I doing it wrong?
所以我希望能够在运行时更改我的应用程序的行为,而无需使用任何外部脚本语言。为了实现这一目标,我尝试使用 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 后开始崩溃。只有我手动 exporting/reloading 的函数指针是 'init' 和更新'。
有关我遇到的崩溃的一些信息。它在不知名的地方崩溃,调用堆栈中有一堆条目,地址为“0xCDCDCDCD”(值得一提的是,当我使用 Visual Studio 作为调试器并且应用程序在调试中编译时会发生这种情况模式)。
我认为发生的事情是,当我暂停线程时,其中一个或多个线程正在过期的 dll 中执行一些代码,因此当我卸载该 dll 并恢复线程时,它们导致了崩溃。
我该如何解决这个问题?
您可能需要在 DLL 中编写代码来检查卸载 DLL 是否安全。例如,每个函数在进入时递增一个 DLL 全局变量并在退出时递减它。只有为零才能安全卸载DLL。
您可能还需要编写代码来管理 DLL 在 "shutdown mode" 中并且不应再被调用。例如,一个包装器模块,其中包含所有导出函数的包装器,可以暂停调用线程,直到重新加载 DLL。请注意,此模块可能不能位于 DLL 本身中。
我建议你先做一个框架应用来测试这个概念,其中包含最小的计数、同步和加载功能。
所以我希望能够在运行时更改我的应用程序的行为,而无需使用任何外部脚本语言。为了实现这一目标,我尝试使用 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 后开始崩溃。只有我手动 exporting/reloading 的函数指针是 'init' 和更新'。
有关我遇到的崩溃的一些信息。它在不知名的地方崩溃,调用堆栈中有一堆条目,地址为“0xCDCDCDCD”(值得一提的是,当我使用 Visual Studio 作为调试器并且应用程序在调试中编译时会发生这种情况模式)。
我认为发生的事情是,当我暂停线程时,其中一个或多个线程正在过期的 dll 中执行一些代码,因此当我卸载该 dll 并恢复线程时,它们导致了崩溃。
我该如何解决这个问题?
您可能需要在 DLL 中编写代码来检查卸载 DLL 是否安全。例如,每个函数在进入时递增一个 DLL 全局变量并在退出时递减它。只有为零才能安全卸载DLL。
您可能还需要编写代码来管理 DLL 在 "shutdown mode" 中并且不应再被调用。例如,一个包装器模块,其中包含所有导出函数的包装器,可以暂停调用线程,直到重新加载 DLL。请注意,此模块可能不能位于 DLL 本身中。
我建议你先做一个框架应用来测试这个概念,其中包含最小的计数、同步和加载功能。