Anwendungsinformationen und Anwendungsverwaltung

Wenn Sie eine Anwendung schreiben, erstellen Sie ein einzelnes CWinAppabgeleitetes Objekt. Manchmal möchten Sie informationen zu diesem Objekt von außerhalb des CWinAppabgeleiteten Objekts abrufen. Oder Sie benötigen möglicherweise Zugriff auf andere globale "Manager"-Objekte.

Die Microsoft Foundation-Klassenbibliothek bietet die folgenden globalen Funktionen, mit denen Sie diese Aufgaben ausführen können:

Anwendungsinformations- und Verwaltungsfunktionen

Name Beschreibung
AfxBeginThread Erstellt einen neuen Thread.
AfxContextMenuManager Zeigen Sie auf den globalen Kontextmenü-Manager.
AfxEndThread Beendet den aktuellen Thread.
AfxFindResourceHandle Führt die Ressourcenkette durch und sucht eine bestimmte Ressource nach Ressourcen-ID und Ressourcentyp.
AfxFreeLibrary Erhöht die Referenzanzahl des geladenen DLL-Moduls (Dynamic Link Library). Wenn die Referenzanzahl null erreicht, wird das Modul nicht zugeordnet.
AfxGetApp Gibt einen Zeiger auf das einzelne CWinApp Objekt der Anwendung zurück.
AfxGetAppName Gibt eine Zeichenfolge zurück, die den Namen der Anwendung enthält.
AfxGetInstanceHandle Gibt eine HINSTANCE Darstellung dieser Instanz der Anwendung zurück.
AfxGetMainWnd Gibt einen Zeiger auf das aktuelle Fenster "Standard" einer Nicht-OLE-Anwendung oder das direkte Framefenster einer Serveranwendung zurück.
AfxGetPerUserRegistration Verwenden Sie diese Funktion, um zu bestimmen, ob die Anwendung den Registrierungszugriff auf den HKEY_CURRENT_USER Knoten (HKCU) umleitet.
AfxGetResourceHandle Gibt eine HINSTANCE an die Quelle der Standardressourcen der Anwendung zurück. Wird verwendet, um direkt auf die Ressourcen der Anwendung zuzugreifen.
AfxGetThread Ruft einen Zeiger auf das aktuelle CWinThread -Objekt ab.
AfxInitRichEdit Initialisiert das Rich-Edit-Steuerelement der Version 1.0 für die Anwendung.
AfxInitRichEdit2 Initialisiert die Version 2.0 und höher das Rich-Edit-Steuerelement für die Anwendung.
AfxIsExtendedFrameClass Bestimmt, ob das jeweilige Fenster ein erweitertes Rahmenobjekt ist.
AfxIsMFCToolBar Bestimmt, ob das angegebene Fenster ein Symbolleistenobjekt ist.
AfxKeyboardManager Zeigen Sie auf den globalen Tastatur-Manager.
AfxLoadLibrary Karten ein DLL-Modul und gibt ein Handle zurück, mit dem die Adresse einer DLL-Funktion abgerufen werden kann.
AfxLoadLibraryEx Karten ein DLL-Modul mithilfe der angegebenen Optionen zurück und gibt ein Handle zurück, mit dem die Adresse einer DLL-Funktion abgerufen werden kann.
AfxMenuTearOffManager Zeigen Sie auf den globalen Menü-Manager zum Abreißen.
AfxMouseManager Zeigen Sie auf den globalen Maus-Manager.
AfxRegisterClass Registriert eine Fensterklasse in einer DLL, die MFC verwendet.
AfxRegisterWndClass Registriert eine Windows-Fensterklasse, um die automatisch von MFC registrierten Zusätze zu ergänzen.
AfxSetPerUserRegistration Legt fest, ob die Anwendung den Registrierungszugriff auf den HKEY_CURRENT_USER (HKCU) Knoten umleitet.
AfxSetResourceHandle Legt das HINSTANCE-Handle fest, bei dem die Standardressourcen der Anwendung geladen werden.
AfxShellManager Zeigen Sie auf den globalen Shell-Manager.
AfxSocketInit Wird in einer CWinApp::InitInstance Außerkraftsetzung aufgerufen, um Windows Sockets zu initialisieren.
AfxUserToolsManager Zeigen Sie auf den Manager für globale Benutzertools.
AfxWinInit Wird von der vom MFC bereitgestellten WinMain Funktion als Teil der CWinApp Initialisierung einer GUI-basierten Anwendung aufgerufen, um MFC zu initialisieren. Muss direkt für Konsolenanwendungen aufgerufen werden, die MFC verwenden.

AfxBeginThread

Rufen Sie diese Funktion auf, um einen neuen Thread zu erstellen.

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);

Parameter

pfnThreadProc
Zeigt auf die Steuerungsfunktion für den Arbeitsthread. Der Zeiger kann nicht sein NULL. Diese Funktion muss wie folgt deklariert werden:

UINT __cdecl MyControllingFunction( LPVOID pParam );

pThreadClass
Das RUNTIME_CLASS objekt, das von CWinThread.

