首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VC++ 讀取登錄表二進制值 ShutdownTime 並轉換為可讀時間

     編輯:程式設計綜合問答

資料結構

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 說明

API用途
RegOpenKeyEx開啟登錄鍵
RegQueryValueEx讀取值,兩次呼叫:先取大小,再取資料
FileTimeToLocalFileTimeUTC 轉本地時間
FileTimeToSystemTimeFILETIME 轉易讀的 SYSTEMTIME

常見坑點

  • 直接 printf("%s", binaryData) 會把二進制當字串導致亂碼。
  • 未檢查 dwSize 是否為 8 位元組(FILETIME 大小)。
  • 忽略時區轉換,顯示為 UTC 時間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved