Как сделать оа

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Алексей Павлов
дата публикации 07-10-2002 16:00

"Одно лишь то, что что-то не делает того, что вы ему
запланировали делать, не означает, что оно бесполезно".
Т. Эдисон

  1. Предисловие.
  2. Введение.
  3. Позднее и раннее связывание - что лучше?
  4. Создание внешнего сервера автоматизации и контроллера для работы с ним.
  5. Создание внутреннего сервера автоматизации.
  6. Создание контролера для управления внутренним сервером автоматизации.
  7. Обеспечение совместимости созданных серверов автоматизации с другими языками и средами разработки.
  8. Послесловие.
  9. Список использованной литературы.

1. Предисловие.

В данной статье речь пойдёт об одной из COM-ориентированных технологий, которая занимает одно из ведущих мест при разработке программных средств, использующих технологию COM. Итак, разговор пойдёт об автоматизации.

Хочу отметить, что даже если вы уже имели дело с автоматизацией в Delphi 2, то даже в этом случае вам стоит прочесть данную статью, т.к. методы, применяемые для создания автоматизации, коренным образом изменились, начиная с третьей версии Delphi.

Я ориентировал данную статью на неискушённых в COM-программировании людей, попросту говоря, на новичков в данной области, поэтому я намеренно не вдавался в объяснения некоторых деталей, понимание которых может только запутать неискушённого читателя. По этой же причине (ориентированности на НЕпрофессионалов), некоторые вещи (очевидные для опытных людей) я разобрал с особой тщательностью.

Прежде чем приступить к прочтению данной статьи, читателю, не знакомому с основными концепциями и терминами, используемыми при описании технологии COM, стоит хотя бы поверхностно с ними ознакомиться.

По ходу статьи я всё же буду раскрывать некоторые термины, что бы избежать возможных разночтений, связанных с двояким пониманием одних и тех же терминов.

2. Введение.

Начало разговора стоит начать, пожалуй, с рассказа о преимуществах автоматизации. Основным преимуществом является независимость от языка, т.е. контроллеры автоматизации могут управлять сервером независимо от языка, на котором был написан сервер (или клиент). Ваши программы могут быть "незаконченными", т.е. в них будет "заложена" возможность дополнения, расширения или даже изменения логики, интерфейса, возможностей. Таким образом, после незначительной работы другого программиста по программированию вашей программы (программированию в тех рамках, в которых вы это предполагали), ваш программный продукт сможет решать задачи, решения которых изначально не предполагалось. Конечно, имеются ещё немало плюсов, оценить которые вы сможете непосредственно работая с автоматизацией. Кроме того, стоит отметить, что автоматизация поддерживается на уровне операционной системы (Windows).

Введём несколько терминов:

Для Delphi-программиста написание СА выглядит следующим образом: в любое своё приложение вы встраиваете СА с помощью Automation Object Wizard-а Delphi и с помощью редактора библиотеки типов указываете, какие методы и свойства предоставлять КА, после чего AOWizard создаёт файл-скелет, который вы заполняете своим кодом - в первом приближении это всё (более подробно см. ниже). Что бы понять, что скрывается за всей этой простотой, придётся повозиться с теорией (в конце концов, эта возня всегда себя оправдывает).

Объекты автоматизации (ОА) - это обычные COM-объекты, в которых помимо интерфейса IUnknown реализован интерфейс IDipatch. Интерфейс IDipatch определён в модуле System следующим образом: Хочу сразу оговориться: если вы собираетесь воспользоваться средствами Delphi для реализации СА и КА, то вам вовсе не обязательно прямо сейчас вникать во все тонкости интерфейса IDipatch , т.к. Delphi как всегда максимально упрощает работу программиста, инкапсулируя автоматизацию (о преимуществах такого подхода, безусловно, можно спорить). Рано или поздно, так или иначе, но вы всё равно вернётесь к более глубокому рассмотрению интерфейсов и их реализаций, а сейчас этот параграф можно пропустить.

Итак, подробно рассмотрим основную функцию интерфейса IDipatch :

  • DispID - содержит диспетчерский идентификатор (dispatch ID), это число, которое показывает какой метод должен быть вызван в сервере.
  • IID - на данный момент не используется (по имеющимся у меня на данный момент сведениям).
  • LocaleID - содержит информацию о языке.
  • Flags - определяет какого типа метод будет вызван в сервере: метод доступа к свойствам или обычный метод.
  • Params - содержит указатель на массив TDispParams, который содержит параметры, передаваемые этому методу.
  • VarResult - это указатель на переменную типа OleVariant, в которую будет записано возвращаемое значение вызываемого метода.
  • ExcepInfo - указатель на запись типа TExceptInfo, которая будет содержать информацию об ошибке, в случае, если метод Invoke() возвращает значение DISP_E_TYPEMISMATCH или DISP_E_PARAMNOTFOUND.
  • ArgErr - указатель на целое число (индекс некорректного параметра в массиве Params).

Если вы дочитали до этого места, то наверняка сумеете вытерпеть ещё немного сухой теории, после которой мы перейдём к рассмотрению практической части, и вы сами убедитесь, что Delphi действительно делает разработку СА и КА делом простым и приятным ;)

3. Позднее и раннее связывание - что лучше?

Позднее связывание (late binding) - позднее связывание имеет место в том случае, если необходимый метод вызывается с помощью метода Invoke() интерфейса IDipatch, т.е. вызов метода невозможен до момента выполнения программы, т.к. требуемый адрес просто неизвестен (при вызове методов с помощью типа Delphi Variant или Ole Variant мы тоже имеем дело с поздним связыванием). Раннее связывание (early binding) - смысл раннего связывания заключается в том, что параметры DispID для вызываемых методов разрешаются ещё на этапе компиляции, что исключает временные накладки, связанные с вызовом метода GetIDsOfNames() перед вызовом одного из методов, как это делается при позднем связывании. При раннем связывании КА могут вызывать объекты автоматизации непосредственно с помощью виртуальных таблиц (vtable), т.е. не используя IDipatch. Invoke(), таким образом, доступ к требуемому методу происходит быстрее, чем при позднем связывании. Раннее связывание используют при вызове метода с помощью типа interface Delphi. Если вы разрабатываете объекты автоматизации с помощью встроенного в Delphi Automation Object Wizard ( AOWizard ), то вы автоматически получите ОА поддерживающий двойной интерфейс, т.е. вы сможете вызывать методы как с помощью метода Invoke(), так и с помощью потомков интерфейса IDipatch.

Итак, пора уже переходить к практике и посмотреть, как всё это выглядит в коде.

4. Создание внешнего сервера автоматизации и контроллера для работы с ним.

  1. Запускаем Delphi и создаём новый проект, сохраняем его под именем Example1.
  2. На форму добавляем для красоты CoolBar1 на неё ToolBar1 и уже на неё ToolButton-ы.
  3. Добавляем MainMenu1 и добавляем в него соответствующие пункты.
  4. Я ещё добавил ImageList1 и ActionList1 для удобства. На этом создание пользовательского интерфейса закончено и у вас должно получиться что-то похожее на это:



В пункте CoClass Name указываем имя нашего COM-класса - AutoServ1, в пункте Instancing указываем мастеру на то, что каждый экземпляр нашего сервера может создавать и экспортировать множество экземпляров OLE-объекта (естественно, этот пункт никак не связан с OLE-контейнером, который мы добавили в наш проект :) Так же в этом пункте можно указать значения Internal и Single Instance , первое означает, что создаваемый OLE-объект может быть использован только внутри приложения, т.е. внешние процессы не будут иметь к нему доступ и соответственно его не надо регистрировать в системе, второе означает, что каждый экземпляр сервера может экспортировать только один экземпляр OLE-объекта, т.е. если КА запрашивает другой экземпляр OLE-объекта, то запускается новый экземпляр приложения-сервера. Не стоит слишком долго ломать голову над данными определениями - просто потом сами попробуйте "поиграть" с этими параметрами и вы наглядно увидите в чём разница между ними и тогда эти определения станут для вас вполне очевидными.