pParam
Parameter, der an die Steuerungsfunktion übergeben werden soll.

nPriority
Die Priorität, die für den Thread festgelegt werden soll. Eine vollständige Liste und Beschreibung der verfügbaren Prioritäten finden Sie im SetThreadPriority Windows SDK.

nStackSize
Gibt die Stapelgröße für den neuen Thread in Bytes an. Mit dem Wert 0 wird die Stapelgröße standardmäßig so groß wie die des erstellenden Threads.

dwCreateFlags
Gibt ein zusätzliches Flag an, das die Erstellung des Threads steuert. Dieses Flag kann einen von zwei Werten enthalten:

  • CREATE_SUSPENDED Starten Sie den Thread mit einer Anhalteanzahl von 1. Verwenden Sie diese Eigenschaft CREATE_SUSPENDED , wenn Sie Memberdaten des CWinThread Objekts initialisieren möchten, z m_bAutoDelete . B. elemente der abgeleiteten Klasse, bevor der Thread gestartet wird. Nach Abschluss der Initialisierung können Sie CWinThread::ResumeThread den Thread starten. Der Thread wird erst ausgeführt, wenn CWinThread::ResumeThread er aufgerufen wird.

  • 0 Starten Sie den Thread unmittelbar nach der Erstellung.

lpSecurityAttrs
Verweist auf eine SECURITY_ATTRIBUTES Struktur, die die Sicherheitsattribute für den Thread angibt. Wenn NULLdie gleichen Sicherheitsattribute wie der Erstellungsthread verwendet werden. Weitere Informationen zu dieser Struktur finden Sie im Windows SDK.

Rückgabewert

Zeigen Sie auf das neu erstellte Threadobjekt, oder NULL wenn ein Fehler auftritt.

Hinweise

Mit der ersten Form von AfxBeginThread wird ein Arbeitsthread erstellt. Mit der zweiten Form wird ein Thread erstellt, der als Benutzeroberflächenthread oder als Arbeitsthread dienen kann.

AfxBeginThread erstellt ein neues CWinThread Objekt, ruft seine CreateThread Funktion auf, um mit der Ausführung des Threads zu beginnen, und gibt einen Zeiger auf den Thread zurück. Während der gesamten Prozedur wird überprüft, ob alle Objekte ordnungsgemäß freigegeben werden, falls ein Teil des Erstellungsprozesses fehlschlagen sollte. Um den Thread zu beenden, rufen Sie innerhalb des Threads auf AfxEndThread , oder kehren Sie von der Steuerungsfunktion des Arbeitsthreads zurück.

Multithreading muss durch die Anwendung aktiviert werden, andernfalls erzeugt diese Funktion einen Fehler. Weitere Informationen zum Aktivieren von Multithreading finden Sie unter /MD, , /MT( /LD Verwenden der Laufzeitbibliothek).

Weitere Informationen AfxBeginThreadfinden Sie in den Artikeln Multithreading: Erstellen von Arbeitsthreads und Multithreading: Erstellen von Benutzeroberflächenthreads.

Beispiel

Sehen Sie sich das Beispiel für CSocket::Attach.

Anforderungen

Kopfzeileafxwin.h

AfxContextMenuManager

Zeigen Sie auf den globalen Kontextmenü-Manager.

Syntax

CContextMenuManager* afxContextMenuManager;

Requirements (Anforderungen)

Headerafxcontextmenumanager.h:

AfxEndThread

Rufen Sie diese Funktion auf, um den aktuell ausgeführten Thread zu beenden.

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

Parameter

nExitCode
Gibt den Beendigungscode des Threads an.

bDelete
Löscht das Threadobjekt aus dem Arbeitsspeicher.

Hinweise

Muss innerhalb des Threads aufgerufen werden, um beendet zu werden.

Weitere Informationen AfxEndThreadfinden Sie im Artikel Multithreading: Beenden von Threads.

Anforderungen

Kopfzeileafxwin.h

AfxFindResourceHandle

Wird AfxFindResourceHandle verwendet, um die Ressourcenkette zu durchlaufen und eine bestimmte Ressource nach Ressourcen-ID und Ressourcentyp zu suchen.

Syntax

HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName,  LPCTSTR lpszType );

Parameter

lpszName
Ein Zeiger auf eine Zeichenfolge, die die Ressourcen-ID enthält. lpszType
Ein Zeiger auf den Ressourcentyp. Eine Liste der Ressourcentypen finden Sie im FindResource Windows SDK.

Rückgabewert

Ein Handle für das Modul, das die Ressource enthält.

Hinweise

AfxFindResourceHandle findet die spezifische Ressource und gibt ein Handle an das Modul zurück, das die Ressource enthält. Die Ressource befindet sich möglicherweise in einer beliebigen MFC-Erweiterungs-DLL, die geladen wird. AfxFindResourceHandle teilt Ihnen mit, welche Ressource sie hat.

Die Module werden in dieser Reihenfolge durchsucht:

  1. Das Standard Modul, wenn es sich um eine MFC-Erweiterungs-DLL handelt.

  2. Nicht-Systemmodule.

  3. Sprachspezifische Module.

  4. Das Standard Modul, wenn es sich um eine System-DLL handelt.

  5. Systemmodule.

Anforderungen

Headerafxwin.h:

AfxFreeLibrary

Sowohl als AfxFreeLibraryAfxLoadLibrary auch Standard eine Verweisanzahl für jedes geladene Bibliotheksmodul enthalten.

BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);

Parameter

hInstLib
Ein Handle des geladenen Bibliotheksmoduls. AfxLoadLibrary gibt dieses Handle zurück.

Rückgabewert

TRUEwenn die Funktion erfolgreich ist; andernfalls . FALSE

Hinweise

AfxFreeLibrary erhöht die Referenzanzahl des geladenen DLL-Moduls (Dynamic Link Library). Wenn die Referenzanzahl null erreicht, wird das Modul aus dem Adressraum des aufrufenden Prozesses nicht zugeordnet, und der Handle ist nicht mehr gültig. Diese Verweisanzahl wird jedes Mal erhöht, wenn AfxLoadLibrary sie aufgerufen wird.

Vor dem Aufheben der Zuordnung eines Bibliotheksmoduls ermöglicht es dem System, die DLL von den prozessen zu trennen, die es verwenden. Dadurch bietet die DLL die Möglichkeit, Ressourcen zu sauber, die dem aktuellen Prozess zugeordnet sind. Nachdem die Einstiegspunktfunktion zurückgegeben wurde, wird das Bibliotheksmodul aus dem Adressraum des aktuellen Prozesses entfernt.

Dient AfxLoadLibrary zum Zuordnen eines DLL-Moduls.

AfxFreeLibrary Verwenden Sie unbedingt und AfxLoadLibrary (anstelle der Win32-Funktionen FreeLibrary und LoadLibrary), wenn Ihre Anwendung mehrere Threads verwendet. Die Verwendung AfxLoadLibrary und AfxFreeLibrary stellt sicher, dass der Start- und Herunterfahren-Code, der ausgeführt wird, wenn die MFC-Erweiterungs-DLL geladen und entladen wird, den globalen MFC-Zustand nicht beschädigt.

Beispiel

Sehen Sie sich das Beispiel für AfxLoadLibrary.

Anforderungen

Kopfzeileafxdll_.h

AfxGetApp

Der von dieser Funktion zurückgegebene Zeiger kann verwendet werden, um auf Anwendungsinformationen wie den Standard Nachrichtenverteilercode oder das oberste Fenster zuzugreifen.

CWinApp* AFXAPI AfxGetApp();

Rückgabewert

Ein Zeiger auf das einzelne CWinApp Objekt für die Anwendung.

Hinweise

Wenn diese Methode zurückgegeben wirdNULL, kann dies darauf hindeuten, dass die Anwendung Standard Fenster noch nicht vollständig initialisiert wurde. Es kann auch auf ein Problem hinweisen.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxGetAppName

Die zurückgegebene Zeichenfolge kann für Diagnosenachrichten oder als Stamm für temporäre Zeichenfolgennamen verwendet werden.

LPCTSTR AFXAPI AfxGetAppName();

Rückgabewert

Eine mit Null beendete Zeichenfolge, die den Namen der Anwendung enthält.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxGetInstanceHandle

Mit dieser Funktion können Sie das Instanzhandle der aktuellen Anwendung abrufen.

HINSTANCE  AFXAPI AfxGetInstanceHandle();

Rückgabewert

An HINSTANCE der aktuellen Instanz der Anwendung. Wenn von einer dll aufgerufen wird, die mit der USRDLL-Version von MFC verknüpft ist, wird eine HINSTANCE an die DLL zurückgegeben.

Hinweise

AfxGetInstanceHandle gibt immer die HINSTANCE ausführbare Datei (.EXE) zurück, es sei denn, sie wird aus einer DLL aufgerufen, die mit der USRDLL-Version von MFC verknüpft ist. In diesem Fall wird eine HINSTANCE an die DLL zurückgegeben.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxGetMainWnd

Wenn Ihre Anwendung ein OLE-Server ist, rufen Sie diese Funktion auf, um einen Zeiger auf das aktive Standard Fenster der Anwendung abzurufen. Verwenden Sie dieses Ergebnis, anstatt direkt auf das m_pMainWnd Element des Anwendungsobjekts zu verweisen.

CWnd* AFXAPI AfxGetMainWnd();

Rückgabewert

Gibt einen Zeiger auf das Framefensterobjekt zurück, das das direkte aktive Dokument enthält, wenn der Server über ein Objekt verfügt, das innerhalb eines aktiven Containers aktiv ist.

Wenn kein Objekt vorhanden ist, das in einem Container aktiv ist oder Ihre Anwendung kein OLE-Server ist, gibt diese Funktion das m_pMainWnd Anwendungsobjekt zurück.

