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


Сведения о приложении и управление им

При написании приложения создается один CWinAppпроизводный объект. Иногда может потребоваться получить сведения об этом объекте за пределами производного CWinAppобъекта. Или вам может потребоваться доступ к другим глобальным объектам manager.

Библиотека классов Microsoft Foundation предоставляет следующие глобальные функции, которые помогут вам выполнить следующие задачи:

Функции "Сведения о приложениях" и "Управление"

Имя Описание
AfxBeginThread Создает новый поток.
AfxContextMenuManager Указатель на глобальный диспетчер контекстного меню.
AfxEndThread Завершает текущий поток.
AfxFindResourceHandle Пошаговое руководство по цепочке ресурсов и поиск определенного ресурса по идентификатору ресурса и типу ресурса.
AfxFreeLibrary Уменьшает количество ссылок загруженного модуля библиотеки динамического канала (DLL). Когда число ссылок достигает нуля, модуль не сопоставляется.
AfxGetApp Возвращает указатель на один CWinApp объект приложения.
AfxGetAppName Возвращает строку, содержащую имя приложения.
AfxGetInstanceHandle Возвращает представляющий HINSTANCE этот экземпляр приложения.
AfxGetMainWnd Возвращает указатель на текущее "главное" окно приложения, отличного от OLE, или в окне фрейма сервера.
AfxGetPerUserRegistration Эта функция позволяет определить, перенаправляет ли приложение доступ к узлу (HKCU) реестра HKEY_CURRENT_USER .
AfxGetResourceHandle Возвращает источник HINSTANCE ресурсов по умолчанию приложения. Используйте для прямого доступа к ресурсам приложения.
AfxGetThread Извлекает указатель на текущий объект CWinThread .
AfxInitRichEdit Инициализирует элемент управления расширенными изменениями версии 1.0 для приложения.
AfxInitRichEdit2 Инициализирует элемент управления редактирования версии 2.0 и более поздних версий для приложения.
AfxIsExtendedFrameClass Определяет, является ли заданное окно расширенным объектом фрейма.
AfxIsMFCToolBar Определяет, является ли данное окно объектом панели инструментов.
AfxKeyboardManager Указатель на глобальный диспетчер клавиатуры.
AfxLoadLibrary Сопоставляет модуль DLL и возвращает дескриптор, который можно использовать для получения адреса функции DLL.
AfxLoadLibraryEx Сопоставляет модуль DLL с помощью указанных параметров и возвращает дескриптор, который можно использовать для получения адреса функции DLL.
AfxMenuTearOffManager Указатель на глобальный диспетчер меню разрыва.
AfxMouseManager Указатель на глобальный диспетчер мыши.
AfxRegisterClass Регистрирует класс окна в библиотеке DLL, которая использует MFC.
AfxRegisterWndClass Регистрирует класс окна Windows, чтобы дополнить автоматически зарегистрированные MFC.
AfxSetPerUserRegistration Задает, перенаправляет ли приложение доступ реестра к HKEY_CURRENT_USER узлу (HKCU).
AfxSetResourceHandle Задает дескриптор HINSTANCE, где загружаются ресурсы по умолчанию приложения.
AfxShellManager Указатель на глобальный диспетчер оболочки.
AfxSocketInit Вызывается в CWinApp::InitInstance переопределении для инициализации сокетов Windows.
AfxUserToolsManager Указатель на глобальный диспетчер пользовательских инструментов.
AfxWinInit Вызывается предоставленной функцией MFC в рамках CWinApp инициализации приложения на основе графического интерфейса WinMain для инициализации MFC. Необходимо вызывать непосредственно для консольных приложений, использующих MFC.

AfxBeginThread

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

CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc,
    LPVOID pParam,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

