Quel est le moyen approprié de convertir une structure code> filétime code> en __ int64 code>? Pouvez-vous s'il vous plaît dites-moi? P>
6 Réponses :
Je ne pense pas que vous êtes supposé que vous êtes supposé: "Ne pas lancer un pointeur sur une structure de filétime code> à un source. p> Si vous vouliez vraiment que ce soit quelque chose comme: p> mais quelque chose comme: < / p> est mauvais. p> p> ULarge_Integer * code> ou
__ int64 * < / Code> Valeur car il peut provoquer des défauts d'alignement sur des fenêtres 64 bits. "
Que diriez-vous MEMCY (<__ INT64>, & FileTime, 8); ? Est-ce sûr?
Je trouverais memcpy code> plus difficile à comprendre, mais je suis sûr que cela fonctionnerait. Le compilateur peut probablement optimiser le changement et le meilleur.
En effet, il était plus difficile de comprendre, mais cela a travaillé jusqu'à présent :) merci
Essayez
Bien sûr, vous pourriez simplement passer dans une extension int 2004 à une filetime comme suit * (FileTime *) & INT64VAL. Cela fonctionnera bien sous Visual C ++.
IE P>
__int64 createTime = 0; __int64 accessTime = 0; __int64 writeTime = 0; GetFileTime( hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime );
"Ne pas jeter un pointeur sur une structure de filétime à une valeur ULarge_Integer * ou __int64 * car elle peut provoquer des défauts d'alignement sur des fenêtres 64 bits." docs.microsoft.com/en-us/ Windows / Bureau / API / MINWINBASE / ...
@MRTUX: Dans le lien, il dit que vous ne devez pas être jeté d'une structure de filétime. Les 2 significations sont très différentes. Fondamentalement, un filétime peut être sur un alignement de 4 octets (ou peut-être même une 2) et ainsi de lancer à un __int64 entraînera des problèmes d'alignement en tant que __int64, soit nécessairement 8 octets alignés. Cependant, dans la fonction ci-dessus, je passe dans un __int64 aligné à 8 octets et Windows écrit. Cela ne change pas l'adresse du pointeur simplement parce que c'est un __int64. Cela briserait toutes sortes de choses.
Vraiment comme cette réponse, car il est parfaitement logique à la lumière de la signification réelle i> de la documentation conseille; et le Description de Raimond Chen . Merci tor-intelligent conseiller!
Il n'est pas nécessaire de revenir à des constructions d'arcanes à l'aide de Bitwise ou de Bitwise. L'API Windows a tout ce dont vous avez besoin pour faire cela. ou si vous voulez aller à __int64 directement. p>
Ces jours-ci (depuis C ++ 11), il peut simplement être écrit en tant que UlargeInteger {ft.dwlowdatetime, ft.dwhighttetime} .quadpartate code>. Sans doute pas plus lisible, mais vous n'avez pas besoin de fonction / macro supplémentaire.
Vous pouvez essayer le code suive. Le code provient du projet de chrome
J'avais exactement le même problème, est googlé pour cela et est venu ici. Mais j'ai aussi trouvé une page utile de support Microsoft de
https://support.microsoft. com / fr-gb / help / 188768 / info-work-work-with-filétime-structure
Il dit: p>
Il est souvent nécessaire d'effectuer une simple arithmétique sur les temps de fichier. Par exemple, vous devrez peut-être savoir quand un fichier est de 30 jours. Pour effectuer une arithmétique sur un temps de fichier, vous devez convertir le filétime en quadwottword (un entier 64 bits), effectuer l'arithmétique, puis convertir le résultat à un filéme. P> supposant que FT est une structure de filétime contenant l'heure de création d'un fichier, le code d'échantillon suivant ajoute 30 jours à l'heure: p> modifier: je me rends compte que cela confirme simplement une partie de la Autres réponses, mais je pensais que cela valait la peine d'être ajouté pour des éclaircissements. p> p>