Wenn AfxGetMainWnd vom primären Thread der Anwendung aufgerufen wird, wird das Hauptfenster der Anwendung gemäß den oben genannten Regeln zurückgegeben. Wenn die Funktion von einem sekundären Thread in der Anwendung aufgerufen wird, gibt die Funktion das Hauptfenster zurück, das dem aufrufenden Thread zugeordnet ist.

Hinweise

Wenn Ihre Anwendung kein OLE-Server ist, entspricht der Aufruf dieser Funktion dem direkten Verweisen auf das m_pMainWnd Element Ihres Anwendungsobjekts.

Beispiel

//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);

Anforderungen

Kopfzeileafxwin.h

AfxGetPerUserRegistration

Verwenden Sie diese Funktion, um zu bestimmen, ob die Anwendung den Registrierungszugriff auf den HKEY_CURRENT_USER Knoten (HKCU) umleitet.

BOOL AFXAPI AfxGetPerUserRegistration();

Rückgabewert

TRUE gibt an, dass die Registrierungsinformationen an den HKCU Knoten weitergeleitet werden. FALSE gibt an, dass die Anwendung Registrierungsinformationen in den Standardknoten schreibt. Der Standardknoten ist HKEY_CLASSES_ROOT (HKCR).

Hinweise

Wenn Sie die Registrierungsumleitung aktivieren, leitet das Framework den Zugriff von HKCR zu HKEY_CURRENT_USER\Software\Classes. Nur die MFC- und ATL-Frameworks sind von der Umleitung betroffen.

Um zu ändern, ob die Anwendung den Registrierungszugriff umleitet, verwenden Sie AfxSetPerUserRegistration.

Anforderungen

Kopfzeileafxstat_.h

AfxGetResourceHandle

Verwenden Sie das HINSTANCE von dieser Funktion zurückgegebene Handle, um direkt auf die Ressourcen der Anwendung zuzugreifen, z. B. in Aufrufen der Windows-Funktion FindResource.

extern HINSTANCE  AfxGetResourceHandle();

Rückgabewert

Ein HINSTANCE Handle, bei dem die Standardressourcen der Anwendung geladen werden.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxGetThread

Rufen Sie diese Funktion auf, um einen Zeiger auf das Objekt abzurufen, das CWinThread den aktuell ausgeführten Thread darstellt.

CWinThread* AfxGetThread();

Rückgabewert

Zeiger auf den derzeit ausgeführten Thread; andernfalls NULL.

Hinweise

Muss innerhalb des Threads aufgerufen werden.

Hinweis

Wenn Sie ein MFC-Projekt portieren, das von Visual C++-Versionen 4.2, 5.0 oder 6.0 aufgerufen AfxGetThread wird, wird aufgerufenAfxGetApp, AfxGetThread wenn kein Thread gefunden wird. Gibt in neueren Versionen des Compilers zurückNULL, AfxGetThread wenn kein Thread gefunden wurde. Wenn Sie den Anwendungsthread benötigen, müssen Sie aufrufen AfxGetApp.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxInitRichEdit

Rufen Sie diese Funktion auf, um das Rich Edit-Steuerelement (Version 1.0) für die Anwendung zu initialisieren.

BOOL AFXAPI AfxInitRichEdit();

Hinweise

Diese Funktion wird aus Gründen der Abwärtskompatibilität bereitgestellt. Neue Anwendungen sollten verwendet werden AfxInitRichEdit2.

AfxInitRichEdit wird geladen RICHED32.DLL , um Version 1.0 des Rich-Edit-Steuerelements zu initialisieren. Um Version 2.0 und 3.0 des Rich Edit-Steuerelements zu verwenden, RICHED20.DLL muss geladen werden. Sie wird geladen, indem Sie einen Anruf tätigen AfxInitRichEdit2.

Um Rich-Edit-Steuerelemente in vorhandenen Visual C++-Anwendungen auf Version 2.0 zu aktualisieren, öffnen Sie die . RC-Datei als Text, ändern Sie den Klassennamen jedes Rich-Edit-Steuerelements von "RICHEDIT" in "RichEdit20a". Ersetzen Sie dann den Anruf AfxInitRichEdit durch AfxInitRichEdit2.

Diese Funktion initialisiert auch die allgemeine Steuerelementbibliothek, wenn die Bibliothek noch nicht für den Prozess initialisiert wurde. Wenn Sie das Rich-Edit-Steuerelement direkt aus Ihrer MFC-Anwendung verwenden, rufen Sie diese Funktion auf, um sicherzustellen, dass MFC die Rich Edit Control Runtime ordnungsgemäß initialisiert hat. Wenn Sie die Create Methode von CRichEditCtrl, CRichEditView, oder CRichEditDoc, aufrufen, müssen Sie diese Funktion in der Regel nicht aufrufen, aber in einigen Fällen kann es erforderlich sein.

Anforderungen

Kopfzeileafxwin.h

AfxInitRichEdit2

Rufen Sie diese Funktion auf, um das Rich Edit-Steuerelement (Version 2.0 und höher) für die Anwendung zu initialisieren.

BOOL AFXAPI AfxInitRichEdit2();

Hinweise

