2009-07-08 12 views
0

Ich habe einen Wert __int64 das ist ein 64-Bit FILETIME Wert. FILETIME hat eine dwLowDateTime und dwHighDateTime. Wenn ich versuche, einen __int64 zu einem FILETIME zuzuweisen, bekomme ich einen C2440. Wie weise ich die __int64 der FILETIME zu?Wie FILETIME in Win32 erstellen?

Oder wie teile ich die __int64, so dass ich den niedrigen Teil zu dwLowDateTime und den hohen Teil zu dwHighDateTime zuweisen kann?

Antwort

3

Hier ist der Grundriss.

__int64 t; 
FILETIME ft; 

ft.dwLowDateTime = (DWORD)t; 
ft.dwHighDateTime = (DWORD)(t >> 32); 

NICHT Ansatz EMPFOHLEN

ft = *(FILETIME *)(&t); 

Es wird von FILE aufgrund der geschickten Anordnung arbeiten, aber das Opfer in Portabilität und Klarheit ist es nicht wert. Verwenden Sie nur in Zeiten der erwiesenen dringenden Notwendigkeit und wickeln Sie es in behauptet, um zu beweisen, dass es funktioniert.

+0

Bitverschiebung ... natürlich. –

0
__int64 i; 
FILETIME ft; 

// From __int64 to FILETIME 

ft.dwHighDateTime = (DWORD)(i >> 32); 
ft.dwLowDateTime = (DWORD)(i & 0xFFFF); 


// From FILETIME to __int64 

i = (ft.dwHighDateTime << 32) + ft.dwLowDateTime; 
+0

Die Maske sollte 0xFFFFFFFF sein. Die zweite Konvertierung funktioniert nicht, wenn Sie ft.dwHighDateTime vor dem << 32 in __int64 übertragen. Das Hinzufügen von ft.dwLowDateTime könnte ein Problem sein, wenn DWORD signiert ist. –

2

Mike,

Sie könnten eine ULARGE_INTEGER Struktur verwenden, um die __int64 in die FILE zu kopieren:

__int64 i64; 
ULARGE_INTEGER li; 
FILETIME ft; 

li.QuadPart = i64; 
ft.dwHighDateTime = li.HighPart; 
ft.dwLowDateTime = li.LowPart;