捕获没有return的dll函数
Catch dll function that does not return
我必须使用 .dll 库才能访问我想要控制的硬件。
问题是,该 dll 的某些功能有时不 return。他们似乎陷入了无限循环之类的。
我的想法是 运行 函数在不同的线程中调用,如果一段时间后它是 stuck/does 而不是 return 则终止线程。
为了做到这一点,我写了类似的东西:
template<typename... multiple>
void MyClass::genericCommandHandler(void *function, multiple... args)
{
//timer start --> check somewhere else
std::thread t{&MyClass::threadWorker<void(*)(...)>, function, args...};
t.join();
}
但它不编译:error C2672: 'std::invoke': no matching overloaded function found
另一个问题是 std::thread 没有终止或停止功能。
有没有人知道如何处理不 return 的 dll?
将 DLL 隔离在它自己的线程中并没有多大帮助,但这个想法是有道理的。最好将 DLL 隔离在它自己的辅助进程中。然后您将终止整个辅助进程。
这必然不是一个干净的出口。这是问题固有的。您不知道 DLL 是如何破坏内部状态的。这就是辅助进程存在的原因:避免混合 DLL 状态和您的状态。
管理子进程的 C++ 标准方法是 std::system
,但在控制方面存在同样的问题。你需要原生 CreateProcess
.
作为鸟枪方法,您可以在 DLL 的线程上尝试 CancelSynchronousIo
。
我必须使用 .dll 库才能访问我想要控制的硬件。
问题是,该 dll 的某些功能有时不 return。他们似乎陷入了无限循环之类的。
我的想法是 运行 函数在不同的线程中调用,如果一段时间后它是 stuck/does 而不是 return 则终止线程。 为了做到这一点,我写了类似的东西:
template<typename... multiple>
void MyClass::genericCommandHandler(void *function, multiple... args)
{
//timer start --> check somewhere else
std::thread t{&MyClass::threadWorker<void(*)(...)>, function, args...};
t.join();
}
但它不编译:error C2672: 'std::invoke': no matching overloaded function found
另一个问题是 std::thread 没有终止或停止功能。
有没有人知道如何处理不 return 的 dll?
将 DLL 隔离在它自己的线程中并没有多大帮助,但这个想法是有道理的。最好将 DLL 隔离在它自己的辅助进程中。然后您将终止整个辅助进程。
这必然不是一个干净的出口。这是问题固有的。您不知道 DLL 是如何破坏内部状态的。这就是辅助进程存在的原因:避免混合 DLL 状态和您的状态。
管理子进程的 C++ 标准方法是 std::system
,但在控制方面存在同样的问题。你需要原生 CreateProcess
.
作为鸟枪方法,您可以在 DLL 的线程上尝试 CancelSynchronousIo
。