Во всех приведенных ниже примерах мы будем создавать компонент для управления MTS динамически. Тем читателям, которые будут использовать Delphi 6, делать это необязательно. Можно просто воспользоваться компонентом COMAdminCatalog, который находится на странице COM+. Кстати, в этом случае вы можете воспользоваться справочной системой по методам и свойствам всех рассматриваемых ниже интерфейсов.
В следующем примере мы создадим каталог и получим доступ к списку всех COM+ пакетов, находящихся в папке Applications (Рисунок 1).
Сначала необходимо создать сам COMAdminCatalog.
uses COMAdmin_TLB; .... var MainCatalog : ICOMAdminCatalog; Apps : ICatalogCollection; ....... MainCatalog := CoCOMAdminCatalog.Create; //Create Main catalog // Getting Application folder Apps := MainCatalog.GetCollection('Applications') as ICatalogCollection; |
Данный фрагмент кода вам придется использовать практически всегда, поскольку для доступа к нужному вам элементу приходится перебирать все дерево элементов. Дело в том, что метод GetCollectionByQuery в интерфейсе ICOMAdminCatalog, который должен возвращать нужный вам элемент или коллекцию, пока не реализован.
После того, как вы получили интерфейс коллекции, необходимо обязательно вызвать метод Populate этого интерфейса. Дело в том, что метод GetCollection не читает список элементов коллекции и если вы попытаетесь обратиться к методам интерфейса без вызова этого метода, то увидите, что список пуст.
Найти нужный элемент в коллекции также можно только путем полного перебора всех его элементов, поскольку метод PopulateByQuery в интерфейсе (по крайней мере, на момент написания статьи) не реализован. В данном фрагменте в список помещаются имена всех компонентов, которые входят в коллекцию. Заметим, что поскольку свойство Item возвращает IDispatch, то используется приведение типов (неявный вызов функции QueryInterface).
Apps.Populate; //Refresch Application folder contents Appcount := Apps.Count; //Applications count for i := 0 to AppCount -1 do begin //Put all application's names into the list App := ICatalogObject(Apps.Item[i]); List.Add(App.Name); end; |
Ниже приводится функция, полностью реализующая эту возможность.
function GetApplicationsList(List: TStrings): boolean; var MainCatalog : ICOMAdminCatalog; Apps : ICatalogCollection; App : ICatalogObject; AppCount : integer; i : 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 Appcount := Apps.Count; //Applications count for i := 0 to AppCount -1 do begin //Put all application's names into the list App := ICatalogObject(Apps.Item[i]); List.Add(App.Name); end; result := true; except result := false; end end; |