Windows XP上的SystemTimeToTzSpecificLocalTime崩溃

时间:2010-02-08 23:10:05

标签: c++ windows-xp

同一代码中的时间函数在xp上崩溃,但在Windows 2003机器上运行正常。有什么想法吗?

    TIME_ZONE_INFORMATION   tzi;

    SYSTEMTIME              stStartUTC;

    SYSTEMTIME              stStart;

    LPCSTR                  lpszZone;

    BOOL                    bStatus;

    FILETIME*                pFT;

    DWORD  dReturn;

    pFT = new FILETIME;

if (pFT)

{

    pFT->dwHighDateTime = 4294967295ul;
    pFT->dwLowDateTime = 4294962295ul;

    if (pFT)
    {
        FileTimeToSystemTime (pFT, &stStartUTC);
    }
    else
    {
        GetSystemTime (&stStartUTC);
    }


    dReturn = GetTimeZoneInformation (&tzi);

    bStatus = SystemTimeToTzSpecificLocalTime (&tzi, &stStartUTC, &stStart);

}

崩溃转储中的堆栈是:

  

0816e968 7c85a6f2 00000000 00000024   7c85a6f8   KERNEL32!__ report_gsfailure + 0xda

     

0816ebf8 7c85a788 0816ec10 0816ec70   0000a8f0   KERNEL32!FindRegTziForCurrentYear + 0x1a5

     

0816ec3c 7c85a7bd 0816ec70 0000a8f0   0816eec4   KERNEL32!CheckDynamicTimeZoneInformation + 0x29

     

0816ec54 7c85a834 0816ec70 0000a8f0   0816eec4   KERNEL32!GetDynamicTimeZoneInfoForTimeZone + 0×17

     

0816ee7c 7c83b11c 0000a8f0 00000000   0816eec4   KERNEL32!GetTimeZoneInformationForYear +将0x58

     

0816f020 14f27e38 0816f05c 0816f03c   0816f04c   KERNEL32!SystemTimeToTzSpecificLocalTime +为0x3C

谢谢, Mithuna

2 个答案:

答案 0 :(得分:2)

尝试添加GetLastError调用以检查SystemTimeToTzSpecificLocalTime之前的所有功能是否成功。这应该给你一些提示。

答案 1 :(得分:1)

堆栈帧上的__report_gsfailure很重要。这是一个在检测到安全错误时调用的CRT函数。查看MSVC编译器的/ GS命令行选项。最常见的原因是堆栈帧损坏。

我发现你的代码片段没有明显的原因导致这个事故,它已经深深嵌套在Windows中。也许注册表中的损坏会导致缓冲区溢出。您应该能够通过使用SysInternals的ProcMon实用程序找到位置。