Объектная технология 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|