Rufen Sie diese Funktion auf, um die RICHED20.DLL Version 2.0 des Rich-Edit-Steuerelements zu laden und zu initialisieren. Wenn Sie die Create Methode von CRichEditCtrl, CRichEditView, oder CRichEditDoc, aufrufen, müssen Sie diese Funktion in der Regel nicht aufrufen, aber in einigen Fällen kann es erforderlich sein.

Anforderungen

Kopfzeileafxwin.h

AfxIsExtendedFrameClass

Bestimmt, ob das jeweilige Fenster ein erweitertes Rahmenobjekt ist.

Syntax

BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );

Parameter

pWnd
[in] Ein Zeiger auf ein Objekt, das von CWnd.

Rückgabewert

TRUE wenn das angegebene Fenster ein erweitertes Frameobjekt ist; andernfalls FALSE.

Hinweise

Diese Methode gibt TRUE zurück, wenn pWnd von einer der folgenden Klassen abgeleitet ist:

  • CFrameWndEx

  • CMDIFrameWndEx

  • COleIPFrameWndEx

  • COleDocIPFrameWndEx

  • CMDIChildWndEx

Diese Methode ist nützlich, wenn Sie überprüfen müssen, ob ein Funktions- oder Methodenparameter ein erweitertes Rahmenfenster ist.

Anforderungen

Headerafxpriv.h:

AfxIsMFCToolBar

Bestimmt, ob das angegebene Fenster ein Symbolleistenobjekt ist.

Syntax

BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);

Parameter

pWnd
[in] Ein Zeiger auf ein Objekt, das von CWnd.

Rückgabewert

TRUE wenn das angegebene Fenster ein Symbolleistenobjekt ist; andernfalls FALSE.

Hinweise

Diese Methode gibt zurück TRUE , wenn pWnd sie von CMFCToolBar. Diese Methode ist nützlich, wenn Sie überprüfen müssen, ob es sich bei einem Funktions- oder Methodenparameter um ein CMFCToolBar Objekt handelt.

Anforderungen

Headerafxpriv.h:

AfxKeyboardManager

Zeigen Sie auf den globalen Tastatur-Manager.

Syntax

CKeyboardManager* afxKeyboardManager;

Requirements (Anforderungen)

Headerafxkeyboardmanager.h:

AfxLoadLibrary

Dient AfxLoadLibrary zum Zuordnen eines DLL-Moduls.

HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);

Parameter

lpszModuleName
Verweist auf eine mit Null beendete Zeichenfolge, die den Namen des Moduls (entweder eine DLL- oder EXE-Datei) enthält. Der angegebene Name ist der Dateiname des Moduls.

Wenn die Zeichenfolge einen Pfad angibt, die Datei aber nicht im angegebenen Verzeichnis vorhanden ist, schlägt die Funktion fehl.

Wenn kein Pfad angegeben ist und die Dateinamenerweiterung nicht angegeben wird, wird die STANDARDerweiterung .DLL angefügt. Die Dateinamenzeichenfolge kann jedoch ein nachfolgendes Punktzeichen (.) enthalten, um anzugeben, dass der Modulname keine Erweiterung hat. Wenn kein Pfad angegeben ist, verwendet die Funktion die Suchreihenfolge für Desktopanwendungen.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für das Modul. Bei Einem Fehler lautet NULLder Rückgabewert .

Hinweise

Es gibt ein Handle zurück, das verwendet GetProcAddress werden kann, um die Adresse einer DLL-Funktion abzurufen. AfxLoadLibrary kann auch verwendet werden, um andere ausführbare Module zuzuordnen.

Jeder Prozess Standard eine Referenzanzahl für jedes geladene Bibliotheksmodul enthält. Diese Bezugsanzahl wird jedes Mal erhöht, wenn AfxLoadLibrary sie aufgerufen wird und jedes Mal AfxFreeLibrary erhöht wird, wenn sie aufgerufen wird. Wenn die Referenzanzahl null erreicht, wird das Modul aus dem Adressraum des aufrufenden Prozesses nicht zugeordnet, und der Handle ist nicht mehr gültig.

AfxLoadLibrary Verwenden Sie unbedingt und AfxFreeLibrary (anstelle der Win32-Funktionen LoadLibrary und FreeLibrary), wenn Ihre Anwendung mehrere Threads verwendet, und wenn sie dynamisch eine MFC-Erweiterungs-DLL lädt. Die Verwendung AfxLoadLibrary und AfxFreeLibrary stellt sicher, dass der Start- und Herunterfahren-Code, der ausgeführt wird, wenn die MFC-Erweiterungs-DLL geladen und entladen wird, den globalen MFC-Zustand nicht beschädigt.

Die Verwendung AfxLoadLibrary in einer Anwendung erfordert, dass Sie dynamisch eine Verknüpfung mit der DLL-Version von MFC herstellen. Die Headerdatei für AfxLoadLibrary, Afxdll_.hist nur enthalten, wenn MFC mit der Anwendung als DLL verknüpft ist. Diese Anforderung ist entwurfsbedingt, da Sie eine Verknüpfung mit der DLL-Version von MFC herstellen müssen, um MFC-Erweiterungs-DLLs zu verwenden oder zu erstellen.