CWinThread* AfxBeginThread(
    CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

Параметры

pfnThreadProc
Указывает на функцию управления для рабочего потока. Указатель не может быть NULL. Эта функция должна быть объявлена следующим образом:

UINT __cdecl MyControllingFunction( LPVOID pParam );

pThreadClass
Объект RUNTIME_CLASS , производный от CWinThread.

pParam
Параметр для передачи в управляющую функцию.

nPriority
Приоритет, заданный для потока. Полный список и описание доступных приоритетов см SetThreadPriority . в пакете SDK для Windows.

nStackSize
Задает размер в байтах стека для нового потока. Если значение равно 0, размер стека по умолчанию совпадает с тем же стеком размера, что и при создании потока.

dwCreateFlags
Указывает дополнительный флаг, который управляет созданием потока. Этот флаг может содержать одно из двух значений:

  • CREATE_SUSPENDED Запустите поток с числом приостановки одного. Используйте, CREATE_SUSPENDED если вы хотите инициализировать все данные-члены CWinThread объекта, такие как m_bAutoDelete или любые члены производного класса, перед запуском потока. После завершения инициализации используйте CWinThread::ResumeThread для запуска потока. Поток не будет выполняться до CWinThread::ResumeThread вызова.

  • 0 Запустите поток сразу после создания.

lpSecurityAttrs
Указывает на структуру SECURITY_ATTRIBUTES , указывающую атрибуты безопасности для потока. Если NULLиспользуются те же атрибуты безопасности, что и для создания потока. Дополнительные сведения об этой структуре см. в пакете SDK для Windows.

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

Указатель на только что созданный объект потока или NULL , если происходит сбой.

Замечания

Первая форма AfxBeginThread создания рабочего потока. Вторая форма создает поток, который может служить потоком пользовательского интерфейса или рабочим потоком.

AfxBeginThread создает новый CWinThread объект, вызывает ее CreateThread функцию для запуска выполнения потока и возвращает указатель на поток. Проверки выполняются по всей процедуре, чтобы убедиться, что все объекты освобождены должным образом, если любая часть создания завершается ошибкой. Чтобы завершить поток, вызов AfxEndThread из потока или возврат из управляемой функции рабочего потока.

Многопоточность должна быть включена приложением; В противном случае эта функция завершится ошибкой. Дополнительные сведения о включении многопоточных операций см. в разделе /MD, /MT/LD (Использование библиотеки времени выполнения).

Дополнительные сведения AfxBeginThreadсм. в статьях "Многопоточность: создание рабочих потоков и многопоточности: создание потоков пользовательского интерфейса.

Пример

Пример см. в примере CSocket::Attach.

Требования

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

AfxContextMenuManager

Указатель на глобальный диспетчер контекстного меню.

Синтаксис

CContextMenuManager* afxContextMenuManager;

Требования

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

AfxEndThread

Вызовите эту функцию, чтобы завершить текущий выполняемый поток.

void AFXAPI AfxEndThread(
    UINT nExitCode,
    BOOL bDelete  = TRUE);

Параметры

nExitCode
Указывает код выхода потока.

bDelete
Удаляет объект потока из памяти.

Замечания

Необходимо вызвать из потока, чтобы завершить работу.

Дополнительные сведения AfxEndThreadсм. в статье "Многопоточность: завершение потоков".

Требования

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

AfxFindResourceHandle

Используется AfxFindResourceHandle для обхода цепочки ресурсов и поиска определенного ресурса по идентификатору ресурса и типу ресурса.

Синтаксис

HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName,  LPCTSTR lpszType );

Параметры

lpszName
Указатель на строку, содержащую идентификатор ресурса. lpszType
Указатель на тип ресурса. Список типов ресурсов см FindResource . в пакете SDK для Windows.

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

Дескриптор модуля, содержащего ресурс.

Замечания

AfxFindResourceHandle находит конкретный ресурс и возвращает дескриптор в модуль, содержащий ресурс. Ресурс может находиться в любой библиотеке DLL расширения MFC, загруженной. AfxFindResourceHandle сообщает, какой ресурс имеется.

Модули выполняются в этом порядке:

  1. Основной модуль, если это библиотека DLL расширения MFC.

  2. Несистемные модули.

  3. Модули, относящиеся к языку.

  4. Основной модуль, если это системная библиотека DLL.

  5. Системные модули.

Требования

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

AfxFreeLibrary

AfxLoadLibrary Оба AfxFreeLibrary модуля библиотеки поддерживают количество ссылок для каждого загруженного модуля библиотеки.

BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);

Параметры

hInstLib
Дескриптор загруженного модуля библиотеки. AfxLoadLibrary возвращает этот дескриптор.

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

TRUE Значение FALSEв противном случае .