В пункте Threading Model выбираем разделяемую модель. События мы пока использовать не будем, а посему не выбираем Generate Event support code .



В приведённом коде, думаю, всё понятно, стоит лишь объяснить, что представляет собой метод Form1.ActionList1.Actions[0].Execute ;

Полный код примера 1 вы можете найти в архиве с примерами (Example1).
После компиляции получили файл Example1.exe, который является самостоятельным и законченным приложением. При нажатии на первую пиктограмму в панели инструментов открывается диалоговое окно "Вставка объекта", благодаря которому мы можем вставить в наш OLE-контейнер объекты различных типов.
Обратите внимание на то, что раздел uses , автоматически созданного Unit2 , содержит в себе Example1_TLB . Данный файл представляет библиотеку типов данного проекта в виде трансляции Object Pascal. Его содержимое вы можете посмотреть, выбрав View -> Units -> Example1_TLB. В данном модуле объявляется класс CoAutoServ1 , конструктор которого выглядит следующим образом:


Процесс подсоединения к СА предельно прост:

Как вы уже, наверняка, заметили, работа с СА после подсоединения к нему не составляет никаких проблем, и все виды взаимодействий между КА и СА происходят через переменную интерфейса Fintf, работа с которой практически не отличается от работы с обычными переменными-указателями на экземпляры объектов классов.

Полный код примера 1 вы можете найти в архиве с примерами (Example1).

  • Example1.dpr - проект СА.
  • Cont_Example1.dpr - проект КА.

5. Создание внутреннего сервера автоматизации.

Внутренний сервер автоматизации (InProcServer) - это библиотека (DLL), которая может создавать ОА.
Как и любой внутренний COM-сервер, внутренний СА должен экспортировать четыре стандартных функции:

Все эти функции реализованы в модуле ComServ, поэтому вам просто придётся добавить эти функции в раздел exports проекта.

Кратко о назначении этих функций:

  1. Запускаем Delphi и создаём новую библиотеку (DLL), которую назовём Example2 (хотя можно использовать и любую из ранее созданных вами библиотек, превратив её во внутренний СА).
  2. Добавляем четыре вышеописанных функции в раздел exports. Вот что должно получиться:

Примечание:
лично у меня (Delphi Enterprise Version 6.0 (Build 6.163) + Win2k Prof SP2), в таком варианте на этапе сборки возникала ошибка "File no found '.TLB'", хотя файл на самом деле присутствовал. Явное указание имени файла решило проблему:

Не забудьте в секцию uses добавить заголовочный файл Windows .
Полный код внутреннего СА вы можете найти в архиве с примерами (Example2).
Example2.dpr - проект внутреннего СА.
После компиляции проекта вы получаете файл Example2.dll, который является внутренним СА.

Теперь создадим КА для управления созданным СА.

6. Создание контролера для управления внутренним сервером автоматизации.

  1. Как всегда - создаём новый проект, создаём форму, типа той, что на рисунке и сохраняем только что созданный проект в тот же каталог, где у вас находится внутренний СА под именем Cont_Example2.


Возможно, вы обратили внимание, что все обращения к внутреннему СА из КА я обрамляю конструкцией try … except; дело в том, что, во-первых, очень часто при работе с COM ошибки в коде программы приводят, во время выполнения готовой программы, к ошибкам связанным с отказом в доступе (Access Violation), и выводимая аналитическая информация, мягко говоря, не очень информативна, во-вторых, не следует забывать, что внутренний СА работает в контексте управляющего им приложения (т.е. в адресном пространстве КА), и крах СА с большой вероятностью приведёт к краху управляющего приложения, что, в свою очередь, может привести к потере важных данных. А, используя конструкцию try … except, вы можете избежать этих неприятностей или, по крайней мере, сгладить пост травматический шок у пользователя, вызванный потерей результатов напряжённой трёхчасовой работы ;)

Вот, собственно, и всё - компилируем, запускаем, пробуем.

7. Обеспечение совместимости созданных СА с другими языками и средами разработки.

Теперь поговорим о том, как сделать уже готовые сервера автоматизации доступными для "понимания" программами (КА), при написании которых могут использоваться различные языки программирования.

Автоматизация решает проблему " взаимопонимания " с помощью механизма, позволяющего ассоциировать информацию о типе объекта с самим объектом автоматизации с помощью так называемых библиотек типов (type library). В этих библиотеках хранится информация обо всех интерфейсах, классах, типов данных и компонент сервера. Библиотека типов может быть добавлена как ресурс к вашему приложению-серверу (либо DLL) или находится во внешнем файле. Информация из библиотеки типов предоставляется сервером клиенту.

Работая с мастерами по созданию COM-приложений в Delphi, вы получаете автоматически сгенерированную библиотеку типов и файл, содержащий преобразованную информацию из данной библиотеки в язык Object Pascal. Как вы помните, при написании КА мы включали в раздел uses название модуля, содержащего представление библиотеки типов разрабатываемого проекта в виде трансляции Object Pascal. Именно этот pas-файл позволяет вашему КА "понимать" интерфейс СА.

Независимо от того находится ли файл библиотеки типов в приложении-сервере как ресурс или он "вынесен наружу", вы всегда сможете получить его трансляцию в той языковой среде, в которой вы разрабатываете КА. Для этого в каждой среде разработки есть свои средства. В частности с Delphi поставляется утилита Tlibimp, которая позволяет выполнять импорт существующей библиотеки типов в синтаксис Object Pascal, C++ и в IDL. Запустите эту утилиту без параметров и посмотрите на список опций, доступных при работе с этой утилитой. К примеру, у вас имеется внутренний СА в виде DLL (пусть будет Example2.dll, которую мы ранее разработали самостоятельно) и библиотека типов включена в него в качестве ресурса (как это сделано в нашем примере). В таком случае для того, что бы получить pas-файл, описывающий библиотеку типов данного СА, вам необходимо выполнить следующие действия:

В результате вы получите два файла: Example2_TLB.dcr и Example2_TLB.pas , которые вы можете использовать при разработке своего КА. То же и с tlb-файлами и exe-файлами: Для импорта сразу в С++ и Object Pascal синтаксис выполните следующее: В этом случае помимо pas-файла будут, соответственно, созданы cpp-файлы и файлы заголовков (h-файлы).

8. Послесловие.

Опытные программисты, ранее уже имевшие дело с автоматизацией, или хотя бы понимающие, что она собой представляет, могут заметить, что в рассмотренных примерах автоматизации в "чистом виде" очень и очень немного. Действительно - это так, но не забывайте, что эта статья является первой частью гипотетического цикла. Целью этой части было дать в доступном виде начальные понятия и представления, которых так, порой, не хватает начинающим программистам, и отсутствием которых не редко страдают некоторые книги и статьи.

Подводя итог можно сказать, что с простой частью автоматизации мы разобрались и научились создавать простенькие сервера и контроллеры автоматизации. Если данная тема (и статья соответственно) вызовет интерес общественности, то я продолжу рассказывать о применении технологии автоматизации. В следующих статьях я предполагал рассказать о более сложных технологиях, входящих в понятие "Автоматизация", таких как события автоматизации (события COM), события автоматизации при работе в Delphi, события с несколькими стоками, коллекции автоматизации и их реализация в Delphi и ещё кое-что интересное с точки зрения Delphi-разработчика.

9. Список использованной литературы.

  1. Microsoft Win32 Software Development Kit.
  2. Delphi-help, "Developing COM-based applications".
  3. Стив Тейксейра и Ксавье Пачеко, "Delphi5. Руководство разработчика. Том 2. Разработка компонентов и работа с базами данных".

Алексей Павлов
Специально для Королевства Delphi

Moscow Power Engineering Institute (Technical University)
Faculty of Nuclear Power Plants
29.09.02