Beispiel

// 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();
}

Anforderungen

Kopfzeileafxdll_.h

AfxLoadLibraryEx

Dient AfxLoadLibraryEx zum Zuordnen eines DLL-Moduls.

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

Parameter

lpFileName
Verweist auf eine mit Null beendete Zeichenfolge, die den Namen des Moduls (entweder eine DLL- oder EXE-Datei) enthält. Der angegebene Name ist der Dateiname des Moduls.

Wenn die Zeichenfolge einen Pfad angibt, die Datei aber nicht im angegebenen Verzeichnis vorhanden ist, schlägt die Funktion fehl.

Wenn kein Pfad angegeben ist und die Dateinamenerweiterung nicht angegeben wird, wird die STANDARDerweiterung .DLL angefügt. Die Dateinamenzeichenfolge kann jedoch ein nachfolgendes Punktzeichen (.) enthalten, um anzugeben, dass der Modulname keine Erweiterung hat. Wenn kein Pfad angegeben ist, verwendet die Funktion die Suchreihenfolge für Desktopanwendungen.

hFile
Dieser Parameter ist für die zukünftige Verwendung reserviert. Es muss sein NULL.

dwFlags
Die Aktion, die beim Laden des Moduls ausgeführt werden soll. Wenn keine Kennzeichnungen angegeben werden, ist das Verhalten dieser Funktion identisch mit der AfxLoadLibrary Funktion. Die möglichen Werte dieses Parameters werden in der LoadLibraryEx Dokumentation beschrieben.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für das Modul. Bei Einem Fehler lautet NULLder Rückgabewert .

Hinweise

AfxLoadLibraryEx gibt ein Handle zurück, das verwendet GetProcAddress werden kann, um die Adresse einer DLL-Funktion abzurufen. AfxLoadLibraryEx kann auch verwendet werden, um andere ausführbare Module zuzuordnen.

Jeder Prozess Standard eine Referenzanzahl für jedes geladene Bibliotheksmodul enthält. Diese Bezugsanzahl wird jedes Mal erhöht, wenn AfxLoadLibraryEx sie aufgerufen wird und jedes Mal AfxFreeLibrary erhöht wird, wenn sie aufgerufen wird. Wenn die Referenzanzahl null erreicht, wird das Modul aus dem Adressraum des aufrufenden Prozesses nicht zugeordnet, und der Handle ist nicht mehr gültig.

AfxLoadLibraryEx Verwenden Sie unbedingt und AfxFreeLibrary (anstelle der Win32-Funktionen LoadLibraryEx und FreeLibrary), wenn Ihre Anwendung mehrere Threads verwendet und wenn sie eine MFC-Erweiterungs-DLL dynamisch lädt. Die Verwendung AfxLoadLibraryEx und AfxFreeLibrary stellt sicher, dass der Start- und Herunterfahren-Code, der ausgeführt wird, wenn die MFC-Erweiterungs-DLL geladen und entladen wird, den globalen MFC-Zustand nicht beschädigt.

Die Verwendung AfxLoadLibraryEx in einer Anwendung erfordert, dass Sie dynamisch eine Verknüpfung mit der DLL-Version von MFC herstellen. Die Headerdatei für AfxLoadLibraryEx, Afxdll_.hist nur enthalten, wenn MFC mit der Anwendung als DLL verknüpft ist. Diese Anforderung ist entwurfsbedingt, da Sie eine Verknüpfung mit der DLL-Version von MFC herstellen müssen, um MFC-Erweiterungs-DLLs zu verwenden oder zu erstellen.

Anforderungen

Kopfzeileafxdll_.h

AfxMenuTearOffManager

Zeigen Sie auf den globalen Menü-Manager zum Abreißen.

Syntax

CMenuTearOffManager* g_pTearOffMenuManager;

Requirements (Anforderungen)

Headerafxmenutearoffmanager.h:

AfxMouseManager

Zeigen Sie auf den globalen Maus-Manager.

Syntax

CMouseManager* afxMouseManager;

Requirements (Anforderungen)

Headerafxmousemanager.h:

AfxRegisterClass

Verwenden Sie diese Funktion, um Fensterklassen in einer DLL zu registrieren, die MFC verwendet.

BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);

Parameter

lpWndClass
Zeigen Sie auf eine WNDCLASS Struktur, die Informationen zur zu registrierenden Fensterklasse enthält. Weitere Informationen zu dieser Struktur finden Sie im Windows SDK.

Rückgabewert

TRUE wenn die Klasse erfolgreich registriert wurde; andernfalls FALSE.

Hinweise

Wenn Sie diese Funktion verwenden, wird die Registrierung der Klasse automatisch aufgehoben, wenn die DLL entladen wird.

