2010-10-29 3 views
6

i besoin de savoir comment peut détecter si une classe OCX (ClassID) est registred dans Windowsdétecter si une classe OCX est enregistrée dans Windows

quelque chose comme

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

averti que cela ne signifie pas la OCX réelle est sur le disque et au bon endroit. Et même alors, cela ne signifie pas que l'ocx peut être chargé sans problèmes. Et puisqu'il y a enregistrement free com (http://msdn.microsoft.com/en-us/library/ms973913.aspx) il ne dit pas non plus si l'ocx est potentiellement utilisable. –

Répondre

8

vous pouvez vérifier l'existence de la CLSID sous le HKEY_CLASSES_ROOT dans le registre Windows.

vérifier cet échantillon

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 est une bête complexe, les inscriptions ont beaucoup de morceaux pour eux, et Vista + faire en avant plus compliqué avec les règles de virtualisation du Registre UAC. La meilleure option consiste simplement à essayer d'instancier l'OCX et de voir s'il réussit ou échoue. Cela vous dira si l'OCX est enregistré correctement, si toutes les pièces sont connectées, si l'OCX est encore utilisable dans le contexte de l'utilisateur appelant, etc.

1

Le problème avec (beaucoup, beaucoup) de suggestions d'exploration du registre est que:

  • il y a plus d'un emplacement de registre, vous devez regarder
  • une classe peut être enregistré et ne pas exister dans le registre

Registration-free COM permet une classe d'être disponible sans elle être r inventé. Conceptuellement, vous ne voulez pas savoir si une classe est "registered", vous voulez simplement savoir si elle est suffisamment enregistrée pour être créée.

Malheureusement, la seule (et le meilleur) façon de le faire est de le créer:

//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; 
Questions connexes