Поделиться через


Управление приложением

OLE требует существенного контроля над приложениями и их объектами. Библиотеки DLL системы OLE должны автоматически запускать и выпускать приложения, координировать их производство и изменение объектов и т. д. Функции в этом разделе соответствуют этим требованиям. Помимо вызова библиотек DLL системы OLE, эти функции иногда должны вызываться приложениями.

Управление приложением

Имя Описание
AfxOleCanExitApp Указывает, может ли приложение завершить работу.
AfxOleGetMessageFilter Извлекает текущий фильтр сообщений приложения.
AfxOleGetUserCtrl Извлекает текущий флаг пользовательского элемента управления.
AfxOleSetUserCtrl Задает или очищает флаг пользовательского элемента управления.
AfxOleLockApp Увеличивает глобальное число активных объектов в приложении в рамках платформы.
AfxOleLockControl Блокирует фабрику классов указанного элемента управления.
AfxOleUnlockApp Уменьшает количество активных объектов платформы в приложении.
AfxOleUnlockControl Разблокирует фабрику классов указанного элемента управления.
AfxOleRegisterServerClass Регистрирует сервер в системном реестре OLE.
AfxOleSetEditMenu Реализует пользовательский интерфейс для команды typename Object.

AfxOleCanExitApp

Указывает, может ли приложение завершить работу.

BOOL AFXAPI AfxOleCanExitApp();

Возвращаемое значение

Ненулевое значение, если приложение может выйти; в противном случае — 0.

Замечания

Приложение не должно завершаться, если есть невыполненные ссылки на его объекты. Глобальные функции AfxOleLockApp и увеличение и AfxOleUnlockApp уменьшение, соответственно, счетчик ссылок на объекты приложения. Приложение не должно завершаться, если этот счетчик не является ненулевой. Если счетчик не является ненулевой, главное окно приложения скрыто (не уничтожено), когда пользователь выбирает закрыть из системного меню или выйти из меню "Файл". Платформа вызывает эту функцию в CFrameWnd::OnClose.

Пример

// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
   if (AfxOleCanExitApp())
   {
      // No outstanding object counts - go ahead and exit
      return TRUE;
   }
   else
   {
      // There are outstanding OLE object counts...
      // hide app to give user impression that application has exited.
      ShowWindow(SW_HIDE);
      // take user out of control of the app
      AfxOleSetUserCtrl(FALSE);
      return FALSE;
   }
}

Требования

Заголовок: afxdisp.h

AfxOleGetMessageFilter

Извлекает текущий фильтр сообщений приложения.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Возвращаемое значение

Указатель на текущий фильтр сообщений.

Замечания

Вызовите эту функцию для доступа к текущему COleMessageFilterпроизводного объекта, так же, как и вызов AfxGetApp текущего объекта приложения.

Пример

COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();

 

// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
   CWinApp::InitInstance();

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }

   CWinThread *pThread = AfxGetThread();
   if (pThread != NULL)
   {
      // Destroy message filter, thereby unregistering it.
      delete pThread->m_pMessageFilter;
      pThread->m_pMessageFilter = NULL;

      // Create the new message filter object.
      //CMyMessageFilter is derived from COleMessageFilter
      pThread->m_pMessageFilter = new CMyMessageFilter;
      ASSERT(AfxOleGetMessageFilter() != NULL);

      // Register the new message filter object.
      AfxOleGetMessageFilter()->Register();
   }
   //...
   //...
   //...
}

Требования

Заголовок: afxwin.h

AfxOleGetUserCtrl

Извлекает текущий флаг пользовательского элемента управления.

BOOL AFXAPI AfxOleGetUserCtrl();

Возвращаемое значение

Ненулевое значение, если пользователь управляет приложением; в противном случае — 0.

Замечания

Пользователь управляет приложением, когда пользователь явно открыл или создал новый документ. Пользователь также управляет тем, что приложение не было запущено библиотеками DLL системы OLE, иными словами, если пользователь запустил приложение с помощью системной оболочки.

Требования

Заголовок: afxdisp.h

AfxOleSetUserCtrl

