2010-10-29 21 views
6

necesito saber cómo se puede detectar si una clase OCX (ClassID) es registrada en Windowsdetectar si una clase OCX se ha registrado en Windows

algo así como

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

se advirtió que esto no significa que el OCX real es en el disco y en el lugar correcto. Y aun así, eso no significa que el ocx se pueda cargar sin problemas. Y dado que no hay registro com gratuito (http://msdn.microsoft.com/en-us/library/ms973913.aspx) tampoco indica si el ocx es potencialmente utilizable. –

Respuesta

8

se puede comprobar la existencia de la CLSID bajo el HKEY_CLASSES_ROOT en el registro de Windows.

cheque esta muestra

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 es una bestia compleja, registros tienen muchas piezas a ellos, y Vista + en adelante que sea más complicado con las normas UAC Registro de virtualización.

La mejor opción es simplemente intentar crear una instancia del OCX y ver si tiene éxito o falla. Eso le dirá si el OCX está registrado correctamente, todas las piezas están conectadas, si el OCX es incluso utilizable dentro del contexto del usuario llamante, etc.

1

El problema con (muchas, muchas) sugerencias de rastrear el registro es que:

  • existe más de una ubicación de registro que tendría que mirar a
  • una clase puede ser registrado y no existir en el registro

Registration-free COM permite que una clase esté disponible sin ella ser r egistered. Conceptualmente no desea saber si una clase es "registrada", solo quiere saber que está lo suficientemente registrada como para ser creada.

Por desgracia, la única manera (y mejor) que ver que es para crearlo:

//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; 
Cuestiones relacionadas