Академический Документы
Профессиональный Документы
Культура Документы
ПРОГРАММИРОВАНИЕ
Внедрение (embedding).
Внедренный объект становится частью того
документа, в который он вставляется.
Связывание (linking).
Связанный объект в приложении представляет
собой не сам документ, а только ссылку на
него.
Преимуществом связывания является то, что к
документу могут иметь доступ несколько
приложений одновременно.
Если одно приложение изменит документ,
изменения будут учтены также во всех других
приложениях, с которыми связан файл
документа.
Сервера автоматизации
1) Создаем новый
проект
2) На главную форму
выкладываем
компоненту с
закладки Servers,
которая называется
WordApplication
3) Устанавливаем
свойства
компоненты
AutoConnect и
AutoQuit в True
4) Запускаем
приложение на
выполнение.
Доступ к объекту
Application
Казалось бы, ничего не произошло, запустилась форма и
отобразилась на экране, на самом деле наше приложение запустило
сервер автоматизации Microsoft Word, этот факт можно обнаружить,
запустив на выполнение Task Manager и выбрав закладку Processes.
Среди прочих процессов мы обнаруживаем WINWORD.EXE. На самом
деле была приложением проделана следующая работа:
При создании формы, в системном реестре, по идентификатору CLSID
был найден сервер Word.Application
Запущено на выполнение приложение, находящееся по адресу в
реестре (ProgID)
Сервер предоставил нашему приложению, которое и является
контроллером автоматизации интерфейс, через который мы и
получим доступ к объекту Application.
Интерфейс Idispatch унаследован от Iunknown, который в свою
очередь имеет три метода, один из которых _ADDRef умеет считать
количество клиентов, в настоящий момент использующих сервер. Как
только от сервера отсоединиться последний клиент, он
автоматически будет выгружен из памяти компьютера.
Технология OLE Automation
(автоматизация OLE).
Сервер автоматизации представляет собой программу, которая может
управляться внешней программой — контроллером автоматизации.
Сервером в данном случае является Word или Excel, а контроллер
разрабатывается программистом.
Отличие технолгии OLE Automation в том, что она позволяет
использовать возможности СОМ не только языкам-компиляторам, но и
интерпретаторам, и обеспечивает связь с вызываемыми методами на
стадии выполнения приложения. Такой способ вызова называется
поздним связыванием. Методы при таком способе вызова
выполняются медленнее, причем заранее нельзя проверить
правильность написания объектов и их методов.
Преимуществом такого метода является независимость выбора среды
разработки от объекта, который нужно программировать.
Среда Delphi поддерживает вызовы методов серверов автоматизации.
Для этого используются переменные типа Variant, которые содержат
ссылки на объекты автоматизации. На этапе выполнения программы
серверу автоматизации передается команда в виде строки,
предварительно записанной в переменную типа Variant.
Доступ к объекту
Application
var
wd: OleVariant;
Пример 2
fileName: string;
begin
try
fileName := ExtractFilePath(Application.EXEName) + 'report.DOC';
//Создаем объект интерфейса для доступа к серверу COM
wd := CreateOleObject('Word.Application');
//Проверка наличия методов и правильность передачи параметров
//будет осуществляться на стадии выполнения приложения
wd.application.documents.add;
wd.application.activedocument.range.insertAfter(now);
wd.application.activedocument.saveas(fileName);
//выгружаем сервер из памяти компьютера
wd.application.quit(true, 0);
Except
End;
Интерфейс IDispatch
Интерфейс IDispatch описывается в модуле System
следующим образом:
type
IDispatch = interface(IUnknown)
['{00020400-0000-0000-C000-000000000046}']
function GetTypeInfoCount(out Count: Integer): Integer; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo):
Integer; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID; Integer; DispIDs: Pointer): Integer;
stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID:
Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr:
Pointer): Integer;
end;
Интерфейс IDispatch
Центральным элементом технологии OLE Automation является
интерфейс IDispatch. Ключевыми методами этого интерфейса
являются методы GetIdsOfNames и Invoke, которые позволяют
клиенту запросить у сервера, поддерживает ли он метод с
указанным именем, а затем, если метод поддерживается –
вызвать его.
Когда клиенту требуется вызвать метод, он вызывает
GetIdsOfNames, передавая ему имя запрошенного метода. Если
сервер поддерживает такой метод, он возвращает его
идентификатор – целое число, уникальное для каждого метода.
После этого клиент упаковывает параметры в массив переменных
типа OleVariant и вызывает Invoke, передавая ему массив
параметров и идентификатор метода. Таким образом, все, что
должен знать клиент – это строковое имя метода. Такой алгоритм
позволяет работать с наследниками IDispatch из скриптовых
языков.
Методы GetTypeInfo и GetTypeInfoCount являются
вспомогательными и обеспечивают поддержку библиотеки типов
объекта. Реализация методов GetIdsOfNames и Invoke,
предоставляемая COM по умолчанию базируется на библиотеке
типов объекта.
Dispinterface
Dispinterface
Dispinterface – это декларация методов, доступных через
интерфейс IDispatch. Объявляется он следующим образом:
type
IMyDisp = dispinterface
['{EE05DFE2-5549-11D0-9EA9-0020AF3D82DA}']
property Count: Integer dispid 1
procedure Clear dispid 2;
end;
Самих методов может физически и не существовать
(например, они реализуются динамически в Invoke).
Пример DispInterface
Рассмотрим использование dispinterface на простом примере. Объявим диспинтерфейс объекта
InternetExplorer и используем его в своей программе:
type
IIE = dispinterface
['{0002DF05-0000-0000-C000-000000000046}']
property Visible: WordBool dispid 402;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
II: IIE;
begin
II := CreateOleObject('InternetExplorer.Application') as IIE;
II.Visible := TRUE;
end;
OleReport:
TOleContainer;
Текст процедуры
заполнения
var
WorkBk : _WorkBook; WorkSheet : _WorkSheet;
TabGrid : Variant; i,j,r,c : integer; Path : string;
begin
r:=SG.RowCount; c:=SG.RowCount; TabGrid := VarArrayCreate([0,(r-1),0,(c-
1)],VarOleStr);
for i:=0 to SG.ColCount-1 do for j:=0 to SG.RowCount-1 do
TabGrid[j,i]:=SG.Cells[i,j];
Path:=ExtractFilePath(Paramstr(0))+'shablon.xls';
XLApp.Connect;
XLApp.Workbooks.Open(Path, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, 0);
WorkBk:=XLApp.ActiveWorkbook;
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;
Worksheet.Range['B3', 'F7'].Value2 := TabGrid;
path:=ExtractFilePath(Paramstr(0))+'report.xls';
WorkBk.SaveCopyAs(path,0); WorkBk.Close(false,0,0,0);
XLApp.Disconnect; //Разрываем связь с сервером
//Отображаем полученный отчет у себя на форме.
OleReport.CreateObjectFromFile(path,false); OleReport.Visible:=true;
ShowMessage('Экспорт завершен');
end;