簡體   English   中英

使用 WindowsAPI/C 寫入 Windows 10 注冊表時出錯(奇怪的情況)

[英]Error writing to Windows 10 registry with WindowsAPI/C (strange situation)

我正在嘗試寫入我的 Windows 10 注冊表,以在啟動中包含一個程序。

目前我已經編寫了以下代碼,但沒有工作:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winnt.h>
#include <winreg.h>
    
int main()
{
    const TCHAR* path = TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
    LPDWORD holdResult;
    PHKEY hKey;
    int lResult;
    //lResult = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &hKey);
    lResult = RegCreateKeyExA(HKEY_CURRENT_USER, "myprogram", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &holdResult);
    
    if (lResult != ERROR_SUCCESS)
    {
        if (lResult == ERROR_FILE_NOT_FOUND) {
            printf("Key not found.\n");
            return TRUE;
        }
        else {
            printf("Error opening key.\n");
            return FALSE;
        }
    }
    printf("Key already existed or not: %p\n", holdResult);
    
    char* szPath = "C:\\Users\\Myname\\Documents\\coolprogram.exe";
    lResult = RegSetValueExA(hKey, "program", 0, REG_SZ,(LPBYTE)szPath, sizeof(wchar_t)*(wcslen(szPath)+1));
    printf("Key successfully set or not: %d\n", lResult);
    RegCloseKey(hKey);
    return 0;
}

奇怪的是,雖然代碼沒有向注冊表寫入任何內容,但我沒有收到任何錯誤消息,並且程序執行成功!

這是我運行代碼時打印到終端的內容:

Key already existed or not: 0000000000000002
Key successfully set or not: 0

因此,之前已經創建了密鑰,並且已成功設置,但這並沒有發生,我的注冊表中沒有任何內容。

我相信這是一個權限問題,因為由於某種原因,我無法手動更改我的注冊表權限,即使在將自己設置為所有者之后,我也不可能允許自己“完全控制”。

但我預計會出現某種錯誤,例如“訪問被拒絕:權限不足”,但我取得了成功。 奇怪的。

您將錯誤的密鑰路徑傳遞給RegCreateKeyEx() 您正在嘗試將program值寫入HKCU\myprogram而不是HKCU\SOFTWARE\Microsoft\...\Run

您還將無效指針傳遞給RegCreateKeyEx() 它的最后 2 個參數需要指向HKEYDWORD變量的指針,但您傳遞的是指向HKEY*DWORD*變量的指針。

您也將不正確的參數傳遞給RegSetValueExA() 您正在給它一個 ANSI 字符串(好的,因為它是一個 ANSI 函數),但傳入的 Unicode 字符串長度是實際 ANSI 字符串字節大小的 2 倍(壞)。

實際上,您的代碼甚至不應該如圖所示編譯。

試試這個:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winnt.h>
#include <winreg.h>

int main()
{
    const char* szKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    const char* szPath = "C:\\Users\\Myname\\Documents\\coolprogram.exe";
    DWORD dwDisposition;
    HKEY hKey;
    LSTATUS lResult;

    //lResult = RegOpenKeyExA(HKEY_CURRENT_USER, szKey, 0, KEY_QUERY_VALUE, &hKey);
    lResult = RegCreateKeyExA(HKEY_CURRENT_USER, szKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDisposition);

    if (lResult != ERROR_SUCCESS)
    {
        printf("Error creating key: %ld\n", lResult);
        return 0;
    }

    printf("Key already existed or not: %lu\n", dwDisposition);

    lResult = RegSetValueExA(hKey, "program", 0, REG_SZ, (LPBYTE)szPath, sizeof(TCHAR)*(strlen(szPath)+1));
    printf("Key successfully set or not: %ld\n", lResult);
    RegCloseKey(hKey);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM