Informacje o aplikacji i zarządzanie nią
Podczas pisania aplikacji tworzysz pojedynczy CWinApp
obiekt pochodny. Czasami możesz uzyskać informacje o tym obiekcie spoza obiektu pochodnego CWinApp
. Może też być potrzebny dostęp do innych globalnych obiektów "menedżera".
Biblioteka klas programu Microsoft Foundation udostępnia następujące funkcje globalne, które ułatwiają wykonywanie tych zadań:
Funkcje informacji o aplikacji i zarządzania
Nazwa/nazwisko | opis |
---|---|
AfxBeginThread |
Tworzy nowy wątek. |
AfxContextMenuManager |
Wskaźnik do globalnego menedżera menu kontekstowego. |
AfxEndThread |
Przerywa bieżący wątek. |
AfxFindResourceHandle |
Przeprowadzi łańcuch zasobów i zlokalizuj określony zasób według identyfikatora zasobu i typu zasobu. |
AfxFreeLibrary |
Dekrementuje liczbę odwołań załadowanego modułu biblioteki dynamicznej (DLL). Gdy liczba odwołań osiągnie zero, moduł jest niezamapowany. |
AfxGetApp |
Zwraca wskaźnik do pojedynczego CWinApp obiektu aplikacji. |
AfxGetAppName |
Zwraca ciąg zawierający nazwę aplikacji. |
AfxGetInstanceHandle |
Zwraca reprezentację HINSTANCE tego wystąpienia aplikacji. |
AfxGetMainWnd |
Zwraca wskaźnik do bieżącego okna "głównego" aplikacji innej niż OLE lub okna ramowego w miejscu aplikacji serwera. |
AfxGetPerUserRegistration |
Użyj tej funkcji, aby określić, czy aplikacja przekierowuje dostęp rejestru do węzła (HKCU ).HKEY_CURRENT_USER |
AfxGetResourceHandle |
Zwraca wartość do HINSTANCE źródła domyślnych zasobów aplikacji. Użyj polecenia , aby uzyskać bezpośredni dostęp do zasobów aplikacji. |
AfxGetThread |
Pobiera wskaźnik do bieżącego obiektu CWinThread . |
AfxInitRichEdit |
Inicjuje kontrolkę edycji w wersji 1.0 dla aplikacji. |
AfxInitRichEdit2 |
Inicjuje wersję 2.0 i nowszą zaawansowaną kontrolkę edycji dla aplikacji. |
AfxIsExtendedFrameClass |
Określa, czy dane okno jest obiektem rozszerzonej ramki. |
AfxIsMFCToolBar |
Określa, czy dane okno jest obiektem paska narzędzi. |
AfxKeyboardManager |
Wskaźnik do globalnego menedżera klawiatury. |
AfxLoadLibrary |
Mapuje moduł DLL i zwraca uchwyt, którego można użyć do uzyskania adresu funkcji DLL. |
AfxLoadLibraryEx |
Mapuje moduł DLL przy użyciu określonych opcji i zwraca uchwyt, który może służyć do uzyskania adresu funkcji DLL. |
AfxMenuTearOffManager |
Wskaźnik do globalnego menedżera menu odrętywania. |
AfxMouseManager |
Wskaźnik do globalnego menedżera myszy. |
AfxRegisterClass |
Rejestruje klasę okien w dll używającej MFC. |
AfxRegisterWndClass |
Rejestruje klasę okien systemu Windows, aby uzupełnić te zarejestrowane automatycznie przez MFC. |
AfxSetPerUserRegistration |
Określa, czy aplikacja przekierowuje dostęp rejestru do węzła HKEY_CURRENT_USER (HKCU ). |
AfxSetResourceHandle |
Ustawia uchwyt HINSTANCE, w którym są ładowane domyślne zasoby aplikacji. |
AfxShellManager |
Wskaźnik do globalnego menedżera powłoki. |
AfxSocketInit |
Wywołana w przesłonięciu CWinApp::InitInstance w celu zainicjowania gniazd systemu Windows. |
AfxUserToolsManager |
Wskaźnik do globalnego menedżera narzędzi użytkownika. |
AfxWinInit |
Wywoływana przez funkcję dostarczoną WinMain przez MFC w ramach CWinApp inicjowania aplikacji opartej na graficznym interfejsie użytkownika w celu zainicjowania MFC. Należy wywoływać bezpośrednio w przypadku aplikacji konsolowych korzystających z MFC. |
AfxBeginThread
Wywołaj tę funkcję, aby utworzyć nowy wątek.
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);
Parametry
pfnThreadProc
Wskazuje funkcję kontrolującą wątku roboczego. Wskaźnik nie może być .NULL
Ta funkcja musi być zadeklarowana w następujący sposób:
UINT __cdecl MyControllingFunction( LPVOID pParam );
pThreadClass
Obiekt RUNTIME_CLASS
pochodzący z CWinThread
elementu .
pParam
Parametr do przekazania do funkcji sterującej.
nPriority
Priorytet ustawiany dla wątku. Aby uzyskać pełną listę i opis dostępnych priorytetów, zobacz SetThreadPriority
w zestawie Windows SDK.
nStackSize
Określa rozmiar w bajtach stosu dla nowego wątku. Jeśli wartość 0, rozmiar stosu jest domyślnie taki sam, jak wątek tworzenia.
dwCreateFlags
Określa dodatkową flagę, która kontroluje tworzenie wątku. Ta flaga może zawierać jedną z dwóch wartości:
CREATE_SUSPENDED
Rozpocznij wątek z liczbą wstrzymania jednego. UżyjCREATE_SUSPENDED
polecenia , jeśli chcesz zainicjować dowolne daneCWinThread
składowe obiektu, takie jakm_bAutoDelete
lub jakiekolwiek elementy członkowskie klasy pochodnej, przed uruchomieniem wątku. Po zakończeniu inicjowania użyj poleceniaCWinThread::ResumeThread
, aby uruchomić wątek. Wątek nie zostanie wykonany, dopókiCWinThread::ResumeThread
nie zostanie wywołany.0 Uruchom wątek natychmiast po utworzeniu.
lpSecurityAttrs
Wskazuje strukturę określającą SECURITY_ATTRIBUTES
atrybuty zabezpieczeń wątku. Jeśli NULL
są używane te same atrybuty zabezpieczeń co wątek tworzenia. Aby uzyskać więcej informacji na temat tej struktury, zobacz Zestaw WINDOWS SDK.
Wartość zwracana
Wskaźnik do nowo utworzonego obiektu wątku lub NULL
jeśli wystąpi awaria.
Uwagi
Pierwsza forma tworzenia wątku AfxBeginThread
roboczego. Drugi formularz tworzy wątek, który może służyć jako wątek interfejsu użytkownika lub jako wątek procesu roboczego.
AfxBeginThread
Tworzy nowy CWinThread
obiekt, wywołuje jego CreateThread
funkcję, aby rozpocząć wykonywanie wątku i zwraca wskaźnik do wątku. Kontrole są wykonywane w całej procedurze, aby upewnić się, że wszystkie obiekty są prawidłowo cofnięte, jeśli jakakolwiek część tworzenia zakończy się niepowodzeniem. Aby zakończyć wątek, wywołaj AfxEndThread
element z wątku lub wróć z funkcji sterującej wątku roboczego.
Wielowątkowość musi być włączona przez aplikację; w przeciwnym razie ta funkcja zakończy się niepowodzeniem. Aby uzyskać więcej informacji na temat włączania wielowątków, zobacz /MD
, /MT
/LD
(Używanie biblioteki czasu wykonywania).
Aby uzyskać więcej informacji na temat AfxBeginThread
programu , zobacz artykuły Multithreading: Creating Worker Threads and Multithreading: Creating User-Interface Threads (Tworzenie wątków wielowątku: tworzenie wątków procesu roboczego i wielowątkowość: tworzenie wątków interfejsu użytkownika).
Przykład
Zobacz przykład dla elementu CSocket::Attach
.
Wymagania
Nagłówek afxwin.h
AfxContextMenuManager
Wskaźnik do globalnego menedżera menu kontekstowego.
Składnia
CContextMenuManager* afxContextMenuManager;
Wymagania
Nagłówek: afxcontextmenumanager.h
AfxEndThread
Wywołaj tę funkcję, aby zakończyć aktualnie wykonywany wątek.
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE);
Parametry
nExitCode
Określa kod zakończenia wątku.
bDelete
Usuwa obiekt wątku z pamięci.
Uwagi
Należy wywołać z wewnątrz wątku, aby zakończyć.
Aby uzyskać więcej informacji na temat AfxEndThread
programu , zobacz artykuł Multithreading: Terminating Threads (Wielowątkowa obsługa wątków: kończenie wątków).
Wymagania
Nagłówek afxwin.h
AfxFindResourceHandle
Służy AfxFindResourceHandle
do chodzenia po łańcuchu zasobów i lokalizowania określonego zasobu według identyfikatora zasobu i typu zasobu.
Składnia
HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName, LPCTSTR lpszType );
Parametry
lpszName
Wskaźnik do ciągu zawierającego identyfikator zasobu.
lpszType
Wskaźnik do typu zasobu. Aby uzyskać listę typów zasobów, zobacz FindResource
w zestawie Windows SDK.
Wartość zwracana
Dojście do modułu zawierającego zasób.
Uwagi
AfxFindResourceHandle
znajduje określony zasób i zwraca uchwyt do modułu zawierającego zasób. Zasób może znajdować się w dowolnej załadowanej biblioteki DLL rozszerzenia MFC. AfxFindResourceHandle
informuje o tym, który z nich ma zasób.
Moduły są przeszukiwane w następującej kolejności:
Moduł główny, jeśli jest to biblioteka DLL rozszerzenia MFC.
Moduły niesystemowe.
Moduły specyficzne dla języka.
Moduł główny, jeśli jest to systemowa biblioteka DLL.
Moduły systemowe.
Wymagania
Nagłówek: afxwin.h
AfxFreeLibrary
Zarówno, AfxFreeLibrary
jak i AfxLoadLibrary
obsługa liczby odwołań dla każdego załadowanego modułu biblioteki.
BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);
Parametry
hInstLib
Uchwyt załadowanego modułu biblioteki. AfxLoadLibrary
zwraca ten uchwyt.
Wartość zwracana
TRUE
jeśli funkcja powiedzie się; w przeciwnym razie, FALSE
.
Uwagi
AfxFreeLibrary
dekrementuje liczbę odwołań załadowanego modułu biblioteki dynamicznej (DLL). Gdy liczba odwołań osiągnie zero, moduł jest niezamapowany z przestrzeni adresowej procesu wywołującego, a dojście nie jest już prawidłowe. Ta liczba odwołań jest zwiększana za każdym razem, gdy AfxLoadLibrary
jest wywoływana.
Przed anulowaniem mapowania modułu biblioteki system umożliwia biblioteki DLL odłączanie od procesów przy użyciu niego. Dzięki temu biblioteka DLL może wyczyścić zasoby przydzielone do bieżącego procesu. Po powrocie funkcji punktu wejścia moduł biblioteki zostanie usunięty z przestrzeni adresowej bieżącego procesu.
Służy AfxLoadLibrary
do mapowania modułu DLL.
Pamiętaj, aby używać AfxFreeLibrary
funkcji i AfxLoadLibrary
(zamiast funkcji FreeLibrary
Win32 i LoadLibrary
), jeśli aplikacja używa wielu wątków. Użycie AfxLoadLibrary
i AfxFreeLibrary
gwarantuje, że kod uruchamiania i zamykania, który jest wykonywany, gdy biblioteka DLL rozszerzenia MFC jest ładowana i zwalniana, nie powoduje uszkodzenia globalnego stanu MFC.
Przykład
Zobacz przykład dla elementu AfxLoadLibrary
.
Wymagania
Nagłówek afxdll_.h
AfxGetApp
Wskaźnik zwrócony przez tę funkcję może służyć do uzyskiwania dostępu do informacji o aplikacji, takich jak główny kod wysyłania komunikatów lub najbardziej górne okno.
CWinApp* AFXAPI AfxGetApp();
Wartość zwracana
Wskaźnik do pojedynczego CWinApp
obiektu dla aplikacji.
Uwagi
Jeśli ta metoda zwróci NULL
wartość , może to oznaczać, że okno główne aplikacji nie zostało jeszcze w pełni zainicjowane. Może to również wskazywać na problem.
Przykład
// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);
Wymagania
Nagłówek afxwin.h
AfxGetAppName
Zwracany ciąg może służyć do obsługi komunikatów diagnostycznych lub jako katalogu głównego dla nazw ciągów tymczasowych.
LPCTSTR AFXAPI AfxGetAppName();
Wartość zwracana
Ciąg zakończony wartością null zawierający nazwę aplikacji.
Przykład
// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());
Wymagania
Nagłówek afxwin.h
AfxGetInstanceHandle
Ta funkcja umożliwia pobranie dojścia wystąpienia bieżącej aplikacji.
HINSTANCE AFXAPI AfxGetInstanceHandle();
Wartość zwracana
Element HINSTANCE
do bieżącego wystąpienia aplikacji. W przypadku wywołania z biblioteki DLL połączonej z wersją MFC USRDLL zwracany jest parametr do HINSTANCE
biblioteki DLL.
Uwagi
AfxGetInstanceHandle
zawsze zwraca HINSTANCE
plik wykonywalny (.EXE), chyba że jest wywoływany z biblioteki DLL połączonej z wersją MFC USRDLL. W tym przypadku zwraca wartość do HINSTANCE
biblioteki DLL.
Przykład
// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
Wymagania
Nagłówek afxwin.h
AfxGetMainWnd
Jeśli aplikacja jest serwerem OLE, wywołaj tę funkcję, aby pobrać wskaźnik do aktywnego okna głównego aplikacji. Użyj tego wyniku zamiast bezpośredniego odwoływania się do m_pMainWnd
elementu członkowskiego obiektu aplikacji.
CWnd* AFXAPI AfxGetMainWnd();
Wartość zwracana
Zwraca wskaźnik do obiektu okna ramki, który zawiera aktywny dokument w miejscu, jeśli serwer ma obiekt, który jest aktywny w aktywnym kontenerze.
Jeśli w kontenerze nie ma aktywnego obiektu lub aplikacja nie jest serwerem OLE, ta funkcja zwraca m_pMainWnd
obiekt aplikacji.
Jeśli AfxGetMainWnd
jest wywoływany z podstawowego wątku aplikacji, zwraca główne okno aplikacji zgodnie z powyższymi regułami. Jeśli funkcja jest wywoływana z wątku pomocniczego w aplikacji, funkcja zwraca okno główne skojarzone z wątkiem, który wykonał wywołanie.
Uwagi
Jeśli aplikacja nie jest serwerem OLE, wywołanie tej funkcji jest równoważne bezpośrednio odwołującemu się do m_pMainWnd
elementu członkowskiego obiektu aplikacji.
Przykład
//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);
Wymagania
Nagłówek afxwin.h
AfxGetPerUserRegistration
Użyj tej funkcji, aby określić, czy aplikacja przekierowuje dostęp rejestru do węzła (HKCU
).HKEY_CURRENT_USER
BOOL AFXAPI AfxGetPerUserRegistration();
Wartość zwracana
TRUE
wskazuje, że informacje o rejestrze są kierowane do węzła HKCU
. FALSE
wskazuje, że aplikacja zapisuje informacje rejestru w węźle domyślnym. Domyślny węzeł to HKEY_CLASSES_ROOT
(HKCR
).
Uwagi
Jeśli włączysz przekierowywanie rejestru, platforma przekierowuje dostęp z HKCR
do HKEY_CURRENT_USER\Software\Classes
programu . Przekierowanie ma wpływ tylko na struktury MFC i ATL.
Aby zmienić, czy aplikacja przekierowuje dostęp do rejestru, użyj polecenia AfxSetPerUserRegistration
.
Wymagania
Nagłówek afxstat_.h
AfxGetResourceHandle
Użyj uchwytu HINSTANCE
zwróconego przez tę funkcję, aby uzyskać bezpośredni dostęp do zasobów aplikacji, na przykład w wywołaniach funkcji FindResource
systemu Windows .
extern HINSTANCE AfxGetResourceHandle();
Wartość zwracana
Dojście HINSTANCE
, w którym są ładowane domyślne zasoby aplikacji.
Przykład
//Load the menu specifying the module handle where resource is to be
//found & resource ID
HMENU hMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
Wymagania
Nagłówek afxwin.h
AfxGetThread
Wywołaj tę funkcję, aby uzyskać wskaźnik do CWinThread
obiektu reprezentującego aktualnie wykonywany wątek.
CWinThread* AfxGetThread();
Wartość zwracana
Wskaźnik do aktualnie wykonywanego wątku; w przeciwnym razie NULL
.
Uwagi
Musi być wywoływana z poziomu wątku.
Uwaga
Jeśli przenosisz projekt MFC wywołujący AfxGetThread
z programu Visual C++ w wersji 4.2, 5.0 lub 6.0, wywołaj wywołaniaAfxGetApp
, AfxGetThread
jeśli nie znaleziono wątku. W nowszych wersjach kompilatora AfxGetThread
zwraca wartość NULL
, jeśli nie znaleziono wątku. Jeśli chcesz, aby wątek aplikacji był wywoływany AfxGetApp
.
Przykład
//Print the current thread ID in the Debug Window
TRACE(_T("Current Thread ID = 0x%X\n"), AfxGetThread()->m_nThreadID);
Wymagania
Nagłówek afxwin.h
AfxInitRichEdit
Wywołaj tę funkcję, aby zainicjować zaawansowaną kontrolkę edycji (wersja 1.0) dla aplikacji.
BOOL AFXAPI AfxInitRichEdit();
Uwagi
Ta funkcja jest udostępniana w celu zapewnienia zgodności z poprzednimi wersjami. Nowe aplikacje powinny używać polecenia AfxInitRichEdit2
.
AfxInitRichEdit
ładuje RICHED32.DLL
się, aby zainicjować wersję 1.0 kontrolki edycji wzbogaconej. Aby użyć wersji 2.0 i 3.0 kontrolki edycji wzbogaconej, RICHED20.DLL
należy załadować. Jest ładowany przez wywołanie metody AfxInitRichEdit2
.
Aby zaktualizować zaawansowane kontrolki edycji w istniejących aplikacjach Visual C++ do wersji 2.0, otwórz plik . Plik RC jako tekst, zmień nazwę klasy każdej kontrolki edycji sformatowanej z "RICHEDIT
" na "RichEdit20a
". Następnie zastąp wywołanie na AfxInitRichEdit
AfxInitRichEdit2
.
Ta funkcja inicjuje również wspólną bibliotekę kontrolek, jeśli biblioteka nie została jeszcze zainicjowana dla tego procesu. Jeśli używasz kontrolki edycji wzbogaconej bezpośrednio z aplikacji MFC, wywołaj tę funkcję, aby zapewnić prawidłowe zainicjowanie środowiska uruchomieniowego kontrolki edycji wzbogaconej przez MFC. Jeśli wywołasz metodę Create
CRichEditCtrl
, CRichEditView
lub CRichEditDoc
, zwykle nie trzeba wywoływać tej funkcji, ale w niektórych przypadkach może to być konieczne.
Wymagania
Nagłówek afxwin.h
AfxInitRichEdit2
Wywołaj tę funkcję, aby zainicjować kontrolkę edycji wzbogaconej (w wersji 2.0 lub nowszej) dla aplikacji.
BOOL AFXAPI AfxInitRichEdit2();
Uwagi
Wywołaj tę funkcję, aby załadować RICHED20.DLL
i zainicjować wersję 2.0 kontrolki edycji wzbogaconej. Jeśli wywołasz metodę Create
CRichEditCtrl
, CRichEditView
lub CRichEditDoc
, zwykle nie trzeba wywoływać tej funkcji, ale w niektórych przypadkach może to być konieczne.
Wymagania
Nagłówek afxwin.h
AfxIsExtendedFrameClass
Określa, czy dane okno jest obiektem rozszerzonej ramki.
Składnia
BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );
Parametry
pWnd
[in] Wskaźnik do obiektu, który pochodzi z CWnd
.
Wartość zwracana
TRUE
jeśli podane okno jest obiektem rozszerzonej ramki; w przeciwnym razie FALSE
.
Uwagi
Ta metoda zwraca wartość TRUE
, jeśli pWnd
pochodzi z jednej z następujących klas:
CFrameWndEx
CMDIFrameWndEx
COleIPFrameWndEx
COleDocIPFrameWndEx
CMDIChildWndEx
Ta metoda jest przydatna, gdy trzeba sprawdzić, czy parametr funkcji lub metody jest rozszerzonym oknem ramowym.
Wymagania
Nagłówek: afxpriv.h
AfxIsMFCToolBar
Określa, czy dane okno jest obiektem paska narzędzi.
Składnia
BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);
Parametry
pWnd
[in] Wskaźnik do obiektu, który pochodzi z CWnd
.
Wartość zwracana
TRUE
jeśli podane okno jest obiektem paska narzędzi; w przeciwnym razie FALSE
.
Uwagi
Ta metoda zwraca wartość TRUE
, jeśli pWnd
pochodzi z klasy CMFCToolBar
. Ta metoda jest przydatna, gdy trzeba sprawdzić, czy parametr funkcji lub metody jest obiektem CMFCToolBar
.
Wymagania
Nagłówek: afxpriv.h
AfxKeyboardManager
Wskaźnik do globalnego menedżera klawiatury.
Składnia
CKeyboardManager* afxKeyboardManager;
Wymagania
Nagłówek: afxkeyboardmanager.h
AfxLoadLibrary
Służy AfxLoadLibrary
do mapowania modułu DLL.
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);
Parametry
lpszModuleName
Wskazuje ciąg o wartości null, który zawiera nazwę modułu (plik .DLL lub .EXE). Określona nazwa to nazwa modułu.
Jeśli ciąg określa ścieżkę, ale plik nie istnieje w określonym katalogu, funkcja kończy się niepowodzeniem.
Jeśli ścieżka nie zostanie określona, a rozszerzenie nazwy pliku zostanie pominięte, zostanie dołączone domyślne rozszerzenie .DLL. Jednak ciąg nazwy pliku może zawierać znak punktu końcowego (.), aby wskazać, że nazwa modułu nie ma rozszerzenia. Jeśli nie określono żadnej ścieżki, funkcja używa kolejności wyszukiwania aplikacji klasycznych.
Wartość zwracana
Jeśli funkcja powiedzie się, zwracana wartość jest dojściem do modułu. Po niepowodzeniu zwracana wartość to NULL
.
Uwagi
Zwraca uchwyt, którego można użyć do GetProcAddress
pobrania adresu funkcji DLL. AfxLoadLibrary
Można również użyć do mapowania innych modułów wykonywalnych.
Każdy proces utrzymuje liczbę odwołań dla każdego załadowanego modułu biblioteki. Ta liczba odwołań jest zwiększana za każdym razem, gdy AfxLoadLibrary
jest wywoływana i jest dekrementowana za każdym razem, gdy AfxFreeLibrary
jest wywoływana. Gdy liczba odwołań osiągnie zero, moduł jest niezamapowany z przestrzeni adresowej procesu wywołującego, a dojście nie jest już prawidłowe.
Pamiętaj, aby używać AfxLoadLibrary
funkcji i AfxFreeLibrary
(zamiast funkcji LoadLibrary
Win32 i FreeLibrary
), jeśli aplikacja używa wielu wątków, a jeśli dynamicznie ładuje bibliotekę DLL rozszerzenia MFC. Użycie AfxLoadLibrary
i AfxFreeLibrary
zapewnienie, że kod uruchamiania i zamykania, który jest wykonywany, gdy biblioteka DLL rozszerzenia MFC jest ładowana i zwalniana, nie powoduje uszkodzenia globalnego stanu MFC.
Użycie AfxLoadLibrary
w aplikacji wymaga dynamicznego połączenia z wersją biblioteki DLL MFC. Plik nagłówka dla AfxLoadLibrary
elementu , Afxdll_.h
jest dołączany tylko wtedy, gdy MFC jest połączony z aplikacją jako biblioteka DLL. To wymaganie jest wymagane zgodnie z projektem, ponieważ należy połączyć się z wersją biblioteki DLL MFC, aby używać bibliotek DLL rozszerzeń MFC lub tworzyć biblioteki DLL rozszerzeń MFC.
Przykład
// 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();
}
Wymagania
Nagłówek afxdll_.h
AfxLoadLibraryEx
Służy AfxLoadLibraryEx
do mapowania modułu DLL.
HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);
Parametry
lpFileName
Wskazuje ciąg o wartości null, który zawiera nazwę modułu (plik .DLL lub .EXE). Określona nazwa to nazwa modułu.
Jeśli ciąg określa ścieżkę, ale plik nie istnieje w określonym katalogu, funkcja kończy się niepowodzeniem.
Jeśli ścieżka nie zostanie określona, a rozszerzenie nazwy pliku zostanie pominięte, zostanie dołączone domyślne rozszerzenie .DLL. Jednak ciąg nazwy pliku może zawierać znak punktu końcowego (.), aby wskazać, że nazwa modułu nie ma rozszerzenia. Jeśli nie określono żadnej ścieżki, funkcja używa kolejności wyszukiwania aplikacji klasycznych.
hFile
Ten parametr jest zarezerwowany do użytku w przyszłości. Musi to być NULL
.
dwFlags
Akcja, która ma zostać podjęta podczas ładowania modułu. Jeśli nie określono żadnych flag, zachowanie tej funkcji jest identyczne z funkcją AfxLoadLibrary
. Możliwe wartości tego parametru są opisane w LoadLibraryEx
dokumentacji.
Wartość zwracana
Jeśli funkcja powiedzie się, zwracana wartość jest dojściem do modułu. Po niepowodzeniu zwracana wartość to NULL
.
Uwagi
AfxLoadLibraryEx
Zwraca uchwyt, którego można użyć do GetProcAddress
pobrania adresu funkcji DLL. AfxLoadLibraryEx
Można również użyć do mapowania innych modułów wykonywalnych.
Każdy proces utrzymuje liczbę odwołań dla każdego załadowanego modułu biblioteki. Ta liczba odwołań jest zwiększana za każdym razem, gdy AfxLoadLibraryEx
jest wywoływana i jest dekrementowana za każdym razem, gdy AfxFreeLibrary
jest wywoływana. Gdy liczba odwołań osiągnie zero, moduł jest niezamapowany z przestrzeni adresowej procesu wywołującego, a dojście nie jest już prawidłowe.
Pamiętaj, aby używać AfxLoadLibraryEx
funkcji i AfxFreeLibrary
(zamiast funkcji LoadLibraryEx
Win32 i FreeLibrary
), jeśli aplikacja używa wielu wątków i czy dynamicznie ładuje bibliotekę DLL rozszerzenia MFC. Użycie AfxLoadLibraryEx
i AfxFreeLibrary
gwarantuje, że kod uruchamiania i zamykania, który jest wykonywany, gdy biblioteka DLL rozszerzenia MFC jest ładowana i zwalniana, nie powoduje uszkodzenia globalnego stanu MFC.
Użycie AfxLoadLibraryEx
w aplikacji wymaga dynamicznego połączenia z wersją biblioteki DLL MFC. Plik nagłówka dla AfxLoadLibraryEx
elementu , Afxdll_.h
jest dołączany tylko wtedy, gdy MFC jest połączony z aplikacją jako biblioteka DLL. To wymaganie jest wymagane zgodnie z projektem, ponieważ należy połączyć się z wersją biblioteki DLL MFC, aby używać bibliotek DLL rozszerzeń MFC lub tworzyć biblioteki DLL rozszerzeń MFC.
Wymagania
Nagłówek afxdll_.h
AfxMenuTearOffManager
Wskaźnik do globalnego menedżera menu odrętywania.
Składnia
CMenuTearOffManager* g_pTearOffMenuManager;
Wymagania
Nagłówek: afxmenutearoffmanager.h
AfxMouseManager
Wskaźnik do globalnego menedżera myszy.
Składnia
CMouseManager* afxMouseManager;
Wymagania
Nagłówek: afxmousemanager.h
AfxRegisterClass
Ta funkcja służy do rejestrowania klas okien w bibliotece DLL korzystającej z MFC.
BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);
Parametry
lpWndClass
Wskaźnik do WNDCLASS
struktury zawierającej informacje o klasie okien do zarejestrowania. Aby uzyskać więcej informacji na temat tej struktury, zobacz Zestaw WINDOWS SDK.
Wartość zwracana
TRUE
jeśli klasa została pomyślnie zarejestrowana; w przeciwnym razie FALSE
.
Uwagi
Jeśli używasz tej funkcji, klasa jest automatycznie wyrejestrowana, gdy biblioteka DLL zostanie zwolniona.
W kompilacjach innych niż DLL identyfikator jest definiowany jako makro mapowane na funkcję RegisterClass
systemu Windows, AfxRegisterClass
ponieważ klasy zarejestrowane w aplikacji są automatycznie wyrejestrowane. Jeśli używasz AfxRegisterClass
zamiast RegisterClass
, kod może być używany bez zmiany zarówno w aplikacji, jak i w dll.
Przykład
// 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");
}
Wymagania
Nagłówek afxwin.h
AfxRegisterWndClass
Umożliwia zarejestrowanie własnych klas okien.
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0);
Parametry
nClassStyle
Określa styl klasy systemu Windows lub kombinację stylów utworzonych przy użyciu operatora bitowego OR (|
) dla klasy okna. Aby uzyskać listę stylów klas, zobacz WNDCLASS
strukturę w zestawie Windows SDK. Jeśli NULL
wartość domyślna jest ustawiona w następujący sposób:
Ustawia styl myszy na
CS_DBLCLKS
, który wysyła komunikaty dwukrotne kliknięcie do procedury okna, gdy użytkownik kliknie dwukrotnie mysz.Ustawia styl kursora strzałki na standardowy
IDC_ARROW
system Windows.Ustawia szczotkę tła na
NULL
, więc okno nie wymazuje tła.Ustawia ikonę na standardową ikonę logo systemu Windows waving-flag.
hCursor
Określa uchwyt zasobu kursora, który ma zostać zainstalowany w każdym oknie utworzonym na podstawie klasy okna. Jeśli używasz wartości domyślnej 0, otrzymasz standardowy IDC_ARROW
kursor.
hbrBackground
Określa uchwyt zasobu pędzla, który ma zostać zainstalowany w każdym oknie utworzonym na podstawie klasy okna. Jeśli używasz wartości domyślnej 0, będziesz mieć szczotkę NULL
tła, a domyślnie okno nie wymazuje tła podczas przetwarzania WM_ERASEBKGND
.
hIcon
Określa uchwyt do zasobu ikony, który ma zostać zainstalowany w każdym oknie utworzonym na podstawie klasy okna. Jeśli używasz wartości domyślnej 0, zostanie wyświetlona standardowa ikona logo systemu Windows waving-flaga.
Wartość zwracana
Ciąg zakończony wartością null zawierający nazwę klasy. Aby utworzyć okno, możesz przekazać tę nazwę klasy do funkcji składowej Create
lub CWnd
do innych klas pochodnych ****CWnd-
. Nazwa jest generowana przez bibliotekę klas programu Microsoft Foundation.
Uwaga
Wartość zwracana jest wskaźnikiem do buforu statycznego. Aby zapisać ten ciąg, przypisz go do zmiennej CString
.
Uwagi
Biblioteka klas programu Microsoft Foundation automatycznie rejestruje kilka standardowych klas okien. Wywołaj tę funkcję, jeśli chcesz zarejestrować własne klasy okien.
Nazwa zarejestrowana dla klasy AfxRegisterWndClass
zależy wyłącznie od parametrów. Jeśli wywołujesz AfxRegisterWndClass
wiele razy z identycznymi parametrami, rejestruje tylko klasę w pierwszym wywołaniu. Później wywołania polecenia AfxRegisterWndClass
z identycznymi parametrami zwracają już zarejestrowaną nazwę klasy.
Jeśli wywołasz AfxRegisterWndClass
wiele CWnd
klas pochodnych z identycznymi parametrami, zamiast uzyskać oddzielną klasę okien dla każdej klasy, każda klasa współudzieli tę samą klasę okien. To udostępnianie może powodować problemy, jeśli CS_CLASSDC
jest używany styl klasy. Zamiast wielu CS_CLASSDC
klas okien kończy się tylko jedną klasą CS_CLASSDC
okien. Wszystkie okna C++, które używają tej klasy, współużytkuje ten sam kontroler domeny. Aby uniknąć tego problemu, wywołaj metodę AfxRegisterClass
, aby zarejestrować klasę.
Zapoznaj się z dokumentacją techniczną TN001: Rejestracja klas okien, aby uzyskać więcej informacji na temat rejestracji klas okien i AfxRegisterWndClass
funkcji.
Przykład
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();
}
Wymagania
Nagłówek afxwin.h
AfxSetPerUserRegistration
Określa, czy aplikacja przekierowuje dostęp rejestru do węzła HKEY_CURRENT_USER
(HKCU
).
void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);
Parametry
bEnable
[in] TRUE
wskazuje, że informacje o rejestrze są kierowane do węzła HKCU
. FALSE
wskazuje, że aplikacja zapisuje informacje rejestru w węźle domyślnym. Domyślny węzeł to HKEY_CLASSES_ROOT
(HKCR
).
Uwagi
Przed systemem Windows Vista aplikacje, które uzyskiwały dostęp do rejestru, często używały węzła HKEY_CLASSES_ROOT
. Jednak w systemie operacyjnym Windows Vista lub nowszym należy uruchomić aplikację w trybie podwyższonego poziomu uprawnień, aby zapisać w systemie HKCR
.
Ta metoda umożliwia aplikacji odczytywanie i zapisywanie w rejestrze bez uruchamiania w trybie podwyższonego poziomu uprawnień. Działa to przez przekierowanie dostępu rejestru z HKCR
do HKCU
. Aby uzyskać więcej informacji, zobacz Strony właściwości konsolidatora.
Jeśli włączysz przekierowywanie rejestru, platforma przekierowuje dostęp z HKCR
do HKEY_CURRENT_USER\Software\Classes
programu . Przekierowanie ma wpływ tylko na struktury MFC i ATL.
Domyślna implementacja uzyskuje dostęp do rejestru w obszarze HKCR
.
Wymagania
Nagłówek afxstat_.h
AfxSetResourceHandle
Użyj tej funkcji, aby ustawić HINSTANCE
uchwyt, który określa, gdzie są ładowane domyślne zasoby aplikacji.
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
Parametry
hInstResource
Wystąpienie lub moduł obsługują plik .EXE lub DLL, z którego są ładowane zasoby aplikacji.
Przykład
// This code is taken from CMyApp::InitInstance
HINSTANCE hRes = NULL;
hRes = LoadLibrary(_T("Resource.dll"));
if (hRes)
AfxSetResourceHandle(hRes);
Wymagania
Nagłówek afxwin.h
AfxShellManager
Wskaźnik do globalnego menedżera powłoki.
Składnia
CShellManager* afxShellManager;
Wymagania
Nagłówek: afxshellmanager.h
AfxSocketInit
Wywołaj tę funkcję w przesłonięciu CWinApp::InitInstance
, aby zainicjować gniazda systemu Windows.
BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);
Parametry
lpwsaData
Wskaźnik do WSADATA
struktury. Jeśli lpwsaData
wartość nie jest równa NULL
, adres WSADATA
struktury jest wypełniany przez wywołanie metody WSAStartup
. Ta funkcja zapewnia również wywołanie WSACleanup
funkcji przed zakończeniem działania aplikacji.
Wartość zwracana
Różne od zera, jeśli funkcja zakończyła się pomyślnie; w przeciwnym razie 0.
Uwagi
W przypadku korzystania z gniazd MFC w wątkach pomocniczych w statycznie połączonej aplikacji MFC należy wywołać AfxSocketInit
w każdym wątku, który używa gniazd do inicjowania bibliotek gniazd. Domyślnie AfxSocketInit
jest wywoływana tylko w wątku podstawowym.
Wymagania
Nagłówek afxsock.h
AfxUserToolsManager
Wskaźnik do globalnego menedżera narzędzi użytkownika.
Składnia
CUserToolsManager* afxUserToolsManager;
Wymagania
Nagłówek: afxusertoolsmanager.h
AfxWinInit
Ta funkcja jest wywoływana przez funkcję dostarczoną WinMain
przez MFC w ramach CWinApp
inicjowania aplikacji opartej na graficznym interfejsie użytkownika w celu zainicjowania MFC.
BOOL AFXAPI AfxWinInit(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow);
Parametry
hInstance
Uchwyt aktualnie uruchomionego modułu.
hPrevInstance
Dojście do poprzedniego wystąpienia aplikacji. W przypadku aplikacji opartej na systemie Win32 ten parametr jest zawsze NULL
.
lpCmdLine
Wskazuje ciąg zakończony o wartości null określający wiersz polecenia dla aplikacji.
nCmdShow
Określa sposób wyświetlania głównego okna aplikacji graficznego interfejsu użytkownika.
Uwagi
W przypadku aplikacji konsolowej, która nie używa funkcji dostarczonej WinMain
przez MFC, należy wywołać AfxWinInit
ją bezpośrednio, aby zainicjować MFC.
Jeśli wywołasz AfxWinInit
się samodzielnie, należy zadeklarować wystąpienie CWinApp
klasy. W przypadku aplikacji konsolowej możesz zrezygnować z utworzenia własnej klasy, CWinApp
a zamiast tego użyć wystąpienia CWinApp
bezpośrednio. Ta technika jest odpowiednia, jeśli zdecydujesz się pozostawić wszystkie funkcje aplikacji we wdrożeniu main
programu .
Uwaga
Podczas tworzenia kontekstu aktywacji dla zestawu MFC używa zasobu manifestu dostarczonego przez moduł użytkownika. Kontekst aktywacji jest tworzony w programie AfxWinInit
. Aby uzyskać więcej informacji, zobacz Obsługa kontekstów aktywacji w stanie modułu MFC.
Przykład
#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;
}
Wymagania
Nagłówek afxwin.h
Zobacz też
Makra i globalne
CWinApp
Klasa
CContextMenuManager
Klasa
CWnd
Klasa
CFrameWndEx
Klasa
CMFCToolBar
Klasa
CKeyboardManager
Klasa
CMenuTearOffManager
Klasa
CMouseManager
Klasa
CShellManager
Klasa
CUserToolsManager
Klasa