모든 CLSID 레지스트리 키를 읽고 목록 상자에 이름을 표시하는 다음 프로그램이 있습니다. 델파이로 작성되었지만 질문은 델파이에만 국한된 것이 아닙니다. Windows 레지스트리에 관한 질문입니다.일부 CLSID 레지스트리 키가 있지만 읽을 수 없습니다.
procedure TForm2.Button1Click(Sender: TObject);
var
guid: string;
reg: TRegistry;
sl: TStringList;
i: Integer;
name: string;
begin
memo1.Clear;
reg := TRegistry.Create;
sl := TStringList.Create;
memo1.Lines.BeginUpdate;
try
reg.RootKey := HKEY_CLASSES_ROOT;
if reg.OpenKeyReadOnly('\CLSID\') then
begin
reg.GetKeyNames(sl);
reg.CloseKey;
for i := 1 to sl.Count-1 do
begin
guid := sl.Strings[i];
if reg.OpenKeyReadOnly('\CLSID\'+guid) then
begin
try
name := reg.ReadString('');
except
name := '!!! <ERROR1> !!!';
end;
reg.CloseKey;
end;
memo1.Lines.Add(guid + ' ' + name);
end;
end;
finally
sl.Free;
reg.Free;
memo1.Lines.EndUpdate;
end;
end;
문제는 다음 레지스트리 키 (그들이 GetKeyNames에 나와있는) 존재한다는 것입니다,하지만 그들은 (기본 값을 읽기) 읽을 수 없습니다. 예외가 발생했습니다. " ''에 대한 데이터 유형이 잘못되었습니다. 실패
키는 다음과 같습니다이 키는 내가 (정말 보여줍니다 모든 있음) NT-AUTHORITY의 \ 시스템 컨텍스트에서 regedit를 실행하는 경우에도, regedit.exe
에 표시되지 않습니다
{33297C9D-2A25-1679-1475-A1CE3901C86D} !!! <ERROR1> !!!
{45049248-47E9-7CEE-A822-1E555F74D237} !!! <ERROR1> !!!
{69C5BE90-E717-97A6-CCEF-C44D93111A5A} !!! <ERROR1> !!!
{8663D540-C578-44AE-9D24-4A9D9A4881C3} !!! <ERROR1> !!!
{9A73B3FA-50DF-3410-930D-51C35FC9237E} !!! <ERROR1> !!!
{EACF7497-3D67-8044-DE95-81429597BB8F} !!! <ERROR1> !!!
.
동일한 문제가 있습니까? 아니면 레지스트리가 손상되었습니다.
'non.string' 데이터 유형을 얻기 위해서'reg.GetDataAsString ('');'을 사용하십시오. – bummi
@bummi, 문제 해결을위한 해결책입니다 (예외).아래의 레지스트리 리디렉터에 대한 이야기는 훌륭하지만 "regedit에서 키를 찾을 수 없습니다"* 문제의 일부를 다룹니다. – TLama
@ TLama 아래 이야기는 모두 다룹니다 –