4.11 Объектная технология OLE2

Фирма Microsoft включила в систему Windows 95 подсистему внедрения и связывания объектов. В общем виде OLE2 позволяет пользователю получить доступ к объектам разработанных систем в приложении, с которым он работает. Например, работая в Word, можно вызвать таблицу Excel, обработать определенным образом данные, а результат запомнить в Word. Кроме этого автоматизация OLE2 позволяет программисту включать в свои программы разработанные компоненты, например Word.

Основа OLE2 - Com -компонентная модель объекта (Component Object Model), которая предусматримает модульность и совместитмость во взаимодействии между компонентами, написанными на разных языках. Соm определяет двоичный интерфейс, независимый от языка программирования, который может вступать в коммуникацию с другими компонентами, ничего не зная о них. Объекты, ориентированные на внешнее использование и доступные только из программы называются автоматными объектами OLE. Рассмотрим пример программы, которая вызывает Word, создает новый файл и записывает в Word содержимое компонента Edit.

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include <OleAuto.hpp> //подключение средств автоматизации OLE

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 Variant V;

 try {

 V = CreateOleObject("Word.Basic");

 }

 catch(...){

 ShowMessage("Не могу запусть Word");

 throw;

 Close();

 }

 V.OleProcedure("AppShow");

 V.OleProcedure("FileNew");

 V.OleProcedure("Insert", Edit1->Text);

}

//---------------------------------------------------------------------------

Рассмотрим как работает програмы.

Прежде всего необходимо указать в программе команду подключения средств, отвечающей за автоматизацию OLE #include <OleAuto.hpp>.

Далее по команде V = CreateOleObject ("Word.Basic"); вызываем Word, делаем приложение видимым по команде V.OleProcedure ("File New"); создаем новый документ по команде V.OleProcedure ("File New"). Команда V.OleProcedure ("Insert", Edit1->Text); текст из редактора Edit и записывает в Word).

Как видно, в программе используются средства обработки исключений

