GetTickCount64API 要求在Vista/2008以上系统使用
一下方法使用API 高精度计数器 和 GetTickCount 等多种方式实现GetTickCount64的功能
struct _tagGlobalTickCount_t
{
//API ULONGLONG WINAPI GetTickCount64(void);
typedef ULONGLONG (WINAPI *GETTICKCOUNT64)(void);
GETTICKCOUNT64 pGetTickCount64;
//HIGH-RESOLUTION PERFORMANCE COUNTER
BOOL bMMTimeValid;
LARGE_INTEGER m_Start, m_Freq;
_tagGlobalTickCount_t()
{
pGetTickCount64 = NULL;
bMMTimeValid = FALSE;
memset(&m_Start, 0, sizeof(m_Start));
memset(&m_Freq, 0, sizeof(m_Freq));
if(pGetTickCount64 = (GETTICKCOUNT64)GetProcAddress(
GetModuleHandle("Kernel32.dll"), "GetTickCount64")) //API valid
{
OutputDebugStringA( "GetTickCount64 API Valid\r\n" );
}
else if( QueryPerformanceCounter(&m_Start)
&& QueryPerformanceFrequency(&m_Freq) ) //high-resolution count valid
{
bMMTimeValid = TRUE;
OutputDebugStringA( "high-resolution count valid\r\n" );
}
else //use default time
{
OutputDebugStringA( "just GetTickCount() support only\r\n" );
}
}
ULONGLONG GetTickCount64(void)
{
if(pGetTickCount64) //api
{
return pGetTickCount64();
}
else if(bMMTimeValid) //high-resolution count
{
LARGE_INTEGER m_End = {0};
QueryPerformanceCounter(&m_End);
return (ULONGLONG)((m_End.QuadPart - m_Start.QuadPart) / (m_Freq.QuadPart / 1000));
}
else //normal
{
return GetTickCount();
}
}
}GlobalTickCount;
#define _GetTickCount64() ( GlobalTickCount.GetTickCount64() )
//测试
TRACE(_T("%I64u\n"), _GetTickCount64());