Informacje o aplikacji i zarządzanie nią

Podczas pisania aplikacji tworzysz pojedynczy CWinAppobiekt 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 Mapy modułu DLL i zwraca uchwyt, którego można użyć do uzyskania adresu funkcji DLL.
AfxLoadLibraryEx Mapy modułu DLL przy użyciu określonych opcji i zwraca uchwyt, którego można 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 CWinThreadelementu .

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żyj CREATE_SUSPENDED polecenia , jeśli chcesz zainicjować dowolne dane CWinThread składowe obiektu, takie jak m_bAutoDelete lub jakiekolwiek elementy członkowskie klasy pochodnej, przed uruchomieniem wątku. Po zakończeniu inicjowania użyj polecenia CWinThread::ResumeThread , aby uruchomić wątek. Wątek nie zostanie wykonany, dopóki CWinThread::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 NULLsą 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 AfxBeginThreadprogramu , 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łówekafxwin.h

AfxContextMenuManager

Wskaźnik do globalnego menedżera menu kontekstowego.

Składnia

CContextMenuManager* afxContextMenuManager;

Wymagania

Nagłówka: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 AfxEndThreadprogramu , zobacz artykuł Multithreading: Terminating Threads (Wielowątkowa obsługa wątków: kończenie wątków).

Wymagania

Nagłówekafxwin.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:

  1. Moduł główny, jeśli jest to biblioteka DLL rozszerzenia MFC.

  2. Moduły niesystemowe.

  3. Moduły specyficzne dla języka.

  4. Moduł główny, jeśli jest to systemowa biblioteka DLL.

  5. Moduły systemowe.

Wymagania

Nagłówka: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łówekafxdll_.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 NULLwartość , 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łówekafxwin.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łówekafxwin.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łówekafxwin.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łówekafxwin.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\Classesprogramu . 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łówekafxstat_.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 FindResourcesystemu 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łówekafxwin.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łówekafxwin.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 AfxInitRichEditAfxInitRichEdit2.

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ę CreateCRichEditCtrl, CRichEditViewlub CRichEditDoc, zwykle nie trzeba wywoływać tej funkcji, ale w niektórych przypadkach może to być konieczne.

Wymagania

Nagłówekafxwin.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ę CreateCRichEditCtrl, CRichEditViewlub CRichEditDoc, zwykle nie trzeba wywoływać tej funkcji, ale w niektórych przypadkach może to być konieczne.

Wymagania

Nagłówekafxwin.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łówka: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łówka:afxpriv.h

AfxKeyboardManager

Wskaźnik do globalnego menedżera klawiatury.

Składnia

CKeyboardManager* afxKeyboardManager;

Wymagania

Nagłówka: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, dołączana jest domyślna biblioteka DLL rozszerzenia. 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 AfxLoadLibraryelementu , Afxdll_.hjest 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łówekafxdll_.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, dołączana jest domyślna biblioteka DLL rozszerzenia. 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 AfxLoadLibraryExelementu , Afxdll_.hjest 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łówekafxdll_.h

AfxMenuTearOffManager

Wskaźnik do globalnego menedżera menu odrętywania.

Składnia

CMenuTearOffManager* g_pTearOffMenuManager;

Wymagania

Nagłówka:afxmenutearoffmanager.h

AfxMouseManager

Wskaźnik do globalnego menedżera myszy.

Składnia

CMouseManager* afxMouseManager;

Wymagania

Nagłówka: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ę RegisterClasssystemu 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łówekafxwin.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 NULLwartość 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_ARROWsystem 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 CWndklas 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łówekafxwin.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\Classesprogramu . Przekierowanie ma wpływ tylko na struktury MFC i ATL.

Domyślna implementacja uzyskuje dostęp do rejestru w obszarze HKCR.

Wymagania

Nagłówekafxstat_.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ługuje 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łówekafxwin.h

AfxShellManager

Wskaźnik do globalnego menedżera powłoki.

Składnia

CShellManager* afxShellManager;

Wymagania

Nagłówka: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łówekafxsock.h

AfxUserToolsManager

Wskaźnik do globalnego menedżera narzędzi użytkownika.

Składnia

CUserToolsManager* afxUserToolsManager;

Wymagania

Nagłówka: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 mainprogramu .

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łówekafxwin.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