Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Class CTestWordView : public CView
{ // … // Атрибуты public: _ApplicationPtr WApp;// !!!!!!!!! // …
Обратите внимание на то, что при определении объекта WApp не использован конструктор с параметром, так как делать это в объявлении (другого) класса CTestWordView нельзя! Вот простой пример, иллюстрирующий использование объекта класса А в качестве члена класса В: Struct A { int i; A(){i=123;} A(int k){i=k;} }; Struct B { B(){printf("a.i=%d\n",a.i); a.i=321;printf("a.i=%d\n",a.i);} // A a(12); // ошибка - вызов конструктора класса А A a; // ошибки нет, так как нет вызова конструктора }; int _tmain(int argc, _TCHAR* argv[]) { B b; return 0; }
При выполнении программы мы увидим на мониторе такой результат: a.i=123 a.i=321
Он свидетельствует о том, что конструктор по умолчанию класса А был вызван на выполнение еще до начала выполнения операторов тела конструктора класса В. Следовательно, в нашем приложении для запуска приложения WinWord мы должны получить интеллектуальный указатель на приложение WinWord уже на этапе выполнения приложения. В простейшем случае это можно сделать в конструкторе класса CTestWordView (файл TestWordView.cpp): CTestWordView::CTestWordView() { // в этой точке программы WApp=0 _ApplicationPtr Temp("Word.Application"); WApp=Temp; }
При определении (локального!) указателя Temp будет выполнен запуск приложения WinWord и значение Temp будет сохранено в указателе WApp, который можно использовать во всех методах класса вида. По завершению конструктора указатель Temp будет уничтожен и для него, как для указателя на интерфейс, будет вызван метод Release(). Казалось бы, что созданный СОМ объект (грубо говоря, приложение WinWord) после этого должен быть уничтожен. Однако этого не произойдет по той причине, что при выполнении операции WApp=Temp; «умный» указатель вызовет AddRef() для увеличения числа ссылок на СОМ объект и, таким образом, «сохранит жизнь» приложению WinWord. Завершить работу WinWord можно, например, в деструкторе класса вида: CTestWordView::~CTestWordView() { WApp->Quit(); }
Внедрение и связывание объектов |
||
Последнее изменение этой страницы: 2018-04-12; просмотров: 382. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |