我在网上看到过很多ReportEvent功能的例子。在这些示例中,发送到ReportEvent(第一个参数)的句柄在调用ReportEvent之前创建,并在调用之后立即销毁(分别使用RegisterEventSource和DeregisterEventSource)。
HANDLE只能在短时间内存活吗?为什么它不仅仅比在porgram的开头创建HANDLE并在最后摧毁它更好? (毕竟它只有一个HANDLE,最多只有1600万个)。每次调用ReportEvent时,创建和销毁HANDLE都没有开销吗?
提前致谢,
德罗尔
答案 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,以希望当进程退出时,所有相关的句柄都将自动关闭。 那行得通吗?