我试图写到我的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因此,密钥已经被创建,并且已经成功地设置好了,而没有发生,在我的注册表中什么也没有。
我认为这是一个权限问题,因为由于某些原因,我无法手动更改注册表权限,即使在将自己设置为所有者之后,我也不可能允许自己使用“完全控制”。
但我预期会出现某种错误,例如“访问被拒绝:权限不足”,但我正在取得成功。真奇怪。
发布于 2021-12-25 22:41:39
您将错误的密钥路径传递到RegCreateKeyEx()。您正在尝试将您的program值写入HKCU\myprogram而不是HKCU\SOFTWARE\Microsoft\...\Run。
您还将无效的指针传递到RegCreateKeyEx()。它的最后2个参数期望指向HKEY和DWORD变量的指针,但是您将传入指向HKEY*和DWORD*变量的指针。
您还将一个不正确的参数传递给RegSetValueExA()。您给它一个ANSI字符串(好,因为它是ANSI函数),但是传入一个Unicode字符串长度,即实际ANSI字符串字节大小的2倍(bad)。
实际上,您的代码甚至不应该如图所示进行编译。
试一试:
#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;
}https://stackoverflow.com/questions/70483093
复制相似问题