Windows 登錄表中 ShutdownTime 為 REG_BINARY,實際儲存 FILETIME 結構(64 位元無號整數,單位 100 奈秒,UTC 1601/01/01 起)。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int _tmain() {
HKEY hKey;
DWORD dwType = REG_BINARY;
DWORD dwSize = 0;
LONG lRes;
// 1. 開啟鍵值
lRes = RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Internet Explorer\\TypedURLsTime"),
0, KEY_READ, &hKey);
if (lRes != ERROR_SUCCESS) {
_tprintf(_T("OpenKey 失敗: %d\n"), lRes);
return 1;
}
// 2. 先查詢資料大小
lRes = RegQueryValueEx(hKey, _T("url1"), NULL, &dwType, NULL, &dwSize);
if (lRes != ERROR_SUCCESS || dwSize != sizeof(FILETIME)) {
_tprintf(_T("QuerySize 失敗或大小不符: %d, size=%d\n"), lRes, dwSize);
RegCloseKey(hKey);
return 1;
}
// 3. 讀取二進制資料
BYTE* pData = new BYTE[dwSize];
lRes = RegQueryValueEx(hKey, _T("url1"), NULL, &dwType, pData, &dwSize);
if (lRes != ERROR_SUCCESS) {
_tprintf(_T("QueryValue 失敗: %d\n"), lRes);
delete[] pData;
RegCloseKey(hKey);
return 1;
}
// 4. 轉換 FILETIME -> SYSTEMTIME (本地時間)
FILETIME ftUtc;
memcpy(&ftUtc, pData, sizeof(FILETIME));
FILETIME ftLocal;
FileTimeToLocalFileTime(&ftUtc, &ftLocal);
SYSTEMTIME st;
FileTimeToSystemTime(&ftLocal, &st);
_tprintf(_T("時間: %04d-%02d-%02d %02d:%02d:%02d\n"),
st.wYear, st.wMonth, st.wDay,
st.wHour, st.wMinute, st.wSecond);
delete[] pData;
RegCloseKey(hKey);
return 0;
}
| API | 用途 |
|---|---|
| RegOpenKeyEx | 開啟登錄鍵 |
| RegQueryValueEx | 讀取值,兩次呼叫:先取大小,再取資料 |
| FileTimeToLocalFileTime | UTC 轉本地時間 |
| FileTimeToSystemTime | FILETIME 轉易讀的 SYSTEMTIME |
printf("%s", binaryData) 會把二進制當字串導致亂碼。dwSize 是否為 8 位元組(FILETIME 大小)。