捕获没有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