Замечания

AfxFreeLibrary уменьшает количество ссылок загруженного модуля библиотеки динамических ссылок (DLL). Когда число ссылок достигает нуля, модуль не сопоставляется с адресным пространством вызывающего процесса и дескриптор больше недействителен. Это число ссылок увеличивается при каждом AfxLoadLibrary вызове.

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

Используется AfxLoadLibrary для сопоставления модуля DLL.

Не забудьте использовать AfxFreeLibrary и AfxLoadLibrary (вместо функций FreeLibrary Win32 и LoadLibrary) если приложение использует несколько потоков. Использование AfxLoadLibrary и AfxFreeLibrary обеспечение того, что код запуска и завершения работы, выполняемый при загрузке и выгрузке библиотеки DLL расширения MFC, не повреждает глобальное состояние MFC.

Пример

Пример см. в примере AfxLoadLibrary.

Требования

Заголовок afxdll_.h

AfxGetApp

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

CWinApp* AFXAPI AfxGetApp();

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

Указатель на один CWinApp объект приложения.

Замечания

Если этот метод возвращается NULL, он может указать, что главное окно приложения еще не было полностью инициализировано. Это также может указывать на проблему.

Пример

// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);

Требования

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

AfxGetAppName

Возвращаемая строка может использоваться для диагностических сообщений или в качестве корневого каталога для временных имен строк.

LPCTSTR AFXAPI AfxGetAppName();

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

Строка, завершающаяся значением NULL, содержащая имя приложения.

Пример

// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());

Требования

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

AfxGetInstanceHandle

Эта функция позволяет получить дескриптор экземпляра текущего приложения.

HINSTANCE  AFXAPI AfxGetInstanceHandle();

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

Текущий HINSTANCE экземпляр приложения. При вызове из библиотеки DLL, связанной с версией MFC USRDLL, возвращается библиотека HINSTANCE DLL.

Замечания

AfxGetInstanceHandle всегда возвращает HINSTANCE исполняемый файл (.EXE), если он не вызывается из библиотеки DLL, связанной с версией MFC USRDLL. В этом случае он возвращает библиотеку HINSTANCE DLL.

Пример

// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());

Требования

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

AfxGetMainWnd

Если приложение является сервером OLE, вызовите эту функцию, чтобы получить указатель на активное главное окно приложения. Используйте этот результат вместо прямого ссылки на m_pMainWnd член объекта приложения.

CWnd* AFXAPI AfxGetMainWnd();

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

Возвращает указатель на объект окна кадра, содержащий активный документ на месте, если сервер имеет объект, активный в активном контейнере.

Если в контейнере нет объекта, активного на месте, или приложение не является сервером OLE, эта функция возвращает m_pMainWnd объект приложения.

Если AfxGetMainWnd вызывается из основного потока приложения, он возвращает главное окно приложения в соответствии с приведенными выше правилами. Если функция вызывается из вторичного потока в приложении, функция возвращает главное окно, связанное с потоком, который сделал вызов.

Замечания

Если приложение не является сервером OLE, вызов этой функции эквивалентен непосредственно ссылке на m_pMainWnd член объекта приложения.

Пример

//The following line send a WM_CLOSE message
//   to the Application's main window. This will cause the
//   Application to exit.
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);

Требования

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

AfxGetPerUserRegistration

Эта функция позволяет определить, перенаправляет ли приложение доступ к узлу (HKCU) реестра HKEY_CURRENT_USER .

BOOL AFXAPI AfxGetPerUserRegistration();

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

TRUE указывает, что сведения о реестре HKCU направляются на узел. FALSE указывает, что приложение записывает сведения о реестре на узел по умолчанию. Узел по умолчанию — HKEY_CLASSES_ROOT (HKCR).

Замечания

Если включить перенаправление реестра, платформа перенаправляет доступ из HKCR HKEY_CURRENT_USER\Software\Classes. На перенаправление влияют только платформы MFC и ATL.

Чтобы изменить, перенаправляет ли приложение доступ к реестру, используйте AfxSetPerUserRegistration.

Требования

Заголовок afxstat_.h

AfxGetResourceHandle

Используйте дескриптор HINSTANCE , возвращаемый этой функцией, для доступа к ресурсам приложения напрямую, например в вызовах функции FindResourceWindows.

