ReportEvent - 什么时候应该关闭HANDLE?

时间:2015-07-27 10:34:31

标签: c++

我在网上看到过很多ReportEvent功能的例子。在这些示例中,发送到ReportEvent(第一个参数)的句柄在调用ReportEvent之前创建,并在调用之后立即销毁(分别使用RegisterEventSource和DeregisterEventSource)。

HANDLE只能在短时间内存活吗?为什么它不仅仅比在porgram的开头创建HANDLE并在最后摧毁它更好? (毕竟它只有一个HANDLE,最多只有1600万个)。每次调用ReportEvent时,创建和销毁HANDLE都没有开销吗?

提前致谢,

德罗尔

2 个答案:

答案 0 :(得分:0)

是的,你可以。在wmain的开头,你可以这样做:

HEVENT hEventLog = RegisterEventSource(NULL, PROVIDER_NAME);

最后,wmain,

if (hEventLog)
    DeregisterEventSource(hEventLog);

应该这样做,你可以重复使用相同的句柄

答案 1 :(得分:0)

接下来是这个问题的更有趣的方面-我们可以只调用RegisterEventSource,然后假设退出过程足以自动关闭所有相关的句柄,包括通过RegisterEventSource获得的句柄吗?< / p>

换句话说-如果我们确定某个时间该进程将退出,则只能调用RegisterEventSource。而已。

同一问题的甚至更清晰的形式-如果我们不调用DeregisterEventSource()可能会导致什么问题?整个操作系统中是否会有内部泄漏?还是有其他后果?

例如: 因此,我需要在许多不同的DLL中调用ReportEvent()-在每个DLL中,我始终必须调用3个函数:RegisterEventSource,ReportEvent,DeregisterEventSource。我想将内部静态变量与句柄一起使用,只调用一次RegisterEventSource,然后再不调用DeregisterEventSource,以希望当进程退出时,所有相关的句柄都将自动关闭。 那行得通吗?