2010-10-29 9 views
6

muszę wiedzieć, w jaki sposób można wykryć, czy dana klasa OCX (ClassID) jest zarejestrowany w systemie Windowswykryć, czy dana klasa OCX jest zarejestrowany w systemie Windows

coś

function IsClassRegistered(ClassID:string):boolean; 
begin 
//the magic goes here 
end; 

begin 
    if IsClassRegistered('{26313B07-4199-450B-8342-305BCB7C217F}') then 
    // do the work 
end; 
+1

być ostrzeżony, że nie oznacza to rzeczywisty OCX jest na dysku i we właściwym miejscu. I nawet wtedy nie oznacza to, że ocx może być ładowany bez problemów. A ponieważ jest darmowa rejestracja (http://msdn.microsoft.com/en-us/library/ms973913.aspx), nie wiadomo też, czy ocx jest potencjalnie użyteczny. –

Odpowiedz

8

można sprawdzić istnienie CLSID pod numerem HKEY_CLASSES_ROOT w rejestrze systemu Windows.

Kontrola ta próbka

function ExistClassID(const ClassID :string): Boolean; 
var 
    Reg: TRegistry; 
begin 
try 
    Reg := TRegistry.Create; 
    try 
    Reg.RootKey := HKEY_CLASSES_ROOT; 
    Result  := Reg.KeyExists(Format('CLSID\%s',[ClassID])); 
    finally 
    Reg.Free; 
    end; 
except 
    Result := False; 
end; 
end; 
2

ActiveX/COM jest złożonym bestia, rejestracje mają wiele elementów do nich, a Vista + naprzód uczynić go bardziej skomplikowane z zasadami UAC Registry wirtualizacji.

Najlepszym rozwiązaniem jest po prostu próba utworzenia instancji OCX i sprawdzenia, czy się udało, czy nie. Dzięki temu dowiesz się, czy OCX jest poprawnie zarejestrowany, wszystkie elementy są podłączone, czy OCX jest użyteczny w kontekście użytkownika dzwoniącego itp.

1

Problem z (wieloma, wieloma) sugestiami przeszukiwania rejestru że:

  • istnieje więcej niż jedna lokalizacja rejestru trzeba by spojrzeć na
  • klasa może być zarejestrowany i nie istnieje w rejestrze

Registration-free COM pozwala klasa będzie dostępna bez niego być r egistered. Koncepcyjnie nie chcesz wiedzieć, czy klasa jest "zarejestrowana", chcesz tylko wiedzieć, że jest wystarczająco zarejestrowana, aby ją utworzyć.

Niestety tylko (i najlepszym) sposobem na to jest, aby go utworzyć:

//Code released into public domain. No attribution required. 
function IsClassRegistered(const ClassID: TGUID): Boolean; 
var 
    unk: IUnknown; 
    hr: HRESULT; 
begin 
    hr := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IUnknown, {out}unk); 
    unk := nil; 

    Result := (hr <> REGDB_E_CLASSNOTREG); 
end; 
Powiązane problemy