关于RegCreateKeyEx函数的用法(+50分)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于RegCreateKeyEx函数的用法(+50分)相关的知识,希望对你有一定的参考价值。
就是我想用c语言编写一个能修改注册表自动启动的程序,下面是代码!!当然是错的,还有很多地方需要改进!!刚学!郁闷了,总是提示错误!!
#include <stdio.h>
#include <stdlib.h>
int main()
int autorun_register(const char *exe_filename);
FILE *fp;
if((fp=fopen("E:\\应用程序\\kwmusic2010.exe","r"))==NULL)
printf("cannot open file\n");
exit(0);
autorun_register("E:\\应用程序\\kwmusic2010.exe");
system("PAUSE");
return 0;
int autorun_register(const char *exe_filename)
//修改注册表,开机启动
int return_value=0;
HKEY hroot = HKEY_LOCAL_MACHINE,hkey;
const char *subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
DWORD dwDisposition;
long result=RegCreateKeyEx(
hroot,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition
);
if(result==ERROR_SUCCESS)
result=RegSetValueEx(
hkey,
"病毒",
0,
REG_SZ,
(CONST BYTE *)exe_filename,
(DWORD)strlen(exe_filename)
);
if(result!=ERROR_SUCCESS)return_value=-1;
RegCloseKey(hkey);
else return_value=-1;
if(!return_value)printf("开机启动注册成功!\n");
else printf("开机启动注册失败...\n");
return return_value;
帮我修改一下,能改进为将运行的本程序添加到自启动项更好!!先说明啊!代码必须要对的,不然不给分!!
HKEY hKey;
UINT ret=0;
char path[MAX_PATH];
if(ERROR_SUCCESS!=RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&hKey))
return FALSE;
GetModuleFileName(NULL,path,MAX_PATH);
ret=RegSetValueEx(hKey,"病毒",0,REG_SZ,(CONST BYTE*)path,strlen(path));
RegCloseKey(hKey);
return ret==ERROR_SUCCESS;
头文件还要加个#include <windows.h>本回答被提问者采纳 参考技术B /************************************************************************/
/* 修改注册表让某个程序开机时,自动运行 */
/************************************************************************/
#include <windows.h>
#include <stdio.h>
int main()
int autorun_register(const char *exe_filename);
FILE *fp;
if((fp=fopen("E:\\TTplayer\\TTplayer.exe","r"))==NULL)
printf("cannot open file\n");
exit(0);
autorun_register("E:\\TTplayer\\TTplayer.exe");
system("PAUSE");
return 0;
int autorun_register(const char *exe_filename)
//修改注册表,开机启动
int return_value=0;
HKEY hroot = HKEY_LOCAL_MACHINE,hkey;
const char *subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
DWORD dwDisposition;
long result=RegCreateKeyEx(
hroot,
subkey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hkey,
&dwDisposition
);
if(result==ERROR_SUCCESS)
result=RegSetValueEx(
hkey,
"病毒",
0,
REG_SZ,
(CONST BYTE *)exe_filename,
(DWORD)strlen(exe_filename)
);
if(result!=ERROR_SUCCESS)return_value=-1;
RegCloseKey(hkey);
else return_value=-1;
if(!return_value)printf("开机启动注册成功!\n");
else printf("开机启动注册失败...\n");
return return_value;
程序如上,添加我机器上的千千静听程序的自动启动。
你的程序本来就是正确的。
加个
#include <windows.h>
就可以了。
我在我机器上已经运行过了。
不行可以hi我。
RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 无法设置值
【中文标题】RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 无法设置值【英文标题】:RegCreateKeyEx and RegOpenKeyEx succeeds but RegSetValueEx fails to set value 【发布时间】:2016-04-27 04:48:26 【问题描述】:我正在尝试为 HKCR 下的测试密钥设置值。 RegCreateKeyEx 成功创建测试密钥,RegOpenKeyEx 成功打开密钥。 RegSetValueEx 输出 ERROR_SUCCESS
但实际上并没有写入任何值。我已经解决了之前提出的所有类似问题,建议是在HKLM\SOFTWARE\Wow6432Node
下创建密钥。我在 64 位 win 10 上,testkey
在 HKCR 下; HKLM\SOFTWARE\Wow6432Node
下没有类似的东西。我尝试了两种不同的RegSetValueEx
,但都不起作用。我究竟做错了什么?
HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL );
if(lResult == ERROR_SUCCESS)
cout<<"Success! Key Created!"<<endl;
lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, KEY_ALL_ACCESS, &hKey);
if(lResult == ERROR_SUCCESS)
cout<<"Success! Key Opened!"<<endl;
const char info[] = "URL:URITest Link\0";
lResult = RegSetValueEx(HKEY_CLASSES_ROOT,"",0,REG_SZ,(BYTE*) info,strlen(info));
//lResult = RegSetValueEx(HKEY_CLASSES_ROOT,"URL Protocol",0,REG_NONE,NULL,0);
if(lResult == ERROR_SUCCESS)
cout<<"Success! Value Set!"<<endl;
else
cout<<lResult<<endl;
编辑:请参阅下面的@Remy Lebeau 答案,了解我的代码哪里出错了。
【问题讨论】:
ERROR_SUCCESS
正如我在 OP 中指出的那样
您使用 KEY_READ 打开了 阅读 密钥。然后你尝试写一个值。但是值类型是none,你成功创建了没有值。当然,这些都没有任何意义。
@HansPassant:代码未在使用 KEY_READ` 访问权限打开的 HKEY
上调用 RegSetValueEx()
。它正在尝试直接写入 HKEY_CLASSES_ROOT
密钥(这是一个错误),但可能 API 正在接受它。
我需要在testKey
下添加两个字符串,默认值需要URL:URITest Link
,并且需要有一个名为URL Protocol
的空字符串。这是基于Custom URI Scheme for windows
@Remy Lebeau 如果你说的是真的,那我怎样才能直接访问testKey
?
【参考方案1】:
我正在尝试为 HKCR 下的测试密钥设置值。 RegCreateKeyEx 成功创建测试密钥,RegOpenKeyEx 成功打开密钥。 RegSetValueEx 输出 ERROR_SUCCESS 但实际上并没有写入任何值。
您没有将RegOpenKeyEx()
返回的HKEY
句柄传递给RegSetValueEx()
。需要将第一个参数中硬编码的HKEY_CLASSES_ROOT
替换为hKey
变量:
lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL,0);
但是,为了使其工作,您还需要更改您的 RegOpenKeyEx()
调用以请求 KEY_WRITE
(或至少 KEY_SET_VALUE
)权限。您正在使用 KEY_READ
权限打开密钥。您不能写入只读密钥:
lResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, "testKey", 0, KEY_SET_VALUE, &hKey);
话虽如此,您不应该一开始就直接写信给KEY_CLASSES_ROOT
。 HKEY_CLASSES_ROOT
不是它自己的实际键,它实际上是 HKEY_LOCAL_MACHINE\Software\Classes
和 HKEY_CURRENT_USER\Software\Classes
键的合并视图:
HKEY_CLASSES_ROOT Key
Merged View of HKEY_CLASSES_ROOT.aspx
如果您将密钥写入 HKEY_CLASSES_ROOT 下的密钥,系统会将信息存储在 HKEY_LOCAL_MACHINE\Software\Classes 下。如果您将值写入 HKEY_CLASSES_ROOT 下的某个键,并且该键已经存在于 HKEY_CURRENT_USER\Software\Classes 下,系统会将信息存储在那里而不是 HKEY_LOCAL_MACHINE\Software\Classes 下。
如果你想注册一个只有当前用户可以访问的URI方案,保存在HKEY_CURRENT_USER\Software\Classes\testKey
:
HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Classes\\testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
if (lResult == ERROR_SUCCESS)
cout << "Success! Key Created!" << endl;
const char info[] = "URL:URITest Link\0";
lResult = RegSetValueEx(hKey, "" , 0, REG_SZ, (BYTE*) info, sizeof(info));
if (lResult == ERROR_SUCCESS)
lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL, 0);
if (lResult == ERROR_SUCCESS)
cout << "Success! Value Set!" << endl;
else
cout << lResult << endl;
RegCloseKey(hKey);
如果您希望所有用户都可以访问 URI 方案,请将其保存在 HKEY_LOCAL_MACHINE\Software\Classes\testKey
:
HKEY hKey;
LONG lResult;
lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes\\testKey", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL);
if (lResult == ERROR_SUCCESS)
cout << "Success! Key Created!" << endl;
const char info[] = "URL:URITest Link\0";
lResult = RegSetValueEx(hKey, "" , 0, REG_SZ, (BYTE*) info, sizeof(info));
if (lResult == ERROR_SUCCESS)
lResult = RegSetValueEx(hKey, "URL Protocol", 0, REG_NONE, NULL, 0);
if (lResult == ERROR_SUCCESS)
cout << "Success! Value Set!" << endl;
else
cout << lResult << endl;
RegCloseKey(hKey);
【讨论】:
@Icarus:是的。此外,在保存您的值时,没有理由调用RegCreateKeyEx()
和 RegOpenKeyEx()
以获得相同的密钥(特别是因为您从 RegCreateKeyEx()
泄漏了 HKEY
)。只需使用RegCreateKeyEx()
返回的HKEY
并将其传递给RegSetValueEx()
。创建已经存在的密钥不是错误。我已更新我的答案以显示这些详细信息。
非常感谢您的帮助。我现在明白我错在哪里并修复了代码。【参考方案2】:
我猜你应该将hKey
传递给RegSetValueEx
【讨论】:
并打开它进行写访问。 我试过了。我收到错误消息 2。我认为这意味着该函数无法访问密钥。 错误2是ERROR_FILE_NOT_FOUND
,表示找不到请求的key。以上是关于关于RegCreateKeyEx函数的用法(+50分)的主要内容,如果未能解决你的问题,请参考以下文章
RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 无法设置值
> 使用 RegCreateKeyEx() 的 Windows 可执行文件不提示输入 UAC 管理员权限并失败? [复制]