Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Объектная технология OLE 2

 

Фирма 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.

 

Библиотеки 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 из другого языка программирования.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...