extern HINSTANCE  AfxGetResourceHandle();

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

Дескриптор HINSTANCE , в котором загружаются ресурсы приложения по умолчанию.

Пример

//Load the menu specifying the module handle where resource is to be
//found & resource ID
HMENU hMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));

Требования

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

AfxGetThread

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

CWinThread* AfxGetThread();

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

Указатель на текущий выполняемый поток; в противном случае NULL.

Замечания

Должен вызываться из потока.

Примечание.

Если вы переносите проект AfxGetThread MFC из Visual C++ версии 4.2, 5.0 или 6.0, вызываетсяAfxGetApp, AfxGetThread если поток не найден. В более поздних версиях компилятора возвращаетсяNULL, AfxGetThread если поток не найден. Если требуется поток приложения, необходимо вызвать AfxGetApp.

Пример

//Print the current thread ID in the Debug Window
TRACE(_T("Current Thread ID = 0x%X\n"), AfxGetThread()->m_nThreadID);

Требования

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

AfxInitRichEdit

Вызовите эту функцию, чтобы инициализировать элемент управления расширенными изменениями (версия 1.0) для приложения.

BOOL AFXAPI AfxInitRichEdit();

Замечания

Эта функция предоставляется для обратной совместимости. Новые приложения должны использовать AfxInitRichEdit2.

AfxInitRichEdit загружается RICHED32.DLL для инициализации версии 1.0 элемента управления расширенными изменениями. Чтобы использовать элемент управления расширенными изменениями версии 2.0 и 3.0, RICHED20.DLL необходимо загрузить. Он загружается путем вызова AfxInitRichEdit2.

Чтобы обновить элементы управления расширенными изменениями в существующих приложениях Visual C++ до версии 2.0, откройте файл . RC-файл в виде текста, измените имя класса каждого элемента управления форматированного редактирования с "RICHEDIT" на "RichEdit20a". Затем замените вызов AfxInitRichEdit на AfxInitRichEdit2.

Эта функция также инициализирует общую библиотеку элементов управления, если библиотека еще не инициализирована для процесса. Если вы используете элемент управления расширенными возможностями редактирования непосредственно из приложения MFC, вызовите эту функцию, чтобы убедиться, что MFC правильно инициализировала среду выполнения полнофункциональных изменений. При вызове Create метода CRichEditCtrl, CRichEditViewили CRichEditDoc, как правило, не требуется вызывать эту функцию, но в некоторых случаях это может потребоваться.

Требования

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

AfxInitRichEdit2

Вызовите эту функцию, чтобы инициализировать элемент управления расширенными изменениями (версия 2.0 и более поздние версии) для приложения.

BOOL AFXAPI AfxInitRichEdit2();

Замечания

Вызовите эту функцию, чтобы загрузить RICHED20.DLL и инициализировать версию 2.0 элемента управления расширенными изменениями. При вызове Create метода CRichEditCtrl, CRichEditViewили CRichEditDoc, как правило, не требуется вызывать эту функцию, но в некоторых случаях это может потребоваться.

Требования

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

AfxIsExtendedFrameClass

Определяет, является ли заданное окно расширенным объектом фрейма.

Синтаксис

BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );

Параметры

pWnd
[in] Указатель на объект, производный от CWnd.

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

TRUE Значение , если предоставленное окно является объектом расширенного кадра; в противном случае FALSE.

Замечания

Этот метод возвращает TRUE , если pWnd является производным от одного из следующих классов:

  • CFrameWndEx

  • CMDIFrameWndEx

  • COleIPFrameWndEx

  • COleDocIPFrameWndEx

  • CMDIChildWndEx

Этот метод полезен, когда требуется проверить, что параметр функции или метода является окном расширенного фрейма.

Требования

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

AfxIsMFCToolBar

Определяет, является ли данное окно объектом панели инструментов.

Синтаксис

BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);

Параметры

pWnd
[in] Указатель на объект, производный от CWnd.

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

TRUE Значение , если предоставленное окно является объектом панели инструментов; в противном случае FALSE.

Замечания

Этот метод возвращается TRUE , если pWnd производный от CMFCToolBar. Этот метод полезен при проверке того, является CMFCToolBar ли параметр функции или метода объектом.