try {

 V = CreateOleObject("Word.Basic");

 }

 catch(...){

 ShowMessage("Не могу запусть Word");

 throw;

 Close();

которые в случае ошибки закрывают программу.

Кроме рассмотренного примера для автоматизации OLE существуют стандартные объекты OCX, которые похожи на визуальные компоненты C++Builder, но на самом деле являются самостоятельными объектами.

Объекты OCX могут быть включены в программу не только на C++Builder, но и Delphi. Но в отличии от компонент C++Builder - они не включаются в код программы, поэтому при распространении программного обеспечения, использующего компоненты OCX необходимо распространять и сами компоненты OCX.

4.12 Библиотеки DLL

DLL (Dinamic Link Library) - динамически присоединяемая библиотека, используется для хранения функций и ресурсов отдельно от исполняемого файла. Обычно в программах статистической сборки функции, ресурсы, процедуры и т.д. компонуются в исполняемом файле, использование же DLL позволяет наиболее часто используемые процедуры, функции или ресурсы хранить в DLL и загружать их из DLL по мере необходимости - это динамическое присоединение.

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

Рассмотрим пример создания DLL, коорая кодирует строку. Кодировка происходит путем сдвигов кода символа на еденицу вправо.

Для создания библиотеки SUM.DLL необходимо выполнить шаги:

1.Запустить C++ Builder. и выполнить File|New и выбрать пиктограмму DLL.

2.Набрать код:

//Генерирует C++Builder

#include <vcl\vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

// Important note about DLL memory management:

//

// If your DLL exports any functions that pass String objects (or structs/

// classes containing nested Strings) as parameter or function results,

// you will need to add the library BCBMM.LIB to both the DLL project and any

// EXE projects that use the DLL. This will change the DLL and its calling

// EXE's to use the BCBMM.DLL as their memory manager. In these cases,

// the file BCBMM.DLL should be deployed along with your DLL.

//

// To avoid using BCBMM.DLL, pass string information using "char *" or

// ShortString parameters.

//---------------------------------------------------------------------------

USERES("sum.res");

//---------------------------------------------------------------------------

void ViewForm();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

{

return 1;

}

//Набираемый код

#include "sum.h"

//---------------------------------------------------------------------------

char FileName[256];

void SayHello()

{

GetModuleFileName( NULL,FileName, sizeof (FileName) );

MessageBox ( NULL, FileName, "Hello from:", MB_OK );

}

int Sum(int a,int b)

{

 return a + b;

}

char* Codec(char *eptr)

{

 int x,l;

 char ch;

 l = strlen(eptr);

 if(eptr[l-1] != '`') {

 for(x=0; x<l;x++) {

 ch = eptr[x];

 ch = (char)((int)ch + 1);

 eptr[x] = ch;

 }

 eptr[l] = '`';

 eptr[l+1] = '\0';

 } else {

 for(x=0; x<l-1;x++) {

 ch = eptr[x];

 ch = (char)((int)ch - 1);

 eptr[x] = ch;

 }

 eptr[l-1] = '\0';

 }

 return eptr;

}

void InvokeYesNoDialog()

{

 ViewForm();

}

//---------------------------------------------------------------------

void ViewForm()

{

 TForm *FpForm = new TForm(Application);

 FpForm->Left = 10;

 FpForm->Top = 10;

 FpForm->Width = 200;

 FpForm->Height = 200;

 FpForm->Visible = true;

 TPanel *FpPanel = new TPanel(FpForm);

 FpPanel->Parent = FpForm;

 FpPanel->Left = 2;

 FpPanel->Top = 2;

 FpPanel->Width = 198;

 FpPanel->Height = 198;

 FpPanel->Visible = true;

 MessageBox ( NULL,"If YES clicked < OK >", "You finished ?", MB_OK );

 if(FpPanel) {

 delete FpPanel;

 if(FpForm)

 delete FpForm;

 }

}

3.Сохранить проект в каталоге под именем sum.mak

4.Выбрать Options|Project...|Directories/Conditionals

5.В поле Conditionals набрать: __BUILDING_THE_DLL

6.В каталоге где находится проект создать файл sum.h со следующим кодом:

#ifdef __BUILDING_THE_DLL

#define __EXPORT_TYPE __export

#else

#define __EXPORT_TYPE __import

#endif

void __EXPORT_TYPE SayHello();

int __EXPORT_TYPE Sum(int a,int b);

char* __EXPORT_TYPE Codec(char *eptr); //<------------------

void __EXPORT_TYPE InvokeYesNoDialog();

7.Откомпилировать командой Project|BuildAll. В результате компиляции получим sum.DLL.

8.Скопировать sum.DLL в каталог ..\BIN C++ Builder-а

9.Набрать в командной строке implib.exe -w sum sum.dll

10.В результате получим файл sum.lib который будет подключен к выполняемому проекту

11.Скопировать sum.lib в каталог с проектом.

Рассмотрим пример вызова DLL из программы. В программе имеются визуальные компоненты:Edit (для ввода строки), Button1 (шифровка-дешифровка строки), Button2 - выход из программы. Программа работает следующим образом - после запуска вводится строка и нажимается кнопка Button1 - в результате строка шифруется, далее снова нажимается кнопка Button1 - строка дешифруется.


//---------------------------------------------------------------------------

#ifndef projcodH

#define projcodH

//---------------------------------------------------------------------------

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TEdit *Edit1;

TButton *Button1;

TButton *Button2;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

//---------------------------------------------------------------------------

#include <vcl\vcl.h>

#pragma hdrstop

#include "projcod.h"

//---------------------------------------------------------------------------

#pragma resource "*.dfm"

TForm1 *Form1;

#include "sum.h" //<<--------------ВНИМАНИЕ-----

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

 char* szMyStr = new char [StrLen(Edit1->Text.c_str())+2];

 *szMyStr = 0;

 StrLCat(szMyStr, Edit1->Text.c_str(), StrLen(Edit1->Text.c_str()));

 Edit1->Text = Codec(szMyStr); //<----------------

 delete [] szMyStr;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

 Application->Terminate();

}

//---------------------------------------------------------------------------

 

К исполняемому файлу (код которого приведен выше) подключить sum.lib выполнив команду:

Project\Add to Project\.....sum.lib

Запустить проект на компиляцию и выполнение.

Возможен вызов DLL из DLL, или вызов DLL из другого языка программирования.


Информация о работе «Основы C»
Раздел: Информатика, программирование
Количество знаков с пробелами: 200759
Количество таблиц: 5
Количество изображений: 11

Похожие работы

Скачать
20474
0
0

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

Скачать
5443
0
0

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

Скачать
8522
1
2

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

Скачать
11185
0
0

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

0 комментариев


Наверх