EngDeleteDriverObj 函数 (winddi.h)
EngDeleteDriverObj 函数释放用于跟踪设备托管资源的句柄。
语法
ENGAPI BOOL EngDeleteDriverObj(
HDRVOBJ hdo,
BOOL bCallBack,
BOOL bLocked
);
参数
hdo
要删除的驱动程序对象的句柄。 此 GDI 句柄是从 EngCreateDriverObj 获取的。
bCallBack
指定是否应调用清理回调。 如果 为 TRUE,则 GDI 在从句柄管理器中删除 DRIVEROBJ 之前调用清理回调。 如果 为 FALSE,则 GDI 不会这样做。 如果回调函数返回失败, EngDeleteDriverObj 将失败。
bLocked
指定在调用 EngDeleteDriverObj 之前,驱动程序 (是否通过调用 EngLockDriverObj) 锁定了对象。 如果 为 TRUE,则对象已锁定;如果 为 FALSE,则表示对象未锁定。
返回值
如果函数成功且释放句柄,则返回值为 TRUE ;如果尚未释放句柄,则为 FALSE 。 如果在 EngCreateDriverObj 中指定的 pFreeObjProc 驱动程序函数返回 FALSE,则 EngDeleteDriverObj 将失败,并且不会释放句柄。 如果清理回调需要锁定另一个 DRIVEROBJ 结构 (以便释放当前 DRIVEROBJ 结构 ) ,并且由于另一个线程正在使用另一个 DRIVEROBJ 结构而失败,则可能会发生这种情况。
注解
释放句柄后,GDI 不再跟踪关联的驱动程序资源,并且 EngCreateDriverObj 的 pFreeObjProc 参数指向的函数在进程终止时不会被调用。 驱动程序负责确保释放资源。
大多数驱动程序在终止时清理对象的方式应保持一致。 因此,他们将为 bCallback 传递 TRUE,向 GDI 指示它应调用驱动程序的清理函数来释放此驱动程序资源。
bCallBack 参数向 GDI 指示是否需要调用回调函数。 为 bCallBack 传递 TRUE 会告知 GDI 重新调用驱动程序的清理函数以释放此驱动程序资源。 传递 FALSE 会阻止 GDI 调用清理函数。 如果 pFreeObjProc 返回 FALSE, 则 EngDeleteDriverObj 将失败,并且不会释放句柄。 例如,如果 pFreeObjProc 需要锁定另一个 DRIVEROBJ 结构来释放当前 DRIVEROBJ 结构,并且由于另一个线程正在使用该结构而失败,则可能会发生这种情况。 pFreeObjProc 不应在清理时失败,因为除清理线程外,没有线程正在运行,因此其他对象的锁不会失败。
bLocked 参数向 GDI 指示对象已被驱动程序锁定一次。 通常,在删除对象之前,驱动程序可能已将其锁定以先使用。 这使驱动程序无需先解锁对象即可调用 GDI,从而消除了另一个线程在释放句柄之前进入驱动程序并锁定它的可能性。
要求
最低受支持的客户端 | 适用于 Windows 2000 及更高版本的 Windows 操作系统。 |
目标平台 | 通用 |
标头 | winddi.h (包括 Winddi.h) |
Library | Win32k.lib |
DLL | Win32k.sys |