Требования

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

AfxKeyboardManager

Указатель на глобальный диспетчер клавиатуры.

Синтаксис

CKeyboardManager* afxKeyboardManager;

Требования

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

AfxLoadLibrary

Используется AfxLoadLibrary для сопоставления модуля DLL.

HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);

Параметры

lpszModuleName
Указывает на строку, завершающую значение NULL, содержащую имя модуля (.DLL или файл .EXE). Указанное имя — это имя файла модуля.

Если строка указывает путь, но файл не существует в указанном каталоге, функция завершается ошибкой.

Если путь не указан и расширение имени файла опущено, расширение по умолчанию .DLL добавляется. Однако строка имени файла может включать символ конечную точку (.), чтобы указать, что имя модуля не имеет расширения. Если путь не указан, функция использует порядок поиска классических приложений.

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

Если функция выполнена успешно, возвращаемое значение является дескриптором модуля. При сбое возвращается NULLзначение.

Замечания

Он возвращает дескриптор, который можно использовать GetProcAddress для получения адреса функции DLL. AfxLoadLibrary также можно использовать для сопоставления других исполняемых модулей.

Каждый процесс поддерживает количество ссылок для каждого загруженного модуля библиотеки. Это число ссылок увеличивается каждый раз AfxLoadLibrary при вызове и уменьшается каждый раз AfxFreeLibrary при каждом вызове. Когда число ссылок достигает нуля, модуль не сопоставляется с адресным пространством вызывающего процесса и дескриптор больше недействителен.

Не забудьте использовать AfxLoadLibrary и AfxFreeLibrary (вместо функций LoadLibrary Win32 и FreeLibrary) если приложение использует несколько потоков и если оно динамически загружает библиотеку DLL расширения MFC. Использование AfxLoadLibrary и AfxFreeLibrary обеспечение того, что код запуска и завершения работы, выполняемый при загрузке и выгрузке библиотеки DLL расширения MFC, не повреждает глобальное состояние MFC.

Использование AfxLoadLibrary в приложении требует динамической связи с версией БИБЛИОТЕКи DLL MFC. Файл заголовка для AfxLoadLibrary, Afxdll_.hвключается только в том случае, если MFC связан с приложением в виде библиотеки DLL. Это требование выполняется по проектированию, так как необходимо связаться с версией БИБЛИОТЕКИ DLL MFC для использования или создания библиотек DLL расширения MFC.

Пример

// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.

typedef CRuntimeClass *(*GETDLLVIEW)();

BOOL CUserApp::InitInstance()
{
   // Standard Application Wizard generated initialization excluded.
// Register the application's document templates.  Document templates
//  serve as the connection between documents, frame windows and views

//Load MFC Extension DLL based view class.
m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
if (!m_hViewDll)
{
   CString str;
   str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
   AfxMessageBox(str);
   return FALSE;
}

GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
ASSERT(GetMyView != NULL);

CMultiDocTemplate *pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
                                     RUNTIME_CLASS(CUserDoc),
                                     RUNTIME_CLASS(CChildFrame), // custom MDI child frame
                                     GetMyView());
if (!pDocTemplate)
   return FALSE;
AddDocTemplate(pDocTemplate);

// Standard Application Wizard generated initialization excluded.
return TRUE;
}

int CUserApp::ExitInstance()
{
   if (NULL != m_hViewDll)
   {
      AfxFreeLibrary(m_hViewDll);
      m_hViewDll = NULL;
   }

   return CWinApp::ExitInstance();
}

Требования

Заголовок afxdll_.h

AfxLoadLibraryEx

Используется AfxLoadLibraryEx для сопоставления модуля DLL.

HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);

Параметры

lpFileName
Указывает на строку, завершающую значение NULL, содержащую имя модуля (.DLL или файл .EXE). Указанное имя — это имя файла модуля.

Если строка указывает путь, но файл не существует в указанном каталоге, функция завершается ошибкой.

Если путь не указан и расширение имени файла опущено, расширение по умолчанию .DLL добавляется. Однако строка имени файла может включать символ конечную точку (.), чтобы указать, что имя модуля не имеет расширения. Если путь не указан, функция использует порядок поиска классических приложений.

