[英]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 個參數需要指向HKEY
和DWORD
變量的指針,但您傳遞的是指向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.