Получение списка компонентов выбранного пакета
Как уже упоминалось ранее, интерфейсы, предоставляемые ComAdmin.dll позволяют добираться к компонентам только путем последовательного просмотра всего дерева. Таким образом, для того, чтобы получить имена всех компонентов, которые содержатся в данном пакете, сначала нужно пробежать по списку всех пакетов. При этом поиск можно проводить как по имени (свойство Name), так и по свойству Key (application GUID).
После того, как пакет найден, можно просмотреть COM компоненты, которые в нем находятся. Они так же объединены в коллекцию. Для получения коллекции мы вызываем метод GetCollection и указываем, что нам нужен элемент Component, который принадлежит пакету с нужным нам GUID. То есть, если вы заранее знаете application GUID, то производить поиск по имени необязательно.
comps := ICatalogCollection(Apps.GetCollection('Components', app.Key)); comps.Populate; //Refresh list of components compsCount := comps.Count; //Components count for j := 0 to compsCount - 1 do begin //Put all componetes into list comp := ICatalogObject(Comps.Item[j]); List.Add(comp.Name); end |
Обратите внимание на то, что и здесь перед просмотром списка используется метод Populate. Ниже приводится полный текст функции.
function GetComponentsList(ApplicationName : string; List: TStrings): boolean; var MainCatalog : ICOMAdminCatalog; Apps : ICatalogCollection; App : ICatalogObject; Comps : ICatalogCollection; comp : ICatalogObject; AppsCount, CompsCount : integer; i, j : integer; begin try List.Text := ''; //Empty List; MainCatalog := CoCOMAdminCatalog.Create; //Create Main catalog // Getting Application folder Apps := MainCatalog.GetCollection('Applications') as ICatalogCollection; Apps.Populate; //Refresch Application folder contents Appscount := Apps.Count; //Applications count for i := 0 to AppsCount -1 do begin //Search Application by name App := ICatalogObject(Apps.Item[i]); if App.Name = ApplicationName then begin // Application found //Getting aplication's components by application key (GUID) comps := ICatalogCollection(Apps.GetCollection('Components', app.Key)); comps.Populate; //Refresh list of components compsCount := comps.Count; //Components count for j := 0 to compsCount - 1 do begin //Put all componetes into list comp := ICatalogObject(Comps.Item[j]); List.Add(comp.Name); end end end; result := true; except result := false; end end; |