I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
WIN9X中读取时钟函数的重大错误(1999.08.16) 在编写Y2K测试程序时我们使用GetLocalTime来读取当前时间,意外地发现在WIN95,WIN98中当一天的23:59:59过渡到第二天的零点时,GetLocalTime可能会返回错误的日期,错误的日期和时间表明又回到了一天的开始。虽然这是一个小概率事件,但对于需要24小时不间断运行的时间关键性应用却是不可忽视的错误。
分析WIN9X可知GetLocalTime仅使用两次DOS调用分别取日期和时间,没有做必要的校验,若正好在两次DOS调用间发生日期过渡就将出现GetLocalTime返回的日期为前一天的错误。
经我们测试GetSystemTime在WINNT4下没有类似问题。在Microsoft更正前可用下面的代码避免WIN9X可能出现的错误:
DELPHI:
procedure MyGetLocalTime(var LocalTime:TSYSTEMTIME);
begin
GetLocalTime(LocalTime);
if (LocalTime.wHour+LocalTime.wMinute+LocalTime.wSecond)=0 then
GetLocalTime(LocalTime);
end;
C:
void MyGetLocalTime(LPSYSTEMTIME lpSystemTime)
{
GetLocalTime(lpSystemTime);
if (lpSystemTime->wHour+lpSystemTime->wMinute+lpSystemTime->wSecond)=0
then
GetLocalTime(lpSystemTime);
}
分析WIN9X可知GetLocalTime仅使用两次DOS调用分别取日期和时间,没有做必要的校验,若正好在两次DOS调用间发生日期过渡就将出现GetLocalTime返回的日期为前一天的错误。
经我们测试GetSystemTime在WINNT4下没有类似问题。在Microsoft更正前可用下面的代码避免WIN9X可能出现的错误:
DELPHI:
procedure MyGetLocalTime(var LocalTime:TSYSTEMTIME);
begin
GetLocalTime(LocalTime);
if (LocalTime.wHour+LocalTime.wMinute+LocalTime.wSecond)=0 then
GetLocalTime(LocalTime);
end;
C:
void MyGetLocalTime(LPSYSTEMTIME lpSystemTime)
{
GetLocalTime(lpSystemTime);
if (lpSystemTime->wHour+lpSystemTime->wMinute+lpSystemTime->wSecond)=0
then
GetLocalTime(lpSystemTime);
}