Задает или очищает флаг пользовательского элемента управления, который описан в справочнике.AfxOleGetUserCtrl

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Параметры

bUserCtrl
Указывает, следует ли задать или очистить флаг пользовательского элемента управления.

Замечания

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

Вызовите эту функцию, если другие действия в приложении должны поставить пользователя под контроль приложения.

Требования

Заголовок: afxdisp.h

AfxOleLockApp

Увеличивает глобальное число активных объектов в приложении.

void AFXAPI AfxOleLockApp();

Замечания

Платформа сохраняет количество объектов, активных в приложении. Число AfxOleLockApp и AfxOleUnlockApp функции, соответственно, увеличивается и уменьшается.

Когда пользователь пытается закрыть приложение с активными объектами — приложением, для которого количество активных объектов ненулевое— платформа скрывает приложение из представления пользователя вместо полного завершения работы. Функция AfxOleCanExitApp указывает, может ли приложение завершить работу.

Вызов AfxOleLockApp любого объекта, предоставляющего интерфейсы OLE, если он будет нежелательным для того, чтобы этот объект был уничтожен во время использования клиентским приложением. Кроме того, вызовите AfxOleUnlockApp деструктор любого объекта, вызывающего AfxOleLockApp конструктор. По умолчанию COleDocument (и производные классы) автоматически блокируют и разблокируют приложение.

Пример

// Below is a code sample from an  Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.

CCMFCAutomationDoc::CCMFCAutomationDoc()
{
   EnableAutomation();
   AfxOleLockApp();
}

CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
   AfxOleUnlockApp();
}

Требования

Заголовок: afxdisp.h

AfxOleUnlockApp

Уменьшает количество активных объектов платформы в приложении.

void AFXAPI AfxOleUnlockApp();

Замечания

Дополнительные сведения см. в статье AfxOleLockApp .

Когда число активных объектов достигает нуля, AfxOleOnReleaseAllObjects вызывается.

Пример

См. пример AfxOleLockApp.

Требования

Заголовок: afxdisp.h

AfxOleLockControl

Блокирует фабрику классов указанного элемента управления, чтобы динамически созданные данные, связанные с элементом управления, остаются в памяти.

Синтаксис

BOOL AFXAPI AfxOleLockControl(  REFCLSID clsid  );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

Параметры

Clsid
Уникальный идентификатор класса элемента управления.

lpszProgID
Уникальный идентификатор программы элемента управления.

Возвращаемое значение

Ненулевое значение, если фабрика классов элемента управления успешно заблокирована; в противном случае — 0.

Замечания

Это может значительно ускорить отображение элементов управления. Например, когда вы создадите элемент управления в диалоговом окне и заблокируете элемент управления AfxOleLockControl, вам не нужно создавать и удалять его снова при каждом отображении или уничтожении диалогового окна. Если пользователь открывает и закрывает диалоговое окно неоднократно, блокировка элементов управления может значительно повысить производительность. Когда вы будете готовы уничтожить элемент управления, вызовите AfxOleUnlockControl.

Пример

// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.

AfxOleLockControl(_T("MSCAL.Calendar"));

Требования

Заголовок: afxwin.h

AfxOleRegisterServerClass

Эта функция позволяет зарегистрировать сервер в системном реестре OLE.

BOOL AFXAPI AfxOleRegisterServerClass(
    REFCLSID clsid,
    LPCTSTR lpszClassName,
    LPCTSTR lpszShortTypeName,
    LPCTSTR lpszLongTypeName,
    OLE_APPTYPE nAppType = OAT_SERVER,
    LPCTSTR* rglpszRegister = NULL,
    LPCTSTR* rglpszOverwrite = NULL);

Параметры

Clsid
Ссылка на идентификатор класса OLE сервера.

lpszClassName
Указатель на строку, содержащую имя класса объектов сервера.

lpszShortTypeName
Указатель на строку, содержащую короткое имя типа объекта сервера, например "Диаграмма".

lpszLongTypeName
Указатель на строку, содержащую длинное имя типа объекта сервера, например "Диаграмма Microsoft Excel 5.0".

