c++ - 检查并关闭 HANDLE

标签 c++ windows handle

我正在使用 HANDLES,第一个 nextColorFrameEvent 是事件处理程序,第二个是流处理程序。它们在以下代码中被初始化:

nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
hr = nui->NuiImageStreamOpen(
            NUI_IMAGE_TYPE_COLOR,
            NUI_IMAGE_RESOLUTION_640x480,
            0,
            2,
            nextColorFrameEvent,
            &videoStreamHandle);

我想在销毁时正确处理它们,同时不产生错误。有时初始化器不会被调用,所以当软件结束时两个 HANDLEs 仍然是 NULL。这就是为什么我想首先检查 HANDLE 是否已正确初始化等,如果是,我想关闭它们。为此,我得到了以下代码:

    if (nextColorFrameEvent && nextColorFrameEvent != INVALID_HANDLE_VALUE)CloseHandle(nextColorFrameEvent);
#ifdef QT_DEBUG
    DWORD error = GetLastError();
    qDebug()<< error;
#endif
    if (videoStreamHandle && videoStreamHandle != INVALID_HANDLE_VALUE)CloseHandle(videoStreamHandle);
#ifdef QT_DEBUG
    error = GetLastError();
    qDebug()<< error;
#endif

但这显然是不正确的:如果我不运行初始化程序然后关闭软件,这段代码运行并给我一个 6:

Starting C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController...
6 
6 
C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController exited with code 0

这意味着:

ERROR_INVALID_HANDLE 6 (0x6) The handle is invalid. Which means that closeHandle ran anyway despite the tests. What tests should I do to prevent closing when the handle is not a valid HANDLE?

额外的问题:如果我运行初始化程序,仅关闭 colorFrameEvent 时将不再出现此错误,但在关闭 videoStreamHandle 时仍会出现:

Starting C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController...
0 
6 
C:\...\Qt\build-simpleKinectController-Desktop_Qt_5_0_2_MSVC2012_64bit-Debug\debug\simpleKinectController exited with code 0

我需要一个不同的函数来关闭流处理程序吗?

最佳答案

nui->NuiImageStreamOpen(...) 不会为流创建有效的 Windows 句柄,而是在驱动程序端创建一个内部句柄。
所以你不能使用windows API来释放/关闭流句柄!!!

  • 为此只需调用 nui->NuiShutdown()。我还没有使用回调事件,但我认为它是一个有效的窗口句柄,应该可以正常关闭。
  • 如果您只需要更改设置,您可以随时使用新设置调用nui->NuiImageStreamOpen(...)。无需关机...
  • 我也欢迎函数 nui->NuiImageStreamClose(...);,因为 API 的当前状态随着传感器配置的变化而使长期运行的 ap 变得复杂。

关于c++ - 检查并关闭 HANDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16358727/

相关文章:

c++ - 错误 : Cannot open shared object file: No such file or directory

c++ - 没有友元函数的两个类的私有(private)操作

c++ - VS 2015 的 HYPRE blas 构建错误

matlab - 常量属性中方法的函数句柄

perl - perl read() 函数和不是 ref 的缓冲区背后的魔法是什么?

c++ - 在 C++ 中清除 cin

c++ - 直接将子句添加到 z3 求解器

windows - 如何全局映射 AltGr 键到 Alt 键?

Python检索Windows服务信息

c++ - 如何正确传递窗口句柄?