Windows 時間相關

2021-06-20 03:27:39 字數 4339 閱讀 7441

filetime結構體:

typedef struct _filetime  filetime, *pfiletime;
在幫助文件中微軟給出了解釋:contains a 64-bit value representing the number of 100-nanosecond intervals since january 1, 1601 (utc).即此結構體包含了乙個代表自從2023年1月1日起,以100納秒為單位的64位消逝值。

systemtime結構體:

typedef struct _systemtime  systemtime, *psystemtime;
解釋:specifies a date and time, using individual members for the month, day, year, weekday, hour, minute, second, and millisecond. the time is either in coordinated universal time (utc) or local time, depending on the function that is being called.(此結構體指定日期和時間, 此時間要麼是utc時間,要麼時本地時間,取決於被呼叫的函式)。msdn不建議從systemtime直接新增或提取相對時間,而是應該採用以下步驟:

1.將systemtime轉換為filetime

2.將filetime的結果拷貝到乙個ularge_integer結構體

3.在ularge_integer上面進行64位算術運算

在windows核心程式設計一書上有一「等待定時器核心物件」例子。

bool winapi setwaitabletimer(

_in_ handle htimer,

_in_ const large_integer *pduetime,

_in_ long lperiod,

_in_opt_ ptimerapcroutine pfncompletionroutine,

_in_opt_ lpvoid lpargtocompletionroutine,

_in_ bool fresume

);

此函式的第二個引數需要乙個large_integer的指標,此結構體如下:

typedef union _ularge_integer ;

struct u;

ulonglong quadpart;

} ularge_integer, *pularge_integer;

你將會發現filetime與此結構體擁有相同的二進位制格式,你是否會想:既然這兩個結構體都有相同的二進位制格式,那麼直接這樣呼叫所達到的效果是不是一樣呢?:

setwaitabletimer(htimer, (plarge_integer)&ftutc, 0, null, null, false);
其實想是可以這麼想,但千萬別這麼做。windows核心程式設計給出了答案:雖然這兩個結構採用相同的二進位制格式,但是這兩個結構調整要求不同。所有filetime結構的位址必須從下乙個32位邊界開始,而所有large_integer結構的位址則必須從64位的邊界開始。呼叫setwaitabletimer函式和給它傳遞乙個filetime結構時是否能夠正確地執行,取決於filetime結構是否恰好位於64位的邊界上。x86處理器能夠悄悄地處理未對齊的資料引用。因此應用程式在x86cpu上執行時,將filetime的位址傳遞給setwaitabletimer總是可靠的。但是,其他處理器,如alpha處理器,則無法像x86處理器那樣悄悄地處理未對齊的資料引用。實際上,大多數其它處理器都會產生乙個exception_datatype_misalignment異常,它會導致程序終止執行。當你將x86計算機上執行的**移植到其它處理器時,產生問題的最大原因是出現了對齊錯誤。

可以看到systemtime結構體裡面的元素即我們平時看見的時間元素。而filetime結構體僅有兩個32位的變數。那這兩個結構體可以用來幹什麼呢?

filetime:

看到些名字就知道,此結構體必定與檔案有關。you guess it.當我們建立檔案,修改檔案以及訪問檔案的時候,相應的時間就是存在此結構裡面的。當然此結構體的作用不僅僅於此。此結構還經常與systemtime之間互相轉換,以達到某種目的。

systemtime:

此結構體可供我們用來列印具體的時間。經常與filetime相互轉換,以達到某種目的。

相關的函式:

void winapi getsystemtime(//得到系統(utc時間)時間

_out_ lpsystemtime lpsystemtime

);

void winapi getlocaltime(// 得到本地時間

_out_ lpsystemtime lpsystemtime

);

bool winapi systemtimetofiletime( // 系統時間轉換為檔案時間

_in_ const systemtime *lpsystemtime,

_out_ lpfiletime lpfiletime

);

bool winapi filetimetosystemtime( //檔案時間轉換為系統時間

_in_ const filetime *lpfiletime,

_out_ lpsystemtime lpsystemtime

);

bool winapi localfiletimetofiletime( //本地時間轉換為檔案時間

_in_ const filetime *lplocalfiletime,

_out_ lpfiletime lpfiletime

);

bool filetimetolocalfiletime( //檔案時間轉換為本地檔案時間

const filetime* lpfiletime,

lpfiletimelplocalfiletime

);

bool winapi systemtimetotzspecificlocaltime( //utc時間轉換為特定時區時間

_in_opt_ lptime_zone_information lptimezone,

_in_ lpsystemtime lpuniversaltime,

_out_ lpsystemtime lplocaltime

);

int systemtimetovarianttime( //converts a system time to a variant representation.

_in_ lpsystemtime lpsystemtime,

_out_ double *pvtime

);

......

下面的例子用到了前面幾個函式:

#include #include void printtime(file *file, pcstr pszdesc, const systemtime &st)

int main()

std::cout << "\n檔案:3dtetries.exe" << std::endl;

filetime ftcreate, ftaccess, ftlastwrite;

getfiletime(hfile, &ftcreate, &ftaccess, &ftlastwrite);

filetimetosystemtime(&ftcreate, &st);

printtime(stdout, ("建立時間"), st);

filetimetosystemtime(&ftaccess, &st);

printtime(stdout, ("訪問時間"), st);

filetimetosystemtime(&ftlastwrite, &st);

printtime(stdout, ("修改時間"), st);

return 0;

}

執行效果:

windows訊息相關

1.sendmessage返回值不能直接返回訊息函式的返回值 解決方法 在訊息對應返回之前呼叫setwindowlong hdlg,dwl msgresult,iret 2 sendmessage與postmessage的區別 先來看看send與post這兩個英文單詞的意思 send有傳送的意思,而...

Windows共享相關

客戶端 1 檢視本機的共享目錄。1 cmd命令 net share 2 gui方式,以win7為例,檢視方式為 計算機 管理 計算機管理 本地 系統工具 共享資料夾 共享 2 切換使用者。1 活用net use命令來切換區域網共享使用者 客戶端 1 2 3 net use 192.168.0.88 ...

windows相關檔案

registry,正體中文版windows作業系統稱之為登入檔 是microsoft windows中的乙個重要的資料庫,用於儲存系統和應用程式的設定資訊 是乙個包含可由多個程式同時使用的 和資料的庫 動態鏈結提供了一種方法,使程序可以呼叫不屬於其可執行 的函式 函式的可執行 位於乙個 dll 中,...