vista下面修改注册表失败

还没淹死的鱼 2009-08-26 04:57:09
HKEY hkeyToUse = HKEY_CURRENT_USER;
HKEY key = NULL;
LONG res;
char *pKeyName = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.pdf\\UserChoice";
res = RegOpenKeyExA(hkeyToUse, pKeyName, 0, KEY_READ | KEY_WRITE, &key);
if (ERROR_SUCCESS != res)
{
res = RegCreateKeyExA(hkeyToUse, pKeyName, 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &key, NULL);
if (ERROR_SUCCESS != res) {
goto Exit;
}
}
res = RegSetValueExA(key, "Progid", 0, REG_SZ, (const BYTE*)exePath, strlen(exePath)+1);
if (ERROR_SUCCESS != res)
{
goto Exit;
}
.........

打开时返回5, 可是我已经以管理员方式运行了.
在xp下面可以运行.
打开时把KEY_WRITE去掉可以返回0, 但无法修改.

实在没办法了, 是不是漏了什么步骤?
...全文
120 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
还没淹死的鱼 2009-08-31
  • 打赏
  • 举报
回复
经多次测试, 提升权限后就可以了

以前没成功的原因是工程名和最后生成的文件名不一样

但有一台计算机怎么都不行, 不管他了
Ghost90 2009-08-27
  • 打赏
  • 举报
回复
可能是权限问题,VISTA 有个叫作 UAC的东东,它把权限管得很严
打开UAC 控制,VISTA 对于每个注册键都有权限控制,可以单独设置,默认user只有读取权限
MoXiaoRab 2009-08-26
  • 打赏
  • 举报
回复
gDebugShowLinks这玩意哪里来的?你再好好检查下,肯定可以的
还没淹死的鱼 2009-08-26
  • 打赏
  • 举报
回复
还没搞定:
直接包含的话提示:
error C2059: 语法错误 : “<”
error C2065: “gDebugShowLinks”: 未声明的标识符

作为资源加进来编译是过了, 但没起作用......
MoXiaoRab 2009-08-26
  • 打赏
  • 举报
回复
比如你写的EXE叫Test.exe,那么那个就叫Test.exe.manifest,也可以先在记事本中存好放进res文件夹,然后工程中包含进来,就直接编译
还没淹死的鱼 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ghost90 的回复:]
改成 RegOpenKeyExW 把A都改成 W
Vista 好像用的是 UNICODE
[/Quote]

不是这个问题, 我的工程属性都改成多字节了

谢谢回复
还没淹死的鱼 2009-08-26
  • 打赏
  • 举报
回复
/提升和恢复权限函数
int EnablePrivilege(LPCTSTR lpszPrivilegeName,BOOL bEnable)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY | TOKEN_READ,&hToken))
return 0; //打开进程的令牌环
if(!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
return 1; //修改进程权限
tp.PrivilegeCount = 1; //赋给本进程特权
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hToken,FALSE,&tp,NULL,NULL,NULL);
//通知Windows修改本进程的权限
CloseHandle(hToken); return 0;
}
权限提升后, 的确有进步, 但还是不能修改UserChoice下面的内容
资源也加了,是不是还要在资源属性里把文件名改为Manifest? 改了, 没起作用

我只是想修改pdf文件的默认打开方式, 没想到在vista下这么麻烦...
Ghost90 2009-08-26
  • 打赏
  • 举报
回复
改成 RegOpenKeyExW 把A都改成 W
Vista 好像用的是 UNICODE
Ghost90 2009-08-26
  • 打赏
  • 举报
回复
换成 RegOpenKeyEx
RegCreateKeyEx
RegSetValueEx
试试
带A的不是SDK平台函数
MoXiaoRab 2009-08-26
  • 打赏
  • 举报
回复
还有,添加个Manifest文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="test.exe.manifest"
type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

该代码添加到VC资源中即可, 添加方式:

添加一个“custom”资源,"resource type"填24,把资源ID改为1
MoXiaoRab 2009-08-26
  • 打赏
  • 举报
回复
提个SE_DEBUG_NAME权限试试,很多注册表提权后就能写了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