hFile
Этот параметр зарезервирован для использования в будущем. Это должно быть NULL.

dwFlags
Действие, выполняемое при загрузке модуля. Если флаги не указаны, поведение этой функции идентично AfxLoadLibrary функции. Возможные значения этого параметра описаны в LoadLibraryEx документации.

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

Если функция выполнена успешно, возвращаемое значение является дескриптором модуля. При сбое возвращается NULLзначение.

Замечания

AfxLoadLibraryEx возвращает дескриптор, который можно использовать GetProcAddress для получения адреса функции DLL. AfxLoadLibraryEx также можно использовать для сопоставления других исполняемых модулей.

Каждый процесс поддерживает количество ссылок для каждого загруженного модуля библиотеки. Это число ссылок увеличивается каждый раз AfxLoadLibraryEx при вызове и уменьшается каждый раз AfxFreeLibrary при каждом вызове. Когда число ссылок достигает нуля, модуль не сопоставляется с адресным пространством вызывающего процесса и дескриптор больше недействителен.

Не забудьте использовать AfxLoadLibraryEx и AfxFreeLibrary (вместо функций LoadLibraryEx Win32 и FreeLibrary) если приложение использует несколько потоков и если оно динамически загружает библиотеку DLL расширения MFC. Использование AfxLoadLibraryEx и AfxFreeLibrary обеспечение того, что код запуска и завершения работы, выполняемый при загрузке и выгрузке библиотеки DLL расширения MFC, не повреждает глобальное состояние MFC.

Использование AfxLoadLibraryEx в приложении требует динамической связи с версией БИБЛИОТЕКи DLL MFC. Файл заголовка для AfxLoadLibraryEx, Afxdll_.hвключается только в том случае, если MFC связан с приложением в виде библиотеки DLL. Это требование выполняется по проектированию, так как необходимо связаться с версией БИБЛИОТЕКИ DLL MFC для использования или создания библиотек DLL расширения MFC.

Требования

Заголовок afxdll_.h

AfxMenuTearOffManager

Указатель на глобальный диспетчер меню разрыва.

Синтаксис

CMenuTearOffManager* g_pTearOffMenuManager;

Требования

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

AfxMouseManager

Указатель на глобальный диспетчер мыши.

Синтаксис

CMouseManager* afxMouseManager;

Требования

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

AfxRegisterClass

Используйте эту функцию для регистрации классов окон в библиотеке DLL, которая использует MFC.

BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);

Параметры

lpWndClass
Указатель на WNDCLASS структуру, содержащую сведения о зарегистрированном классе окна. Дополнительные сведения об этой структуре см. в пакете SDK для Windows.

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

TRUE Значение FALSE.

Замечания

При использовании этой функции класс автоматически отменяется при выгрузке библиотеки DLL.

В сборках, отличных от DLL, идентификатор определяется как макрос, AfxRegisterClass который сопоставляется с функцией RegisterClassWindows, так как классы, зарегистрированные в приложении, автоматически отменяются. Если вы используете AfxRegisterClass вместо этого RegisterClass, код можно использовать без изменений как в приложении, так и в библиотеке DLL.

Пример

// Register your unique class name that you wish to use
WNDCLASS wndcls;

memset(&wndcls, 0, sizeof(WNDCLASS));   // start with NULL defaults

wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

//you can specify your own window procedure
wndcls.lpfnWndProc = ::DefWindowProc; 
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(wndcls.hInstance, MAKEINTRESOURCE(IDI_MYICON));
wndcls.hCursor = LoadCursor(wndcls.hInstance, MAKEINTRESOURCE(IDC_ARROW));
wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;

// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("MyNewClass");

// Register the new class and trace if it fails
if(!AfxRegisterClass(&wndcls))
{
   TRACE("Class Registration Failed\n");
}

Требования

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

AfxRegisterWndClass

Позволяет зарегистрировать собственные классы окон.

LPCTSTR AFXAPI AfxRegisterWndClass(
    UINT nClassStyle,
    HCURSOR hCursor = 0,
    HBRUSH hbrBackground = 0,
    HICON hIcon = 0);

Параметры