Смотрите также материалы по темам: [Интерфейсы COM-объектов]

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

система OEM Activation 3,0 (OA 3,0) позволяет производителям оборудования разрабатывать внутренние системы управления запасами для управления порядком и получением Windows ключей продуктов, а также процесса создания и создания отчетов для отчета о сборке компьютера с помощью веб-служб майкрософт или служб microsoft Digital operations (мдос).

в этом материале объясняется, как реализовать и использовать средство OA 3,0 в производственной линии для создания связи оборудования, которая присоединяет один Windowsный ключ продукта, выпущенный корпорацией майкрософт, к одному компьютеру.

В OA 3,0 используются следующие термины.

Термин Описание
Отчет о сборке компьютера Отчет, формируемый изготовителем оборудования для каждого производимого компьютера на сайте изготовителя оборудования, а затем отправляется в корпорацию Майкрософт для обработки. Этот отчет включает данные заголовка, хэш-значение оборудования, идентификатор ключа продукта и все включенные дополнительные сведения.
Сопоставление оборудования уникальная ассоциация, которая объединяет один ключ продукта, выпущенный корпорацией майкрософт Windows, на один компьютер. Средство OA 3,0 создает это значение с помощью хэша оборудования и значения ключа продукта.
Хэш оборудования Уникальное значение хэша, представляющее сведения о компоненте оборудования для определенного компьютера. Поставщик вычислительной техники использует средство OA 3,0 для вычисления и отправки этого значения в дополнение к ИДЕНТИФИКАТОРу ключа продукта в корпорацию Майкрософт в отчете о сборке компьютера.
OEM Activation 3,0 (OA 3,0) методология, с помощью которой изготовитель оборудования может подготовить компьютер для Windows 8, Windows 8.1 или Windows 10 процесс активации и проверки конечных пользователей.
Ключ продукта 25-символьный ключ продукта в формате XXXXX-xxxxx-xxxxx-xxxxx-xxxxx, который корпорация майкрософт предоставляет для активации одной копии Windows на компьютере.
Идентификатор ключа продукта Уникальный серийный номер, предоставляемый корпорацией Майкрософт. Этот номер связан с ключом продукта.
службы активации и проверки Windows (Windows AVS) веб-служба майкрософт, которая проверяет Windowsную операционную систему и завершает процесс активации после того, как конечный пользователь завершает процесс готовности к работе (OOBE).

Применяется к

эти сведения относятся к Windows 10, Windows 10 IoT Корпоративная и более поздним версиям.


Как правило, при покупке компьютера или ноутбука за нас все уже сделано и диски разбиты на тома. Но когда мы сами пробуем что-то делать со своим оборудованием (покупка, замена, или просто решили помудрить ) тут возникают проблемы — сделали активным не тот раздел, система перестала загружаться и так далее. Сегодня у меня выпуске будет и немного теории, так как без нее никуда. Читайте, берите на вооружение.


Простой том жесткого диска -это…



Простой том — это самое распространенное в природе явление. Берется один винчестер на нем создается том(а) (или раздел). На наших с вами домашних компьютерах так все и сделано.

Плюсы такого решения — простое, самое дешевое, вполне подходит для домашнего компьютера. Быстродействие системы ограничено скоростью чтения/записи вашего винчестера. Отказоустойчивость при таком решении имеет самый низкий показатель. Выход из строя жесткого диска — нередкое явление.

Как создать простой том на винчестере?

Для домашнего компьютера вполне подходит такой простой том. Создать его легко можно как минимум тремя способами. Чаще и легче всего это делать при установке Windows. Второй способ — можно размечать винчестер сторонней программой (например Acronis), можно средствами операционной системы.

Первый способ мы уже рассматривали в этой статье. Второй способ наиболее предпочтителен для новых дисков, перед установкой операционных систем, или если вы решили помудрить, например поместить загрузчик на флешку.

Cоздание простого тома в Acronis disk director

Запускаем наш Acronis Disk Director. Программа отобразит все подключенные устройства и имеющиеся на них разделы. В данном случае у нас подключен новый жесткий диск и он не инициализирован.


