2014-10-23 2 views
-1

모든 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> !!! 

.

동일한 문제가 있습니까? 아니면 레지스트리가 손상되었습니다.

+2

'non.string' 데이터 유형을 얻기 위해서'reg.GetDataAsString ('');'을 사용하십시오. – bummi

+0

@bummi, 문제 해결을위한 해결책입니다 (예외).아래의 레지스트리 리디렉터에 대한 이야기는 훌륭하지만 "regedit에서 키를 찾을 수 없습니다"* 문제의 일부를 다룹니다. – TLama

+0

@ TLama 아래 이야기는 모두 다룹니다 –

답변

2

명백한 설명은 키가 있지만 잘못된 위치에서 찾는다는 것입니다. 64 비트 컴퓨터에서 32 비트 프로세스가 있고 키는 registry redirector으로 리디렉션 될 것입니다.

HKCR\Wow6432Node\CLSID 

더 유용한 정보에서 regedit를 32 비트 CLSID 섹션

봐는 MSDN에 Registry Keys Affected by WOW64에서 찾을 수 있습니다.

그런 다음 키를 찾으면 기본 값에 예상 한 데이터 형식이없는 것으로 보입니다. 문자열을 기대하지만 일부 키의 유형이 분명합니다. 이를 처리하려면 프로그램에 복원력을 추가해야합니다.

내 컴퓨터에서 처음 CLSID를 사용하면 실제로는 64 비트 레지스트리 HKCR\CLSID에서 찾을 수 없습니다. 그러나 HKCR\Wow6432Node\CLSID\{33297C9D-2A25-1679-1475-A1CE3901C86D} 미만이 존재합니다. 기본값은 REG_BINARY입니다. 그래서

, 여기에 요약 내 결론입니다합니다 :

  • 레지스트리가 괜찮습니다.
  • 프로그램이 32 비트보기에서 읽지 만 regedit에서 64 비트보기를보고 있습니다.
  • 모든 CLSID 키가 기본값으로 REG_SZ을 사용하는 것은 아닙니다.

당신은 당신이 당신의 프로그램의 비트 수에 일치하는 것보다 다른 레지스트리보기에서 읽어보기를 지정 KEY_WOW64_64KEY 또는 KEY_WOW64_32KEY 플래그를 사용할지 결정해야합니다. Accessing an Alternate Registry View에 자세히 설명되어 있습니다. 귀하의 경우에는 KEY_WOW64_64KEY을 사용하여 64 비트보기에서 읽을 수 있습니다. AS를


옆으로, 당신의 for 루프는 0보다는 1에서 시작해야한다.

+0

이 힌트를 주셔서 대단히 감사합니다. 예 Win64 PC에서 32 비트 응용 프로그램 (XE7로 컴파일 됨)을 실행하고 있습니다. "Wow6432Node"에서이 레지스트리 키를 발견했습니다. 이제 GetDataAsString을 사용하거나 문자열이 아닌 기본값을 처리하는 비슷한 방법을 사용합니다. (나는 레지스트리 표준이 디폴트 값을'REG_SZ' 만 정의했다고 생각했다.) –

+0

기본값은 명명 된 값과 동일한 유형을 사용하여 데이터를 저장할 수 있습니다. –

관련 문제