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 из другого языка программирования.
... . Имеет ли право на существование эта биологизаторская интерпретация экологии? Видимо, да. Она широко представлена, и с этим следует считаться. Но она не может служить концептуальной основой комплексного непрерывного экологического образования. В структуре научного знания при таком подходе не остаётся места для географической и социальной экологии, экологии человека, а сама биология превращается ...
... хотя бы стены, чтобы нас не унижали в собственном доме, до конца не растащили наше имущество, нам нужна, обладающая высоким моральным и воинским духом достойно обеспеченная армия. Однако, значение российской армии и в том, что она представляет собой, пожалуй, единственный институт в современной виртуальной России, лишенный симулякров, поскольку ней, по крайней мере, погибают реально - в бою. ...
... важные функции управления предприятием, такие как: определение задач; планирование ресурсов; оценка деятельности и мотивация персонала на основе оценки; контроль исполнения. В целом, бюджетирование решает тактические вопросы и, по существу, для стратегического управления не предназначено. Связь бюджетирования со стратегией Практика стратегического планирования западных компаний ...
... . Для этого достаточно измерить его на карте и знать масштаб карты. Компас. Научиться пользоваться компасом нетрудно. Но компас, как правило, наилучшим помощником в ориентировании становится вместе с картой. В спортивном ориентировании пользуются специальными жидкостными компасами. Они позволяют быстро и просто взять с карты нужное направление и двигаться по местности по выбранному азимуту. ...
0 комментариев