nClassStyle
Задает стиль класса Windows или сочетание стилей, созданных с помощью побитового оператора OR (|) для класса окна. Список стилей классов см WNDCLASS . в структуре пакета SDK для Windows. Если NULLзначение по умолчанию задано следующим образом:

  • Задает стиль CS_DBLCLKSмыши, который отправляет сообщения в процедуру окна, когда пользователь дважды щелкает мышь.

  • Задает стиль курсора со стрелками стандартному стандарту IDC_ARROWWindows.

  • Задает фоновую кисть NULL, чтобы окно не стереть его фон.

  • Задает значок стандартного значка с логотипом Windows с флагом waving.

hCursor
Указывает дескриптор ресурса курсора, который должен быть установлен в каждом окне, созданном из класса окна. Если используется значение по умолчанию 0, вы получите стандартный IDC_ARROW курсор.

hbrBackground
Указывает дескриптор ресурса кисти, который должен быть установлен в каждом окне, созданном из класса окна. Если используется значение по умолчанию 0, у вас будет фоновая NULL кисть, и по умолчанию окно не стирает фон во время обработки WM_ERASEBKGND.

hIcon
Указывает дескриптор ресурса значка, который должен быть установлен в каждом окне, созданном из класса окна. Если используется значение по умолчанию 0, вы получите стандартный значок логотипа Windows с флагом waving.

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

Строка, завершающая значение NULL, содержащая имя класса. Вы можете передать это имя Create класса функции-члена или CWnd другим производным классам **CWnd-*, чтобы создать окно. Имя создается библиотекой классов Microsoft Foundation.

Примечание.

Возвращаемое значение — это указатель на статический буфер. Чтобы сохранить эту строку, назначьте ее переменной CString .

Замечания

Библиотека классов Microsoft Foundation автоматически регистрирует несколько стандартных классов окон. Вызовите эту функцию, если вы хотите зарегистрировать собственные классы окон.

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

При вызове AfxRegisterWndClass нескольких производных CWndклассов с одинаковыми параметрами вместо получения отдельного класса окна для каждого класса каждый класс использует один и тот же класс окна. Этот общий CS_CLASSDC доступ может вызвать проблемы, если используется стиль класса. Вместо нескольких CS_CLASSDC классов окон в конечном итоге используется только один CS_CLASSDC класс окна. Все окна C++, использующие этот класс, используют один и тот же контроллер домена. Чтобы избежать этой проблемы, вызовите AfxRegisterClass регистрацию класса.

Дополнительные сведения о регистрации классов окон и AfxRegisterWndClass функции см. в техническом примечание TN001.

Пример

CString strMyClass;

// load stock cursor, brush, and icon for
// my own window class

try
{
   strMyClass = AfxRegisterWndClass(
       CS_VREDRAW | CS_HREDRAW,
       ::LoadCursor(NULL, IDC_ARROW),
       (HBRUSH)::GetStockObject(WHITE_BRUSH),
       ::LoadIcon(NULL, IDI_APPLICATION));
}
catch (CResourceException *pEx)
{
   AfxMessageBox(_T("Couldn't register class! (Already registered?)"));
   pEx->Delete();
}

Требования

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

AfxSetPerUserRegistration

Задает, перенаправляет ли приложение доступ реестра к HKEY_CURRENT_USER узлу (HKCU).

void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);

Параметры

bEnable
[in] TRUE указывает, что сведения о реестре HKCU направляются на узел. FALSE указывает, что приложение записывает сведения о реестре на узел по умолчанию. Узел по умолчанию — HKEY_CLASSES_ROOT (HKCR).

Замечания

До Windows Vista приложения, которые обращаются к реестру, часто используют HKEY_CLASSES_ROOT узел. Однако при использовании операционных систем Windows Vista или более поздних версий необходимо запустить приложение в режиме с повышенными привилегиями для записи HKCR.

Этот метод позволяет приложению читать и записывать данные в реестр без выполнения в режиме повышенной привилегии. Он работает путем перенаправления доступа к реестру HKCUиз HKCR . Дополнительные сведения см. в разделе Linker Property Pages.

Если включить перенаправление реестра, платформа перенаправляет доступ из HKCR HKEY_CURRENT_USER\Software\Classes. На перенаправление влияют только платформы MFC и ATL.

Реализация по умолчанию обращается к реестру в разделе HKCR.

Требования

