使用WindowsAPI/C写入Windows 10注册表时出错(奇怪的情况)



我正在尝试写入我的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: %pn", 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: %dn", lResult);
RegCloseKey(hKey);
return 0;
}

奇怪的是,尽管代码没有向注册表中写入任何内容,但我没有收到错误消息,程序执行成功

这是当我运行代码时打印到终端的内容:

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

因此,该键之前已经创建并成功设置,而并没有发生,我的注册表中没有任何内容。

我认为这是一个权限问题,因为出于某种原因,我无法手动更改我的注册表权限,即使在将自己设置为所有者之后,我也不可能允许";完全控制";对我自己。

但我预料到了一些错误,比如";访问被拒绝:权限不足";,但我正在取得成功。奇怪的

您将错误的密钥路径传递给RegCreateKeyEx()。您正试图将program值写入HKCUmyprogram,而不是写入HKCUSOFTWAREMicrosoft...Run

您还向RegCreateKeyEx()传递了无效指针。它的最后两个参数需要指向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: %ldn", lResult);
return 0;
}
printf("Key already existed or not: %lun", dwDisposition);
lResult = RegSetValueExA(hKey, "program", 0, REG_SZ, (LPBYTE)szPath, sizeof(TCHAR)*(strlen(szPath)+1));
printf("Key successfully set or not: %ldn", lResult);
RegCloseKey(hKey);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新