以下为原贴:http://expert.csdn.net/Expert/topic/1663/1663413.xml?temp=.2477381
主 题: 为何注册表里有些键能读出来,有些键读不出来???
作 者: firmamenthy (执子之手)
等 级:
信 誉 值: 100
所属论坛: Delphi 基础类
问题点数: 50
回复次数: 5
发表时间: 2003-04-15 14:14:31
以下程序运行正确:
procedure TForm1.Button1Click(Sender: TObject);
var
reg: TRegistry;
st: Tstrings;
i: Integer;
begin
memo1.Lines.Clear;
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Control', False) then \\ 注意这里!
showmessage('打开键失败');
st := TstringList.Create;
try
reg.GetValueNames(st);
for i := 0 to st.Count - 1 do
Memo1.Lines.Add(reg.Readstring(st.strings[i]));
finally
st.Free;
end;
reg.CloseKey;
finally
reg.Free;
end;
end;当我把这行的键换一下就不行了:
if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Control', False) then
换成:if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000\4&1bb95972&0&1', False) then \\ 出错,不能打开键
回复人: jenemery(小熊) ( ) 信誉:100 2003-04-15 15:08:00 得分:0
不懂,帮你up
Top
回复人: tongki_8(矛盾与迟钝) ( ) 信誉:100 2003-04-15 15:42:00 得分:0
if NOT reg.OpenKey('SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000\4&1bb95972&0&1', False) then
~~~~~~~~~~~~~~把False改成True试试。 可
Top
回复人: zhourongbiao(Edward) ( ) 信誉:100 2003-04-15 16:08:00 得分:0
可能是&在字符串中不代表字符而是代表其他特殊含意,你可以查查Delphi的帮助。
Top
回复人: firmamenthy(执子之手) ( ) 信誉:100 2003-04-15 16:56:00 得分:0
TO tongki_8(矛盾与迟钝) :改成TRUE就不是我要的效果了,我只希望它进行读动作,而不希望它做建立的动作。
TO zhourongbiao(Edward) :或许你说的是一个问题,我也曾考虑过;但我试图打开'SYSTEM\CurrentControlSet\Enum\'这个节点都会出错;所以
PS:我要读取的键值就在这个目录下SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000,我怎么才能正确读取这些带&符号的键值信息呢?
Top
回复人: firmamenthy(执子之手) ( ) 信誉:100 2003-04-16 09:22:00 得分:0
&符号并不是特殊符号,我试着在\HARDWARE\DEVICEMAP\KeyboardClass键下建立了子键4&1bb95972&0&2;并在这个路径下\HARDWARE\DEVICEMAP\KeyboardClass\4&1bb95972&0&2建立了一个项,名为hy&lc,值为hello&boy;能正常读取。
PS:我调试的系统是WIN2K下,WIN98下暂时没有发现不能读取的现象。请各位高手出手相助~!
//===============================================================PS:我发现不能打开的键;用regedit.exe也不能在之下建立新键,或建立新项。
解决方案 »
- 指针问题!!
- vc++操作word,在word中生成柱状图,饼状图,请专家帮忙,在线等
- 请教,如果读CPU的MSR。
- 同时播放多个网络电台,每个电台的声音分别从一块声卡出来,不知道有没有好的解决方法
- 一个小问题:弹出ABOUTBOX?
- C runtime函数库中的函数扮演什么角色
- 如何得知当前CWnd的滚动尺寸,可能我太笨了,看似很简单的问题,却找不到答案,急求大家帮助!!!谢谢了!一定结贴:)
- 在atl定义com接口方法时,为了使参数缺省,前面加一个什么命令字
- 在vc中怎样给一个project加Library
- 如何编程获取网关在注册表中的位置
- 关于DOM 的insertBefore函数
- 关于设置键盘钩子如何发送多个虚拟键的消息的问题?
LPCTSTR data_set = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\";
long ret_0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_set,0,KEY_ALL_ACCESS, &hkey)long ret_1 = ::RegSetValueEx( hkey, "BadQQ", 0, type, path_set, cbdata);
::RegCloseKey( hkey );呵呵,上面这几个函数应该对你有帮助。
这种方法的的可行性值得怀疑,不知道regedit能否这样参数调用以达到我要求的目的。二、用参数调用regedit.exe,使之导出注册表所有键的信息到一个文本中,然后我在从这个文件中找我需要的信息;
这种方法应该是可行的,但弊端就是需要一个临时文件,而且我全文检索内容是需要占用较大的资源,这样就影响了我的程序的效率。
目前我存在的问题是:1.我不熟悉注册表的所有参数及其使用效果;2.我不清楚其调用的API函数;3.对于不同版本的WINDOWS版本是否调用参数不一样?
// 这种方法应该是可行的,但弊端就是需要一个临时文件,而且我全文检索内容是需要占用较大的资源,这样就影响了我的程序的效率。我认为也是不可行的。如果你的应用程序无法访问这些主键,那么你导出注册表时应该看不到这些主键。
同时,我也做了个实验,我把读权限在EVERY ONE里禁止,这个时候,用REGEDIT也是看不到被禁的节点内容的。我是来找解决问题的途径的,希望你能帮助我。
TO jnxulei(石头) :现在我遇到的问题是,我想读取别的公司写在注册表里面的信息,而这个信息正好又放在受保护的节点里, 所以我必须读出注册表信息。
TO wily2002(如麻) :我做的是一个界面程序,所以不能要求用我程序的最终用户必须要是Administrator权限的用户,就是说,程序要求有通用性;
我对你后面提出的想法很感兴趣,那么如何能模拟Administrator身份呢?热切盼望你的回音!
ftp://delphi-jedi.org/Code_Library/Release_1_11/JCL.zipProject JEDI ACLAPI, ACLUI头文件
(JwaAclUI.pas, JwaAclApi.pas) - ftp://delphi-jedi.org/api/Win32API.zipJCL 中有一个JclSecurity.pas unit,有一个函数叫做AllowRegKeyForEveryone就是干这个
事情的,我调试通过function AllowRegKeyForEveryone(Key: HKEY; Path: string): Boolean;
var
WidePath: PWideChar;
Len: Integer;
begin
case Key of
HKEY_LOCAL_MACHINE:
Path := 'MACHINE\' + Path;
HKEY_CURRENT_USER:
Path := 'CURRENT_USER\' + Path;
HKEY_CLASSES_ROOT:
Path := 'CLASSES_ROOT\' + Path;
HKEY_USERS:
Path := 'USERS\' + Path;
end;
Len := (Length(Path)+1)*SizeOf(WideChar);
GetMem(WidePath,Len);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(Path), -1, WidePath, Len);
Result := SetNamedSecurityInfoW(WidePath, SE_REGISTRY_KEY,
DACL_SECURITY_INFORMATION, nil, nil, nil, nil) = ERROR_SUCCESS;
FreeMem(WidePath);
end;SetNamedSecurityInfo函数设置特定securable object的security descriptor, 是Access Control API,
在下载的Jed Object Pascal API Library里面声明了
Sv-COM VCL Component
http://www.aldyn.ru/SAM-Solution NTSet VCL Component
http://www.sam-solutions.net/Registry Key Security and Access Rights
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/regapi_9zoz.aspSecurity Identifiers (SIDs)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_identifiers_sids_.aspAccess Tokens
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/access_tokens.aspSecurity Descriptors
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/security_descriptors.aspSecurable Objects
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/Security/securable_objects.asp