nAppType
Значение, взятое из перечисления OLE_APPTYPE, указывающее тип приложения OLE. Возможные значения:

  • OAT_INPLACE_SERVER Server имеет полный пользовательский интерфейс сервера.

  • OAT_SERVER Server поддерживает только внедрение.

  • контейнер OAT_CONTAINER поддерживает ссылки на внедрение.

  • объект с поддержкой IDispatchOAT_DISPATCH_OBJECT.

rglpszRegister
Массив указателей на строки, представляющие ключи и значения, добавляемые в системный реестр OLE, если отсутствуют существующие значения для ключей.

rglpszOverwrite
Массив указателей на строки, представляющие ключи и значения, которые необходимо добавить в системный реестр OLE, если реестр содержит существующие значения для заданных ключей.

Возвращаемое значение

Ненулевое значение, если класс сервера успешно зарегистрирован; в противном случае — 0.

Замечания

Большинство приложений могут использовать COleTemplateServer::Register для регистрации типов документов приложения. Если системный реестр приложения не соответствует типичному шаблону, можно использовать AfxOleRegisterServerClass для дополнительного управления.

Реестр состоит из набора разделов и значений. Аргументы rglpszRegister и rglpszOverwrite представляют собой массивы указателей на строки, каждая из которых состоит из ключа и значения, разделенного символом NULL ('\0'). Каждая из этих строк может иметь заменяемые параметры, места которых отмечены последовательности символов %1%5.

Символы заполняются следующим образом:

Символ Значение
1% Идентификатор класса, отформатированный как строка
2% Имя класса
%3 Путь к исполняемому файлу
%4 Имя короткого типа
5% Имя длинного типа

Требования

Заголовок: afxdisp.h

AfxOleSetEditMenu

Реализует пользовательский интерфейс для команды typename Object.

void AFXAPI AfxOleSetEditMenu(
    COleClientItem* pClient,
    CMenu* pMenu,
    UINT iMenuItem,
    UINT nIDVerbMin,
    UINT nIDVerbMax = 0,
    UINT nIDConvert = 0);

Параметры

pClient
Указатель на элемент OLE клиента.

pMenu
Указатель на обновляемый объект меню.

iMenuItem
Индекс обновляемого элемента меню.

nIDVerbMin
Идентификатор команды, соответствующий основной команде.

nIDVerbMax
Идентификатор команды, соответствующий последней команде.

nIDConvert
Идентификатор элемента меню Convert.

Замечания

Если сервер распознает только основную команду, элемент меню становится "объект имени типа команды" и команда nIDVerbMin отправляется, когда пользователь выбирает команду. Если сервер распознает несколько глаголов, элемент меню становится " объект typename " и подменю, в котором отображаются все команды, когда пользователь выбирает команду. Когда пользователь выбирает команду из подменю, nIDVerbMin отправляется, если выбрана первая команда, nIDVerbMin + 1 отправляется, если выбрана вторая команда, и т. д. Реализация по умолчанию автоматически обрабатывает эту функцию COleDocument .

В скрипте ресурсов приложения клиента должен быть указан следующий оператор. RC) файл:

<#include afxolecl.rc>

Требования

Заголовок: afxole.h

AfxOleUnlockControl

Разблокирует фабрику классов указанного элемента управления.

Синтаксис

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

Параметры

Clsid
Уникальный идентификатор класса элемента управления.

lpszProgID
Уникальный идентификатор программы элемента управления.

Возвращаемое значение

Ненулевое значение, если фабрика классов элемента управления успешно разблокирована; в противном случае — 0.

Замечания

Элемент управления заблокирован, AfxOleLockControlпоэтому динамически созданные данные, связанные с элементом управления, остаются в памяти. Это может значительно ускорить отображение элемента управления, так как элемент управления не требуется создавать и уничтожать каждый раз при отображении элемента управления. Когда вы будете готовы уничтожить элемент управления, вызовите AfxOleUnlockControl.

Пример

// Unlock control's (Microsoft Calendar Control) class factory.

AfxOleUnlockControl(_T("MSCAL.Calendar"));

Требования

Заголовок: afxwin.h

См. также

Макросы и глобальные