In Nicht-DLL-Builds wird der AfxRegisterClass Bezeichner als Makro definiert, das der Windows-Funktion RegisterClasszugeordnet ist, da Klassen, die in einer Anwendung registriert sind, automatisch nicht registriert werden. Wenn Sie anstelle dessen RegisterClassverwendenAfxRegisterClass, kann Ihr Code sowohl in einer Anwendung als auch in einer DLL ohne Änderung verwendet werden.

Beispiel

// 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");
}

Anforderungen

Kopfzeileafxwin.h

AfxRegisterWndClass

Ermöglicht es Ihnen, Ihre eigenen Fensterklassen zu registrieren.

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

Parameter

nClassStyle
Gibt den Windows-Klassenstil oder die Kombination von Formatvorlagen an, die mit dem Bitwise-OR (|)-Operator für die Fensterklasse erstellt werden. Eine Liste der Klassenstile finden Sie in der WNDCLASS Struktur im Windows SDK. Wenn NULL, werden die Standardwerte wie folgt festgelegt:

  • Legt die Mausart fest , CS_DBLCLKSdie Doppelklicknachrichten an die Fensterprozedur sendet, wenn der Benutzer auf die Maus doppelklickt.

  • Legt die Pfeilcursorformatvorlage auf den Windows-Standard IDC_ARROWfest.

  • Legt den Hintergrundpinsel auf NULLfest, sodass das Fenster den Hintergrund nicht löscht.

  • Legt das Symbol auf das Standardmäßige Windows-Logosymbol mit waving-Flag fest.

hCursor
Gibt ein Handle für die Cursorressource an, die in jedem Fenster installiert werden soll, das aus der Fensterklasse erstellt wird. Wenn Sie den Standardwert von 0 verwenden, erhalten Sie den Standardcursor IDC_ARROW .

hbrBackground
Gibt ein Handle für die Pinselressource an, die in jedem Fenster installiert werden soll, das aus der Fensterklasse erstellt wird. Wenn Sie den Standardwert von 0 verwenden, verfügen Sie über einen NULL Hintergrundpinsel, und standardmäßig wird der Hintergrund im Fenster während der Verarbeitung WM_ERASEBKGNDnicht gelöscht.

hIcon
Gibt ein Handle für die Symbolressource an, die in jedem Fenster installiert werden soll, das aus der Fensterklasse erstellt wird. Wenn Sie die Standardeinstellung " 0" verwenden, erhalten Sie das Standardmäßige Windows-Logosymbol mit waving-Flag.

Rückgabewert

Eine mit Null beendete Zeichenfolge, die den Klassennamen enthält. Sie können diesen Klassennamen an die Create Memberfunktion in CWnd oder andereCWnd- ****abgeleitete Klassen übergeben, um ein Fenster zu erstellen. Der Name wird von der Microsoft Foundation Class Library generiert.

Hinweis

Der Rückgabewert ist ein Zeiger auf einen statischen Puffer. Um diese Zeichenfolge zu speichern, weisen Sie sie einer CString Variablen zu.

Hinweise

Die Microsoft Foundation-Klassenbibliothek registriert automatisch mehrere Standardfensterklassen für Sie. Rufen Sie diese Funktion auf, wenn Sie Ihre eigenen Fensterklassen registrieren möchten.

Der für eine Klasse registrierte Name hängt ausschließlich von AfxRegisterWndClass den Parametern ab. Wenn Sie mehrere Male mit identischen Parametern aufrufen AfxRegisterWndClass , registriert sie nur eine Klasse für den ersten Aufruf. Spätere Aufrufe AfxRegisterWndClass mit identischen Parametern geben den bereits registrierten Klassennamen zurück.

Wenn Sie mehrere CWndabgeleitete Klassen mit identischen Parametern aufrufenAfxRegisterWndClass, statt eine separate Fensterklasse für jede Klasse abzurufen, teilt jede Klasse dieselbe Fensterklasse. Diese Freigabe kann Probleme verursachen, wenn die CS_CLASSDC Klassenformatvorlage verwendet wird. Anstelle mehrerer CS_CLASSDC Fensterklassen haben Sie nur eine CS_CLASSDC Fensterklasse. Alle C++-Fenster, die diese Klasse verwenden, verwenden denselben DC. Um dieses Problem zu vermeiden, rufen Sie AfxRegisterClass auf, um die Klasse zu registrieren.

Weitere Informationen zur Fensterklassenregistrierung und zur AfxRegisterWndClass Funktion finden Sie im Technischen Hinweis TN001: Window Class Registration.

Beispiel

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();
}

Anforderungen

Kopfzeileafxwin.h

AfxSetPerUserRegistration

Legt fest, ob die Anwendung den Registrierungszugriff auf den HKEY_CURRENT_USER (HKCU) Knoten umleitet.

void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);

Parameter

bEnable
[in] TRUE gibt an, dass die Registrierungsinformationen an den HKCU Knoten weitergeleitet werden. FALSE gibt an, dass die Anwendung Registrierungsinformationen in den Standardknoten schreibt. Der Standardknoten ist HKEY_CLASSES_ROOT (HKCR).

Hinweise

