2010-02-08 7 views
0

La fonction de temps dans le même code se bloque sur xp, mais s'exécute correctement sur Windows 2003 machine. Des idées?crash SystemTimeToTzSpecificLocalTime sur Windows XP

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); 

} 

Stack de la décharge de l'accident est:

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 + 0x17

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

0816f020 14f27e38 0816f05c 0816f03c 0816f04c kernel32! SystemTimeToTzSpecificLocalTime + 0x3c

Merci, Mithuna

Répondre

2

Essayez d'ajouter un appel GetLastError pour vérifier si toutes les fonctions jusqu'à la SystemTimeToTzSpecificLocalTime réussit ou non. Cela devrait vous donner un indice.

+0

GetLastError affiche le retour de FileTimeToSystemTime renvoie 0, ce qui est une erreur et la sortie formatée de l'erreur affiche le paramètre incorrect. Je sais avec certitude que les paramètres sont incorrects mais je me demande ce qui a causé le crash ou la corruption du tas. Merci. – mithuna

1

La valeur __report_gsfailure sur la trame de la pile est significative. C'est une fonction CRT qui est appelée lorsqu'une erreur de sécurité a été détectée. Passez en revue les options de ligne de commande/GS pour le compilateur MSVC. La cause la plus fréquente est un cadre de pile corrompu.

Je ne vois aucune raison évidente dans votre extrait de code pour cette mésaventure, il est déjà profondément imbriqué dans Windows. Peut-être la corruption dans le registre qui à son tour provoque un débordement de tampon. Vous devriez être capable de savoir où en utilisant l'utilitaire ProcMon de SysInternals.