- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 LoadLibrary
和 GetProcAddress
从某些 dll(插入我的应用程序)中调用函数,但我不希望它们能够通过包含一个无限循环或挂起自己来挂起我的程序,所以我试图使用 boost::thread
(没有经验)来规避它。但是,如果某个函数挂起,我会在调用 FreeLibrary
进行清理时因 ACCESS_DENIED (0x00000005) 而崩溃。
这是重现问题的最小 DLL (mydll.dll
):
extern "C" {
void __declspec(dllexport) foo() {
for(;;); //<-- infinite loop
}
}
这是一个崩溃的最小 cpp。为简洁起见,我省略了错误检查,但我可以向您保证没有给出任何错误:
#include <boost/thread.hpp>
#include <iostream>
#include <windows.h>
int main() {
using FuncType = void (*)();
HMODULE dll = LoadLibrary("mydll.dll");
FuncType func = (FuncType)GetProcAddress(dll, "foo");
boost::thread thr = [func] {func();};
if (!thr.timed_join(boost::posix_time::seconds(1))) {
std::cout << "Timed out.";
//thr.detach();
FreeLibrary(dll);
}
for (;;);
}
运行时,“超时”。被打印出来,崩溃时的调用栈(gdb on CodeBlocks)如下:
#0 00000000 0x6c1c1214 in ??() (??:??)
#1 0040133E operator() (__closure=<optimized out>) (C:\...\thread test.cpp:17)
#5 00000000 0x00000000 in ??() (??:??)
如果没有优化,那就变成了:
#0 00000000 0x6c1c1214 in ??() (??:??)
#1 00401348 operator() (__closure=0x898f90) (C:\...\thread test.cpp:17)
#2 00401780 boost::detail::thread_data<main()::<lambda()> >::run(void)(this=0x898f70) (c:/.../boost/thread/detail/thread.hpp:62)
#5 00000000 0x00000000 in ??() (??:??)
我尝试的第一件事是在我在上面注释掉的 thr.detach();
行中添加,但结果相同。
我也试过以下方法都无济于事:
FreeLibrary
行 --- 工作正常,但我宁愿在加载后释放它,即使它是基于引用的。我也对以后的这种行为持谨慎态度。LoadLibrary
或任何东西并内联无限循环 --- 工作正常,但我需要使用 DLL:boost::thread thr = []{for (;;);};
DLL 和 cpp 都是在 Windows 7 64 位上使用 GCC 4.7.1 和 32 位输出类型编译的。我的 Boost 版本是 1.49.0。如果没记错的话,我想在转移到另一台计算机之前,我在 Windows XP 32 位(相同的编译器等)上进行了一两次测试。
为什么会崩溃?如何确保我动态调用的函数不会挂起我的程序?
最佳答案
从根本上说,您不能那样做。线程不提供那种隔离。如果需要,请使用流程。
关于c++ - 使用 boost::timed_join 和 FreeLibrary 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468752/
在多个动态链接库的解决方案中,每次基本上只有一个库“MyLibrary.dll”会发生堆损坏,但对于“MyOtherLibrary.dll”则不会。相关代码: HINSTANCE hModule; h
我正在编写一个 DLL,需要多次动态调用一个单独的 DLL。我想保持被调用者加载,然后在我的 DLL 卸载时卸载它。但根据微软的说法,这是一个 bad idea . The entry point f
大家好! 我写了一些我在我的项目中使用的dll。在 I 类的构造函数中加载库 lib = LoadLibrary(L"library.dll");,在析构函数中我使用释放它如果(库) 自由库(lib)
我没有在文档中找到这个:如果我需要一个 DLL 处理程序直到程序结束,我是否仍然应该在我的调用程序结束之前调用 FreeLibrary,还是不需要? 最佳答案 最佳做法是始终为任何相应的LoadL
我已经实现了一个包含 DllMain() 入口函数的 DLL:- BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call
我在现场得到了 drwtsn32 生成的故障转储,显示应用程序在调用系统 API FreeLibrary 时被阻止。这是类堆栈: ChildEBP RetAddr Args to Child 06f
我将在运行时加载共享库的依赖于操作系统的 API 包装在一个可移植的接口(interface)中。 问题是,在记录 close() 函数时,我注意到没有关于 dlclose() 或 FreeLibra
我必须在 Delphi XE7 中编写一个 DLL。我想在 DLL 中使用 TParallel.For。 DLL 被加载到 C++ 应用程序中,一切正常。但是,当应用程序终止或调用 FreeLibra
问题 我有一个第三方 DLL,当它试图从我的 native C 应用程序中卸载它时抛出一个未处理的异常。这导致调用 FreeLibrary失败,并且该模块仍在我的进程中加载。 是否有强制卸载库的选
我正在编写一个代理库(称为库 A),它只是与系统上可能存在或不存在的另一个 DLL(称为库 B)的接口(interface)。这个想法是程序将链接到这个库 A 而不是原始库 B ;如果系统上没有安装库
我很震惊地跟踪这个简单的代码: #include void foo() { for (int i = 0; i >(const std::chrono::duration > & _Rel
我想创建一个 dll,在某些情况下自行卸载,这意味着 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID
我正在查看某人的代码(也许是你的 :D ),其中有一个名为 FreeLibrary() 的函数。 我想知道这个函数是否也适用于 linux。实际上,我尝试用谷歌搜索它,但只得到一些与 Windows
从MSDN文档中可以看出,在DllMain入口函数中不应该调用LoadLibrary/FreeLibrary。 The entry-point function should perform only
我有一个 dll,它导出一个返回接口(interface)的函数。 我为 LoadLibrary、GetProcAddress 和 FreeLibrary 函数创建了一个包装器,用于调用导出的函数。
我今天遇到了这个错误,原来是因为我在调用 FreeLibrary() 后使用了一个字符串从我的 DLL 中分配。 这是一个重现崩溃的简单示例。这进入 DLL: void dllFunc(char **
我有一个应该转换为库的应用程序。我只复制了项目 dpr 并更改了源文件: library aLibrary; uses FastMM4, Forms, SysUtils, Wind
我需要使用 LoadLibrary 和 GetProcAddress 从某些 dll(插入我的应用程序)中调用函数,但我不希望它们能够通过包含一个无限循环或挂起自己来挂起我的程序,所以我试图使用 bo
我正在开发一个与 native DLL 交互的 Web 服务,我使用 LoadLibrary/GetModuleHandle/FreeLIbrary 和 GetProcAddress 来动态加载/卸载
这是我在 DLL 中的代码: procedure TTaskTest; begin TTask.Run( procedure begin Sleep(300);
我是一名优秀的程序员,十分优秀!