Заголовок afxstat_.h

AfxSetResourceHandle

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

void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);

Параметры

hInstResource
Дескриптор экземпляра или модуля в .EXE или DLL-файл, из которого загружаются ресурсы приложения.

Пример

// This code is taken from CMyApp::InitInstance
HINSTANCE hRes = NULL;
hRes = LoadLibrary(_T("Resource.dll"));
if (hRes)
   AfxSetResourceHandle(hRes);

Требования

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

AfxShellManager

Указатель на глобальный диспетчер оболочки.

Синтаксис

CShellManager* afxShellManager;

Требования

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

AfxSocketInit

Вызовите эту функцию в CWinApp::InitInstance переопределении, чтобы инициализировать сокеты Windows.

BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);

Параметры

lpwsaData
Указатель на структуру WSADATA . Если lpwsaData значение равно NULL, адрес WSADATA структуры заполняется вызовом WSAStartup. Эта функция также гарантирует, что WSACleanup вызывается перед завершением работы приложения.

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

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

Замечания

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

Требования

Заголовок afxsock.h

AfxUserToolsManager

Указатель на глобальный диспетчер пользовательских инструментов.

Синтаксис

CUserToolsManager* afxUserToolsManager;

Требования

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

AfxWinInit

Эта функция вызывается предоставленной функцией MFC в рамках CWinApp инициализации приложения на основе графического интерфейса WinMain для инициализации MFC.

BOOL AFXAPI AfxWinInit(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow);

Параметры

hInstance
Дескриптор запущенного модуля.

hPrevInstance
Дескриптор предыдущего экземпляра приложения. Для приложения на основе Win32 этот параметр всегда NULLявляется.

lpCmdLine
Указывает на строку, завершающую значение NULL, указывающую командную строку для приложения.

nCmdShow
Указывает, как будет отображаться главное окно приложения графического интерфейса.

Замечания

Для консольного приложения, которое не использует предоставленную WinMain MFC функцию, необходимо вызвать AfxWinInit непосредственно для инициализации MFC.

При вызове AfxWinInit себя следует объявить экземпляр CWinApp класса. Для консольного приложения вы можете не наследовать собственный класс и CWinApp вместо этого использовать экземпляр CWinApp непосредственно. Этот метод подходит, если вы решите оставить все функциональные возможности приложения в реализации main.

Примечание.

При создании контекста активации для сборки MFC использует ресурс манифеста, предоставляемый модулем пользователя. Контекст активации создается в AfxWinInit. Дополнительные сведения см. в разделе "Поддержка контекстов активации" в состоянии модуля MFC.

Пример

#include <afx.h>
#include <afxdb.h>

int _tmain(int /*argc*/, TCHAR * /*argv[]*/, TCHAR * /*envp[]*/)
{
   int nRetCode = 0;

   // initialize MFC and print and error on failure
   if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
   {
      // TODO: change error code to suit your needs
      _tprintf(_T("Fatal Error: MFC initialization failed\n"));
      nRetCode = 1;
   }
   else
   {
      // try to connect to an ODBC database that doesn't exist
      // (this wouldn't work at all without initializing MFC)

      CDatabase db;
      try
      {
         db.Open(_T("This Databsae Doesn't Exist"));

         // we shouldn't realistically get here

         _tprintf_s(_T("Successful!\n")
                    _T("Closing ...\n"));
         db.Close();
         _tprintf_s(_T("Closed!"));
      }
      catch (CDBException *pEx)
      {
         // we got an exception! print an error message
         // (this wouldn't work without initializing MFC)

         TCHAR sz[1024];

         _tprintf_s(_T("Error: "));
         if (pEx->GetErrorMessage(sz, 1024))
            _tprintf_s(sz);
         else
            _tprintf_s(_T("No error message was available"));
         _tprintf_s(_T("\n"));

         pEx->Delete();

         nRetCode = 1;
      }
   }

   return nRetCode;
}

Требования

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

См. также

Макросы и глобальные
CWinApp Класс
CContextMenuManager Класс
CWnd Класс
CFrameWndEx Класс
CMFCToolBar Класс
CKeyboardManager Класс
CMenuTearOffManager Класс
CMouseManager Класс
CShellManager Класс
CUserToolsManager Класс