2009-10-14 3 views
11

FILETIME संरचना को __int64 में परिवर्तित करने का सही तरीका क्या है? क्या आप मुझे बता सकते हैं?FILETIME से __int64

उत्तर

13

मुझे नहीं लगता कि आप के लिए लगता रहे हैं: "एक FILETIME संरचना करने के लिए एक सूचक डाली न करने के लिए या तो एक ULARGE_INTEGER* या __int64* मूल्य क्योंकि इस पर 64-बिट Windows संरेखण दोष पैदा कर सकता है।" जैसे

__int64 to_int64(FILETIME ft) 
{ 
    return static_cast<__int64>(ft.dwHighDateTime) << 32 | ft.dwLowDateTime; 
} 

FILETIME ft = // ... 
__int64 t = to_int64(ft); 

लेकिन कुछ:

FILETIME ft = // ... 
__int64 t = *reinterpet_cast<__int64*>(&ft); 

बुरा है

Source.

तुम सच में की तरह कुछ हो जाएगा चाहते हैं तो।

+0

मैं संपादन की प्रक्रिया :) – GManNickG

+1

में था क्रोमियम परियोजना से है कैसे memcpy के बारे में (<__int64>, और FILETIME, 8); ? क्या ये सुरक्षित है? – akif

+1

मुझे समझने के लिए 'memcpy' कठिन' मिलेगा, लेकिन मुझे यकीन है कि यह काम करेगा। संकलक शायद शिफ्ट और बेहतर अनुकूलित कर सकते हैं। – GManNickG

4

प्रयास करें

(__int64(filetime.dwHighDateTime)<<32) | __int64(filetime.dwLowDateTime) 
1
बेशक

तुम सिर्फ एक __int64 एक filetime लिए casted पास कर सकता है इस प्रकार * (FILETIME *) & int64Val। यह विजुअल सी ++ के तहत ठीक काम करेगा।

यानी

__int64 createTime = 0; 
__int64 accessTime = 0; 
__int64 writeTime = 0; 
GetFileTime(hFile, *(FILETIME*)&createTime, *(FILETIME*)&accessTime, *(FILETIME*)&writeTime); 
7

बिटवाइज़ या का उपयोग रहस्यमय निर्माणों पर वापस लौटने की कोई जरूरत नहीं है। विंडोज एपीआई को ऐसा करने के लिए आपको जो कुछ भी चाहिए, उसे मिला है।

unsigned __int64 convert(const FILETIME & ac_FileTime) 
{ 
    ULARGE_INTEGER lv_Large ; 

    lv_Large.LowPart = ac_FileTime.dwLowDateTime ; 
    lv_Large.HighPart = ac_FileTime.dwHighDateTime ; 

    return lv_Large.QuadPart ; 
} 

या यदि आप सीधे __int64 पर जाना चाहते हैं।

__int64 convert_to_int64(const FILETIME & ac_FileTime) 
{ 
    return static_cast<__int64> (convert(ac_FileTime)) ; 
} 
1

आप कोड का पालन करने का प्रयास कर सकते हैं। कोड

template <class Dest, class Source> 
 
inline Dest bit_cast(const Source& source) { 
 
\t Dest dest; 
 
\t memcpy(&dest, &source, sizeof(dest)); 
 
\t return dest; 
 
} 
 

 
//FILETIME to __int64 
 

 
__int64 FileTimeToMicroseconds(const FILETIME& ft) { 
 
\t return bit_cast<__int64, FILETIME>(ft)/10; 
 
} 
 

 
void MicrosecondsToFileTime(__int64 us, FILETIME* ft) { 
 
\t *ft = bit_cast<FILETIME, __int64>(us * 10); 
 
} 
 

 
int _tmain(int argc, _TCHAR* argv[]) 
 
{ 
 
\t __int64 nTmpUint64 = 13060762249644841; 
 

 
\t time_t unixtime; 
 
\t FILETIME nTmpFileTm; 
 
\t MicrosecondsToFileTime(nTmpUint64,&nTmpFileTm); 
 

 
\t return 0; 
 
}

संबंधित मुद्दे