Vor Windows Vista verwendeten Anwendungen, die häufig auf die Registrierung zugegriffen haben, den HKEY_CLASSES_ROOT Knoten. Bei Windows Vista oder höheren Betriebssystemen müssen Sie jedoch eine Anwendung im Modus mit erhöhten Rechten ausführen, um zu HKCRschreiben.

Mit dieser Methode kann Ihre Anwendung die Registrierung lesen und schreiben, ohne im Modus mit erhöhten Rechten ausgeführt zu werden. Es funktioniert durch Umleiten des Registrierungszugriffs von HKCR zu HKCU. Weitere Informationen finden Sie unter Linker Property Pages.

Wenn Sie die Registrierungsumleitung aktivieren, leitet das Framework den Zugriff von HKCR zu HKEY_CURRENT_USER\Software\Classes. Nur die MFC- und ATL-Frameworks sind von der Umleitung betroffen.

Die Standardimplementierung greift auf die Registrierung unter HKCR.

Anforderungen

Kopfzeileafxstat_.h

AfxSetResourceHandle

Verwenden Sie diese Funktion, um das HINSTANCE Handle festzulegen, das bestimmt, wo die Standardressourcen der Anwendung geladen werden.

void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);

Parameter

hInstResource
Die Instanz oder das Modul behandeln eine EXE- oder DLL-Datei, aus der die Ressourcen der Anwendung geladen werden.

Beispiel

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

Anforderungen

Kopfzeileafxwin.h

AfxShellManager

Zeigen Sie auf den globalen Shell-Manager.

Syntax

CShellManager* afxShellManager;

Requirements (Anforderungen)

Headerafxshellmanager.h:

AfxSocketInit

Rufen Sie diese Funktion in Ihrer CWinApp::InitInstance Außerkraftsetzung auf, um Windows Sockets zu initialisieren.

BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);

Parameter

lpwsaData
Ein Zeiger auf eine WSADATA Struktur. Wenn lpwsaData nicht gleich NULL, wird die Adresse der WSADATA Struktur durch den Aufruf von WSAStartup. Diese Funktion stellt außerdem sicher, dass sie WSACleanup vor dem Beenden der Anwendung aufgerufen wird.

Rückgabewert

Ist ungleich null (0), wenn die Funktion erfolgreich ausgeführt wird, andernfalls null (0).

Hinweise

Wenn Sie MFC-Sockets in sekundären Threads in einer statisch verknüpften MFC-Anwendung verwenden, müssen Sie in jedem Thread aufrufen AfxSocketInit , der Sockets zum Initialisieren der Socketbibliotheken verwendet. Standardmäßig AfxSocketInit wird nur im primären Thread aufgerufen.

Anforderungen

Kopfzeileafxsock.h

AfxUserToolsManager

Zeigen Sie auf den Manager für globale Benutzertools.

Syntax

CUserToolsManager* afxUserToolsManager;

Requirements (Anforderungen)

Headerafxusertoolsmanager.h:

AfxWinInit

Diese Funktion wird von der MFC-bereitgestellten WinMain Funktion als Teil der CWinApp Initialisierung einer GUI-basierten Anwendung aufgerufen, um MFC zu initialisieren.

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

Parameter

hInstance
Das Handle des derzeit ausgeführten Moduls.

hPrevInstance
Ein Handle zu einer vorherigen Instanz der Anwendung. Bei einer Win32-basierten Anwendung ist dieser Parameter immer NULL.

lpCmdLine
Verweist auf eine mit Null beendete Zeichenfolge, die die Befehlszeile für die Anwendung angibt.

nCmdShow
Gibt an, wie das Standard Fenster einer GUI-Anwendung angezeigt wird.

Hinweise

Für eine Konsolenanwendung, die die von MFC bereitgestellte WinMain Funktion nicht verwendet, müssen Sie direkt aufrufen AfxWinInit , um MFC zu initialisieren.

Wenn Sie sich selbst aufrufen AfxWinInit , sollten Sie eine Instanz einer CWinApp Klasse deklarieren. Bei einer Konsolenanwendung können Sie ihre eigene Klasse CWinApp nicht ableiten und stattdessen eine Instanz direkt CWinApp verwenden. Diese Technik ist geeignet, wenn Sie sich entschließen, alle Funktionen für Ihre Anwendung in Ihrer Implementierung mainzu belassen.

Hinweis

Wenn ein Aktivierungskontext für eine Assembly erstellt wird, verwendet MFC eine Manifestressource, die vom Benutzermodul bereitgestellt wird. Der Aktivierungskontext wird in AfxWinInit. Weitere Informationen finden Sie unter Unterstützung für Aktivierungskontexte im MFC-Modulstatus.

Beispiel

#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;
}

Anforderungen

Kopfzeileafxwin.h

Siehe auch

Makros und Globalen
CWinApp Klasse
CContextMenuManager Klasse
CWnd Klasse
CFrameWndEx Klasse
CMFCToolBar Klasse
CKeyboardManager Klasse
CMenuTearOffManager Klasse
CMouseManager Klasse
CShellManager Klasse
CUserToolsManager Klasse