Сведения о приложении и управление им
При написании приложения создается один 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
сообщает, какой ресурс имеется.
Модули выполняются в этом порядке:
Основной модуль, если это библиотека DLL расширения MFC.
Несистемные модули.
Модули, относящиеся к языку.
Основной модуль, если это системная библиотека DLL.
Системные модули.
Требования
Заголовок: 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
, возвращаемый этой функцией, для доступа к ресурсам приложения напрямую, например в вызовах функции FindResource
Windows.
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
который сопоставляется с функцией RegisterClass
Windows, так как классы, зарегистрированные в приложении, автоматически отменяются. Если вы используете 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_ARROW
Windows.Задает фоновую кисть
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
Класс