2010-10-29 23 views
6

tôi cần phải biết làm thế nào có thể phát hiện nếu một lớp OCX (ClassID) là đã đăng ký mới trong WindowsDetect nếu một lớp OCX được đăng ký trong Windows

cái gì đó như

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

Được cảnh báo rằng điều này không có nghĩa là các ocx thực tế là trên đĩa và trong vị trí bên phải. Và thậm chí sau đó nó không có nghĩa là các ocx có thể được nạp mà không có vấn đề. Và vì có đăng ký miễn phí com (http://msdn.microsoft.com/en-us/library/ms973913.aspx) nó cũng không cho biết liệu ocx có khả năng sử dụng được không. –

Trả lời

8

bạn có thể kiểm tra sự tồn tại của CLSID theo số HKEY_CLASSES_ROOT trong cửa sổ đăng ký.

kiểm tra mẫu này

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 là một con quái vật phức tạp, đăng ký có nhiều mẩu đối với họ, và Vista + trở đi làm cho nó phức tạp hơn với các quy tắc UAC Virtualization Registry.

Tùy chọn tốt nhất là chỉ cần cố gắng thực hiện OCX và xem liệu nó có thành công hay không. Điều đó sẽ cho bạn biết liệu OCX có được đăng ký chính xác hay không, tất cả các phần được nối, cho dù OCX có thể sử dụng được trong ngữ cảnh của người dùng hay không, v.v.

1

Vấn đề với (nhiều, nhiều) đề xuất thu thập thông tin đăng ký là rằng:

  • có nhiều hơn một địa điểm đăng ký, bạn sẽ cần phải nhìn vào
  • một lớp có thể được đăng ký và không tồn tại trong registry

Registration-free COM cho phép một lớp có sẵn mà không có nó là r egistered. Khái niệm bạn không muốn biết nếu một lớp học là "đã đăng ký", bạn chỉ muốn biết nó đã được đăng ký đủ để được tạo.

Thật không may là (và tốt nhất) Cách duy nhất để làm điều đó là để tạo ra nó:

//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; 
Các vấn đề liên quan