Чтобы инициализировать диск нажимаем соответствующую кнопку…



Теперь можно приступать непосредственно к созданию томов. Нажимаем появившуюся ссылку «Создать том«:


У нас том будет базовым, логическим, для хранения данных. Поэтому нам нужно определить его размер, файловую систему, выбрать букву и метку (например, я метку логического диска ставлю DATA а системного Sys).


Cоздание тома через командную строку (cmd)

Нужда создавать том через командную строку может возникнуть в случае неполадок или можно это делать по привычке :), кому как нравится. В первом случае запускаем командную строку с установочного дистрибутива. Во втором через Пуск нужно запустить командную строку от имени Администратора:


Запускаем утилиту Diskpart ( через нее мы будем работать с разделами). Это не трудно. Будем поочередно вводить в командную строку инструкции. Первой у нас и будет команда DISKPART:


Следующая командой мы должны получить список установленных дисков. У меня сейчас подключено два:



Как сделать простой том жесткого диска основным?

Если вы выберите логический том, то система при установке Windows преобразует его в основной автоматически. Мы продолжаем работу в командной строке. Вводим команду create partition primari для создания основного раздела:

Разделы можно создавать только при наличии неразмеченного места на нем Если у Ваш диск уже размечен, то скорее всего создать разделы не получится,:


Делаем том жесткого диска активным в Windows 7, Windows 10

Программы Windows автоматизируют до известной степени процесс создания томов. При установке системы она сама разбивает основной том на дополнительные разделы, копирует туда загрузчик и раздел этот система видит как активный. И делать что-то еще система вам не даст. В том же Diskpart вводим команду List volume


…и получаем список созданных томов на всех подключенных устройствах. Другое дело специальные программы. Например, Acronis Disk Director позволяет создавать разделы для любых операционных систем, в том порядке, в котором это будет нужно Вам. Здесь достаточно кликнуть на выбранном томе мышкой и сделать его активным:



Только надо учитывать, что в системе может быть только один активный том. С него и происходит загрузка. Если у вас уже есть такой, то после создания нового он перестанет быть загрузочным. Могут измениться и буквы остальных дисков, могут перестать работать некоторые программы. Такой редкий вариант используется и в windows и в Linuks для повышения безопасности доступа к данным.

У кого такая флешка — тот и сможет загрузить компьютер. Если вы выберете такую схему, то конечно лучше будет изначально при установке производить все настройки, чем переделывать уже существующую структуру.

brit91

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Информация

Недавно просматривали 0 пользователей

Популярные темы

Автор: AtaVist
Создана 11 Августа 2017

Автор: oduvanchik_polevoi
Создана Вчера в 07:37

Автор: VVB58
Создана 22 часа назад

Автор: Dimstan
Создана 28 Февраля 2014

Автор: AtaVist
Создана 11 Августа 2017

Автор: Дмитрий1971
Создана 5 Января 2020

Автор: Mariya888
Создана 5 Февраля 2021

Автор: dann
Создана в среду в 03:52

Автор: tatyana.more
Создана 15 Июля 2021

Автор: AtaVist
Создана 11 Августа 2017

Автор: Mariya888
Создана 5 Февраля 2021

Автор: berkut008
Создана 16 Января 2019

Автор: larina 38
Создана 1 Декабря 2021

Автор: владимир 332
Создана 3 Декабря 2019

Автор: AtaVist
Создана 11 Августа 2017

Автор: berkut008
Создана 16 Января 2019

Автор: ЭДСка
Создана 23 Ноября 2020

Автор: Metrolog-sever
Создана 2 Июля 2014

Автор: Mariya888
Создана 5 Февраля 2021

Автор: AtaVist
Создана 11 Августа 2017

Автор: berkut008
Создана 16 Января 2019

Автор: Metrolog-sever
Создана 2 Июля 2014

Автор: efim
Создана 20 Ноября 2012

Автор: UNECE
Создана 8 Декабря 2016

Читайте также: