次の方法で共有


アプリケーションの情報と管理

アプリケーションを記述するときは、 CWinApp派生オブジェクトを 1 つ作成します。 場合によっては、 CWinApp派生オブジェクトの外部からこのオブジェクトに関する情報を取得できます。 または、他のグローバル "マネージャー" オブジェクトへのアクセスが必要な場合があります。

Microsoft Foundation クラス ライブラリには、これらのタスクの実行に役立つ次のグローバル関数が用意されています。

アプリケーション情報と管理機能

名前 説明
AfxBeginThread 新しいスレッドを作成します。
AfxContextMenuManager グローバル context メニュー マネージャーへのポインター
AfxEndThread 現在のスレッドを終了します。
AfxFindResourceHandle リソース チェーンをウォークし、リソース ID とリソースの種類別に特定のリソースを見つけます。
AfxFreeLibrary 読み込まれたダイナミック リンク ライブラリ (DLL) モジュールの参照カウントをデクリメントします。 参照カウントが 0 に達すると、モジュールはマップ解除されます。
AfxGetApp アプリケーションの単一の CWinApp オブジェクトへのポインターを返します。
AfxGetAppName アプリケーションの名前を含む文字列を返します。
AfxGetInstanceHandle アプリケーションのこのインスタンスを表す HINSTANCE を返します。
AfxGetMainWnd OLE 以外のアプリケーションの現在の "メイン" ウィンドウ、またはサーバー アプリケーションのインプレース フレーム ウィンドウへのポインターを返します。
AfxGetPerUserRegistration この関数を使用して、アプリケーションがレジストリ アクセスを HKEY_CURRENT_USER (HKCU) ノードにリダイレクトするかどうかを確認します。
AfxGetResourceHandle アプリケーションの既定のリソースのソースに HINSTANCE を返します。 アプリケーションのリソースに直接アクセスするために使用します。
AfxGetThread 現在の CWinThread オブジェクトへのポインターを取得します。
AfxInitRichEdit アプリケーションのバージョン 1.0 リッチ エディット コントロールを初期化します。
AfxInitRichEdit2 アプリケーションのバージョン 2.0 以降のリッチ エディット コントロールを初期化します。
AfxIsExtendedFrameClass 指定されたウィンドウが拡張フレーム オブジェクトかどうかを確認します。
AfxIsMFCToolBar 指定されたウィンドウがツール バー オブジェクトであるかどうかを判断します。
AfxKeyboardManager グローバル keyboard マネージャーへのポインター
AfxLoadLibrary DLL モジュールをマップし、DLL 関数のアドレスを取得するために使用できるハンドルを返します。
AfxLoadLibraryEx 指定したオプションを使用して DLL モジュールをマップし、DLL 関数のアドレスを取得するために使用できるハンドルを返します。
AfxMenuTearOffManager グローバル tear-off メニュー マネージャーへのポインター
AfxMouseManager グローバル マネージャーへのポインター
AfxRegisterClass MFC を使用する DLL にウィンドウ クラスを登録します。
AfxRegisterWndClass MFC によって自動的に登録されたものを補完する Windows ウィンドウ クラスを登録します。
AfxSetPerUserRegistration アプリケーションがレジストリ アクセスを HKEY_CURRENT_USER (HKCU) ノードにリダイレクトするかどうかを設定します。
AfxSetResourceHandle アプリケーションの既定のリソースが読み込まれる場所の HINSTANCE ハンドルを設定します。
AfxShellManager グローバル shell マネージャーへのポインター
AfxSocketInit Windows ソケットを初期化するために、 CWinApp::InitInstance オーバーライドで呼び出されます。
AfxUserToolsManager グローバル ユーザー ツール マネージャーへのポインター
AfxWinInit MFC を初期化するために、GUI ベースのアプリケーションのCWinApp初期化の一環として、MFC 提供のWinMain関数によって呼び出されます。 MFC を使用するコンソール アプリケーションでは、直接呼び出す必要があります。

AfxBeginThread

この関数を呼び出して、新しいスレッドを作成します。

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

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

パラメーター

pfnThreadProc
ワーカー スレッドの制御関数をポイントします。 ポインターを NULLすることはできません。 この関数は次のように宣言する必要があります。

UINT __cdecl MyControllingFunction( LPVOID pParam );

pThreadClass
CWinThreadから派生したオブジェクトのRUNTIME_CLASS

pParam
制御関数に渡すパラメーター。

nPriority
スレッドに設定する優先度。 使用可能な優先順位の完全な一覧と説明については、Windows SDK の SetThreadPriority を参照してください。

nStackSize
新しいスレッドへのスタックのバイト サイズを指定します。 0 である場合、スタック サイズの既定値は、このスレッドを生成するスレッドのスタックと同じサイズです。

dwCreateFlags
スレッドの作成を制御する追加のフラグを指定します。 このフラグは、2 つの値の 1 つを含めることができます。

  • CREATE_SUSPENDED 中断カウントが 1 のスレッドを開始します。 スレッドの実行を開始する前に、m_bAutoDeleteや派生クラスのメンバーなど、CWinThread オブジェクトのメンバー データを初期化する場合は、CREATE_SUSPENDEDを使用します。 初期化が完了したら、 CWinThread::ResumeThread を使用してスレッドの実行を開始します。 スレッドは、 CWinThread::ResumeThread が呼び出されるまで実行されません。

  • 0 作成直後にスレッドを開始します。

lpSecurityAttrs
スレッドのセキュリティ属性を指定する SECURITY_ATTRIBUTES 構造体を指します。 NULL場合、作成スレッドと同じセキュリティ属性が使用されます。 この構造の詳細については、Windows SDK を参照してください。

戻り値

新しく作成されたスレッド オブジェクトへのポインター。エラーが発生した場合は NULL

解説

AfxBeginThread の最初のフォームはワーカー スレッドを作成します。 2 番目のフォームは、ユーザー インターフェイス スレッドまたはワーカー スレッドとして機能可能なスレッドを作成します。

AfxBeginThread は、新しい CWinThread オブジェクトを作成し、その CreateThread 関数を呼び出してスレッドの実行を開始し、スレッドへのポインターを返します。 なんらかの原因でスレッド生成に失敗すると、スレッド生成処理全体をチェックし、すべてのオブジェクトを確実に解放します。 スレッドを終了するには、スレッド内から AfxEndThread を呼び出すか、ワーカー スレッドの制御関数から戻ります。

マルチスレッドは、アプリケーションによって有効化される必要があります。それ以外の場合、この関数は失敗します。 マルチスレッドを有効にする方法の詳細については、「 /MD/MT/LD (ランタイム ライブラリの使用)」を参照してください。

AfxBeginThreadの詳細については、「 Multithreading: Creating Worker Threads and Multithreading: Creating User-Interface Threads」を参照してください。

CSocket::Attach の例を参照してください。

要件

ヘッダー afxwin.h

AfxContextMenuManager

グローバル context メニュー マネージャーへのポインター

構文

CContextMenuManager* afxContextMenuManager;

要件

ヘッダー: afxcontextmenumanager.h

AfxEndThread

現在実行中のスレッドを終了するには、この関数を呼び出します。

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

パラメーター

nExitCode
スレッドの終了コードを指定します。

bDelete
スレッド オブジェクトをメモリから削除します。

解説

終了するには、スレッド内から呼び出す必要があります。

AfxEndThreadの詳細については、「 Multithreading: Terminating Threads」を参照してください。

要件

ヘッダー afxwin.h

AfxFindResourceHandle

AfxFindResourceHandleを使用してリソース チェーンをウォークし、リソース ID とリソースの種類別に特定のリソースを見つけます。

構文

HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName,  LPCTSTR lpszType );

パラメーター

lpszName
リソース ID を含む文字列へのポインター。 lpszType
リソースの種類へのポインター。 リソースの種類の一覧については、Windows SDK の FindResource を参照してください。

戻り値

リソースを含むモジュールへのハンドル。

解説

AfxFindResourceHandle は特定のリソースを検索し、リソースを含むモジュールにハンドルを返します。 リソースは、読み込まれた MFC 拡張 DLL 内にある可能性があります。 AfxFindResourceHandle は、どのリソースが含まれているかを示します。

モジュールは次の順序で検索されます。

  1. メイン モジュール (MFC 拡張 DLL の場合)。

  2. システム以外のモジュール。

  3. 言語固有のモジュール。

  4. メイン モジュール (システム DLL の場合)。

  5. システム モジュール。

要件

ヘッダー: afxwin.h

AfxFreeLibrary

AfxFreeLibraryAfxLoadLibraryの両方で、読み込まれたライブラリ モジュールごとに参照カウントが保持されます。

BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);

パラメーター

hInstLib
読み込まれたライブラリ モジュールのハンドル。 AfxLoadLibrary は、このハンドルを返します。

戻り値

TRUE 関数が成功した場合。それ以外の場合は FALSE

解説

AfxFreeLibrary 読み込まれたダイナミック リンク ライブラリ (DLL) モジュールの参照カウントをデクリメントします。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。 この参照カウントは、 AfxLoadLibrary が呼び出されるたびにインクリメントされます。

ライブラリ モジュールをマップ解除する前に、システムは DLL を使用してプロセスからデタッチできるようにします。 これにより、DLL は現在のプロセスに割り当てられているリソースをクリーンアップできます。 エントリ ポイント関数が戻った後、ライブラリ モジュールは現在のプロセスのアドレス空間から削除されます。

AfxLoadLibraryを使用して DLL モジュールをマップします。

アプリケーションで複数のスレッドを使用する場合は、 AfxFreeLibraryAfxLoadLibrary (Win32 関数の FreeLibraryLoadLibraryの代わりに) を使用してください。 AfxLoadLibraryAfxFreeLibraryを使用すると、MFC 拡張 DLL の読み込みとアンロード時に実行されるスタートアップ コードとシャットダウン コードによってグローバル MFC 状態が破損することはありません。

AfxLoadLibrary の例を参照してください。

要件

ヘッダー afxdll_.h

AfxGetApp

この関数によって返されるポインターは、メイン メッセージ ディスパッチ コードや最上位ウィンドウなどのアプリケーション情報にアクセスするために使用できます。

CWinApp* AFXAPI AfxGetApp();

戻り値

アプリケーションの単一の CWinApp オブジェクトへのポインター。

解説

このメソッドが NULLを返す場合は、アプリケーションのメイン ウィンドウがまだ完全に初期化されていないことを示している可能性があります。 また、問題を示している可能性もあります。

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

要件

ヘッダー afxwin.h

AfxGetAppName

返される文字列は、診断メッセージに使用することも、一時文字列名のルートとして使用することもできます。

LPCTSTR AFXAPI AfxGetAppName();

戻り値

アプリケーションの名前を含む null で終わる文字列。

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

要件

ヘッダー afxwin.h

AfxGetInstanceHandle

この関数を使用すると、現在のアプリケーションのインスタンス ハンドルを取得できます。

HINSTANCE  AFXAPI AfxGetInstanceHandle();

戻り値

アプリケーションの現在のインスタンスへの HINSTANCE 。 USRDLL バージョンの MFC にリンクされている DLL 内から呼び出されると、DLL への HINSTANCE が返されます。

解説

AfxGetInstanceHandle は、MFC の USRDLL バージョンにリンクされた DLL 内から呼び出されない限り、実行可能ファイル (.EXE) の HINSTANCE を常に返します。 この場合、DLL に HINSTANCE が返されます。

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

要件

ヘッダー afxwin.h

AfxGetMainWnd

アプリケーションが OLE サーバーの場合は、この関数を呼び出して、アプリケーションのアクティブなメイン ウィンドウへのポインターを取得します。 アプリケーション オブジェクトの m_pMainWnd メンバーを直接参照する代わりに、この結果を使用します。

CWnd* AFXAPI AfxGetMainWnd();

戻り値

サーバーにアクティブなコンテナー内でインプレース アクティブなオブジェクトがある場合は、インプレース作業中の文書を含むフレーム ウィンドウ オブジェクトへのポインターを返します。

コンテナー内にインプレース アクティブなオブジェクトがない場合、またはアプリケーションが OLE サーバーでない場合、この関数はアプリケーション オブジェクトの m_pMainWnd を返します。

AfxGetMainWnd をアプリケーションのプライマリ スレッドから呼び出した場合は、上記の規則に従ってアプリケーションのメイン ウィンドウを返します。 アプリケーションのセカンダリ スレッドからこの関数を呼び出した場合は、関数は呼び出しを行ったスレッドに関連付けられているメイン ウィンドウを返します。

解説

アプリケーションが OLE サーバーでない場合、この関数を呼び出すことは、アプリケーション オブジェクトの m_pMainWnd メンバーを直接参照することと同じです。

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

要件

ヘッダー afxwin.h

AfxGetPerUserRegistration

この関数を使用して、アプリケーションがレジストリ アクセスを HKEY_CURRENT_USER (HKCU) ノードにリダイレクトするかどうかを確認します。

BOOL AFXAPI AfxGetPerUserRegistration();

戻り値

TRUE は、レジストリ情報が HKCU ノードに転送されていることを示します。 FALSE は、アプリケーションがレジストリ情報を既定のノードに書き込みます。 既定のノードは HKEY_CLASSES_ROOT (HKCR) です。

解説

レジストリ リダイレクトを有効にした場合、フレームワークは HKCR から HKEY_CURRENT_USER\Software\Classesにアクセスをリダイレクトします。 MFC および ATL フレームワークのみがリダイレクトの影響を受ける。

アプリケーションがレジストリ アクセスをリダイレクトするかどうかを変更するには、 AfxSetPerUserRegistrationを使用します。

要件

ヘッダー afxstat_.h

AfxGetResourceHandle

この関数によって返される HINSTANCE ハンドルを使用して、アプリケーションのリソース (Windows 関数 FindResourceの呼び出しなど) に直接アクセスします。

extern HINSTANCE  AfxGetResourceHandle();

戻り値

HINSTANCEは、アプリケーションの既定のリソースが読み込まれる場所を処理します。

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

要件

ヘッダー afxwin.h

AfxGetThread

現在実行中のスレッドを表す CWinThread オブジェクトへのポインターを取得するには、この関数を呼び出します。

CWinThread* AfxGetThread();

戻り値

現在実行中のスレッドへのポインター。それ以外の場合は NULL

解説

スレッド内から呼び出す必要があります。

Note

Visual C++ バージョン 4.2、5.0、または 6.0 から AfxGetThread を呼び出す MFC プロジェクトを移植する場合、スレッドが見つからない場合 AfxGetThread 呼び出し AfxGetApp 。 コンパイラのより新しいバージョンでは、スレッドが見つからなかった場合、 AfxGetThreadNULL を返します。 アプリケーション スレッドが必要な場合は、 AfxGetAppを呼び出す必要があります。

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

要件

ヘッダー afxwin.h

AfxInitRichEdit

この関数を呼び出して、アプリケーションのリッチ エディット コントロール (バージョン 1.0) を初期化します。

BOOL AFXAPI AfxInitRichEdit();

解説

この関数は、下位互換性のために提供されます。 新しいアプリケーションでは、 AfxInitRichEdit2を使用する必要があります。

AfxInitRichEdit は、 RICHED32.DLL を読み込み、リッチ エディット コントロールのバージョン 1.0 を初期化します。 バージョン 2.0 と 3.0 のリッチエディット コントロールを使用するには、 RICHED20.DLL を読み込む必要があります。 AfxInitRichEdit2の呼び出しを行うことで読み込まれます。

既存の Visual C++ アプリケーションのリッチ エディット コントロールをバージョン 2.0 に更新するには、次を開きます。RC ファイルをテキストとして、各リッチ エディット コントロールのクラス名を "RICHEDIT" から "RichEdit20a" に変更します。 次に、 AfxInitRichEdit の呼び出しを AfxInitRichEdit2に置き換えます。

この関数は、ライブラリがまだプロセス用に初期化されていない場合は、共通コントロール ライブラリも初期化します。 MFC アプリケーションからリッチ エディット コントロールを直接使用する場合は、この関数を呼び出して、MFC がリッチ エディット コントロール ランタイムを適切に初期化したことを確認します。 CRichEditCtrlCRichEditView、またはCRichEditDocCreate メソッドを呼び出す場合は、通常、この関数を呼び出す必要はありませんが、必要な場合があります。

要件

ヘッダー afxwin.h

AfxInitRichEdit2

この関数を呼び出して、アプリケーションのリッチ エディット コントロール (バージョン 2.0 以降) を初期化します。

BOOL AFXAPI AfxInitRichEdit2();

解説

この関数を呼び出して RICHED20.DLL を読み込み、リッチ エディット コントロールのバージョン 2.0 を初期化します。 CRichEditCtrlCRichEditView、またはCRichEditDocCreate メソッドを呼び出す場合は、通常、この関数を呼び出す必要はありませんが、必要な場合があります。

要件

ヘッダー afxwin.h

AfxIsExtendedFrameClass

指定されたウィンドウが拡張フレーム オブジェクトかどうかを確認します。

構文

BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );

パラメーター

pWnd
[in] CWndから派生したオブジェクトへのポインター。

戻り値

TRUE 指定されたウィンドウが拡張フレーム オブジェクトの場合。それ以外の場合は FALSE

解説

TRUE が次のいずれかのクラスから派生している場合、このメソッドは pWnd を返します。

  • CFrameWndEx

  • CMDIFrameWndEx

  • COleIPFrameWndEx

  • COleDocIPFrameWndEx

  • CMDIChildWndEx

このメソッドは、関数またはメソッドのパラメーターが拡張フレーム ウィンドウであるかどうかを検証する必要があるときに役立ちます。

要件

ヘッダー: afxpriv.h

AfxIsMFCToolBar

指定されたウィンドウがツール バー オブジェクトであるかどうかを判断します。

構文

BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);

パラメーター

pWnd
[in] CWndから派生したオブジェクトへのポインター。

戻り値

TRUE 指定されたウィンドウがツール バー オブジェクトの場合。それ以外の場合は FALSE

解説

このメソッドは、pWndCMFCToolBarから派生した場合にTRUEを返します。 このメソッドは、関数またはメソッド パラメーターが CMFCToolBar オブジェクトであることを検証する必要がある場合に便利です。

要件

ヘッダー: afxpriv.h

AfxKeyboardManager

グローバル keyboard マネージャーへのポインター

構文

CKeyboardManager* afxKeyboardManager;

要件

ヘッダー: afxkeyboardmanager.h

AfxLoadLibrary

AfxLoadLibraryを使用して DLL モジュールをマップします。

HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);

パラメーター

lpszModuleName
モジュールの名前 (.DLL または .EXE ファイル) を含む null で終わる文字列を指します。 指定された名前はモジュールのファイル名です。

文字列がパスを指定しているが、指定したディレクトリにファイルが存在しない場合、関数は失敗します。

パスを指定せず、ファイル名拡張子を省略すると、既定の拡張子.DLLが追加されます。 ただし、ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 パスが指定されていない場合、関数はデスクトップ アプリケーションの Search Order を使用します。

戻り値

関数が成功した場合、戻り値はモジュールへのハンドルです。 失敗した場合、戻り値は NULL

解説

dll 関数のアドレスを取得するために GetProcAddress で使用できるハンドルを返します。 AfxLoadLibrary を使用して、他の実行可能モジュールをマップすることもできます。

各プロセスは、読み込まれたライブラリ モジュールごとに参照カウントを保持します。 この参照カウントは、 AfxLoadLibrary が呼び出されるたびにインクリメントされ、 AfxFreeLibrary が呼び出されるたびにデクリメントされます。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。

アプリケーションが複数のスレッドを使用し、MFC 拡張 DLL を動的に読み込む場合は、(Win32 関数のLoadLibraryFreeLibraryの代わりに) AfxLoadLibraryAfxFreeLibraryを使用してください。 AfxLoadLibraryAfxFreeLibrary を使用すると、MFC 拡張 DLL がロードおよびアンロードされたときに実行される起動とシャットダウンのコードが、グローバルの MFC 状態を破壊することがなくなります。

アプリケーションで AfxLoadLibrary を使用するには、MFC の DLL バージョンに動的にリンクする必要があります。 AfxLoadLibrary (Afxdll_.h) のヘッダー ファイルは、MFC が DLL としてアプリケーションにリンクされている場合にのみ含まれます。 MFC 拡張 DLL を使用または作成するには、MFC の DLL バージョンにリンクする必要があるため、この要件は仕様です。

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

typedef CRuntimeClass *(*GETDLLVIEW)();

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

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

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

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

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

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

   return CWinApp::ExitInstance();
}

要件

ヘッダー afxdll_.h

AfxLoadLibraryEx

AfxLoadLibraryExを使用して DLL モジュールをマップします。

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

パラメーター

lpFileName
モジュールの名前 (.DLL または .EXE ファイル) を含む null で終わる文字列を指します。 指定された名前はモジュールのファイル名です。

文字列がパスを指定しているが、指定したディレクトリにファイルが存在しない場合、関数は失敗します。

パスを指定せず、ファイル名拡張子を省略すると、既定の拡張子.DLLが追加されます。 ただし、ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 パスが指定されていない場合、関数はデスクトップ アプリケーションの Search Order を使用します。

hFile
このパラメーターは将来使用するために予約されています。 NULL にする必要があります。

dwFlags
モジュールの読み込み時に実行するアクション。 フラグが指定されていない場合、この関数の動作は AfxLoadLibrary 関数と同じです。 このパラメーターの使用可能な値については、 LoadLibraryEx ドキュメントを参照してください。

戻り値

関数が成功した場合、戻り値はモジュールへのハンドルです。 失敗した場合、戻り値は NULL

解説

AfxLoadLibraryEx は、DLL 関数のアドレスを取得するために GetProcAddress で使用できるハンドルを返します。 AfxLoadLibraryEx を使用して、他の実行可能モジュールをマップすることもできます。

各プロセスは、読み込まれたライブラリ モジュールごとに参照カウントを保持します。 この参照カウントは、 AfxLoadLibraryEx が呼び出されるたびにインクリメントされ、 AfxFreeLibrary が呼び出されるたびにデクリメントされます。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。

アプリケーションが複数のスレッドを使用し、MFC 拡張 DLL を動的に読み込む場合は、(Win32 関数のLoadLibraryExFreeLibraryの代わりに) AfxLoadLibraryExAfxFreeLibraryを使用してください。 AfxLoadLibraryExAfxFreeLibraryを使用すると、MFC 拡張 DLL の読み込みとアンロード時に実行されるスタートアップ コードとシャットダウン コードによってグローバル MFC 状態が破損することはありません。

アプリケーションで AfxLoadLibraryEx を使用するには、MFC の DLL バージョンに動的にリンクする必要があります。 AfxLoadLibraryEx (Afxdll_.h) のヘッダー ファイルは、MFC が DLL としてアプリケーションにリンクされている場合にのみ含まれます。 MFC 拡張 DLL を使用または作成するには、MFC の DLL バージョンにリンクする必要があるため、この要件は仕様です。

要件

ヘッダー afxdll_.h

AfxMenuTearOffManager

グローバル tear-off メニュー マネージャーへのポインター

構文

CMenuTearOffManager* g_pTearOffMenuManager;

要件

ヘッダー: afxmenutearoffmanager.h

AfxMouseManager

グローバル マネージャーへのポインター

構文

CMouseManager* afxMouseManager;

要件

ヘッダー: afxmousemanager.h

AfxRegisterClass

MFC を使用する DLL にウィンドウ クラスを登録するには、この関数を使用します。

BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);

パラメーター

lpWndClass
登録するウィンドウ クラスに関する情報を含む WNDCLASS 構造体へのポインター。 この構造の詳細については、Windows SDK を参照してください。

戻り値

TRUE クラスが正常に登録された場合。それ以外の場合は FALSE

解説

この関数を使用すると、DLL のアンロード時にクラスの登録が自動的に解除されます。

DLL 以外のビルドでは、アプリケーションに登録されているクラスは自動的に登録解除されるため、 AfxRegisterClass 識別子は Windows 関数 RegisterClassにマップされるマクロとして定義されます。 RegisterClassではなくAfxRegisterClassを使用する場合は、アプリケーションと DLL の両方でコードを変更せずに使用できます。

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

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

wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

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

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

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

要件

ヘッダー afxwin.h

AfxRegisterWndClass

独自のウィンドウ クラスを登録できます。

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

パラメーター

nClassStyle
ウィンドウ クラスのビットごとの OR (|) 演算子を使用して作成された、Windows クラスのスタイルまたはスタイルの組み合わせを指定します。 クラス スタイルの一覧については、Windows SDK の WNDCLASS 構造を参照してください。 NULL場合、既定値は次のように設定されます。

  • マウスのスタイルを CS_DBLCLKSに設定します。このスタイルは、ユーザーがマウスをダブルクリックしたときにウィンドウ プロシージャにダブルクリック メッセージを送信します。

  • 矢印カーソルのスタイルを Windows 標準 IDC_ARROWに設定します。

  • ウィンドウが背景を消去しないように、背景ブラシを NULLに設定します。

  • アイコンを標準の Waving フラグ Windows ロゴ アイコンに設定します。

hCursor
ウィンドウ クラスから作成された各ウィンドウにインストールするカーソル リソースへのハンドルを指定します。 既定値の 0 を使用すると、標準の IDC_ARROW カーソルが表示されます。

hbrBackground
ウィンドウ クラスから作成された各ウィンドウにインストールするブラシ リソースへのハンドルを指定します。 既定値の 0 を使用すると、 NULL 背景ブラシが作成され、既定では、 WM_ERASEBKGNDの処理中にウィンドウの背景は消去されません。

hIcon
ウィンドウ クラスから作成された各ウィンドウにインストールするアイコン リソースのハンドルを指定します。 既定値の 0 を使用すると、標準の Waving フラグ Windows ロゴ アイコンが表示されます。

戻り値

クラス名を含む null で終わる文字列。 このクラス名は、CWndまたはその他の **CWnd-**派生クラスのCreate メンバー関数に渡してウィンドウを作成できます。 この名前は、Microsoft Foundation クラス ライブラリによって生成されます。

Note

戻り値は、静的バッファーへのポインターです。 この文字列を保存するには、 CString 変数に割り当てます。

解説

Microsoft Foundation クラス ライブラリでは、いくつかの標準ウィンドウ クラスが自動的に登録されます。 独自のウィンドウ クラスを登録する場合は、この関数を呼び出します。

AfxRegisterWndClassによってクラスに登録される名前は、パラメーターのみに依存します。 同じパラメーターで AfxRegisterWndClass を複数回呼び出すと、最初の呼び出しでクラスのみが登録されます。 同じパラメーターを持つ AfxRegisterWndClass の後の呼び出しでは、既に登録されているクラス名が返されます。

同じパラメーターを持つ複数のCWnd派生クラスに対してAfxRegisterWndClassを呼び出す場合、クラスごとに個別のウィンドウ クラスを取得する代わりに、各クラスが同じウィンドウ クラスを共有します。 この共有により、 CS_CLASSDC クラス スタイルが使用されている場合に問題が発生する可能性があります。 複数の CS_CLASSDC ウィンドウ クラスの代わりに、最終的には 1 つの CS_CLASSDC ウィンドウ クラスになります。 そのクラスを使用するすべての C++ ウィンドウは、同じ DC を共有します。 この問題を回避するには、 AfxRegisterClass を呼び出してクラスを登録します。

ウィンドウ クラスの登録とAfxRegisterWndClass関数の詳細については、「テクニカル ノート TN001: Window Class Registration」を参照してください。

CString strMyClass;

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

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

要件

ヘッダー afxwin.h

AfxSetPerUserRegistration

アプリケーションがレジストリ アクセスを HKEY_CURRENT_USER (HKCU) ノードにリダイレクトするかどうかを設定します。

void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);

パラメーター

bEnable
[入力] TRUE は、レジストリ情報が HKCU ノードに転送されていることを示します。 FALSE は、アプリケーションがレジストリ情報を既定のノードに書き込みます。 既定のノードは HKEY_CLASSES_ROOT (HKCR) です。

解説

Windows Vista より前のバージョンでは、レジストリにアクセスしたアプリケーションで一般的に HKEY_CLASSES_ROOT ノードが使用されました。 ただし、Windows Vista 以降のオペレーティング システムでは、アプリケーションを管理者特権モードで実行して、 HKCRに書き込む必要があります。

このメソッドを使用すると、アプリケーションは、管理者特権モードで実行することなく、レジストリの読み取りと書き込みを行えます。 これは、レジストリ アクセスを HKCR から HKCUにリダイレクトすることによって機能します。 詳細については、「 Linker Property Pages」を参照してください。

レジストリ リダイレクトを有効にした場合、フレームワークは HKCR から HKEY_CURRENT_USER\Software\Classesにアクセスをリダイレクトします。 MFC および ATL フレームワークのみがリダイレクトの影響を受ける。

既定の実装では、 HKCRのレジストリにアクセスします。

要件

ヘッダー afxstat_.h

AfxSetResourceHandle

この関数を使用して、アプリケーションの既定のリソースが読み込まれる場所を決定する HINSTANCE ハンドルを設定します。

void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);

パラメーター

hInstResource
アプリケーションのリソースが読み込まれる.EXEまたは DLL ファイルへのインスタンスまたはモジュール ハンドル。

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

要件

ヘッダー afxwin.h

AfxShellManager

グローバル shell マネージャーへのポインター

構文

CShellManager* afxShellManager;

要件

ヘッダー: afxshellmanager.h

AfxSocketInit

windows ソケットを初期化するには、 CWinApp::InitInstance オーバーライドでこの関数を呼び出します。

BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);

パラメーター

lpwsaData
WSADATA 構造体へのポインター。 lpwsaDataNULLと等しくない場合、WSADATA構造体のアドレスは、WSAStartupの呼び出しによって入力されます。 この関数により、アプリケーションが終了する前に WSACleanup が確実に呼び出されます。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。

解説

静的にリンクされた MFC アプリケーションのセカンダリ スレッドで MFC ソケットを使用する場合は、ソケットを使用してソケット ライブラリを初期化する各スレッドで AfxSocketInit を呼び出す必要があります。 既定では、 AfxSocketInit はプライマリ スレッドでのみ呼び出されます。

要件

ヘッダー afxsock.h

AfxUserToolsManager

グローバル ユーザー ツール マネージャーへのポインター

構文

CUserToolsManager* afxUserToolsManager;

要件

ヘッダー: afxusertoolsmanager.h

AfxWinInit

この関数は、MFC を初期化するために、GUI ベースのアプリケーションのCWinApp初期化の一環として、MFC 提供のWinMain関数によって呼び出されます。

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

パラメーター

hInstance
現在実行中のモジュールのハンドル。

hPrevInstance
アプリケーションの前のインスタンスへのハンドル。 Win32 ベースのアプリケーションの場合、このパラメーターは常に NULL

lpCmdLine
アプリケーションのコマンド ラインを指定する null で終わる文字列を指します。

nCmdShow
GUI アプリケーションのメイン ウィンドウの表示方法を指定します。

解説

MFC 提供の WinMain 関数を使用しないコンソール アプリケーションの場合は、MFC を初期化するために AfxWinInit を直接呼び出す必要があります。

自分 AfxWinInit 呼び出す場合は、 CWinApp クラスのインスタンスを宣言する必要があります。 コンソール アプリケーションの場合は、 CWinApp から独自のクラスを派生させず、代わりに CWinApp のインスタンスを直接使用することもできます。 この手法は、アプリケーションのすべての機能を main の実装に残す場合に適しています。

Note

アセンブリのアクティブ化コンテキストを作成すると、MFC はユーザー モジュールによって提供されるマニフェスト リソースを使用します。 アクティブ化コンテキストは、 AfxWinInitに作成されます。 詳細については、「 MFC モジュール状態でのアクティブ化コンテキストのサポートを参照してください。

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

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

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

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

         // we shouldn't realistically get here

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

         TCHAR sz[1024];

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

         pEx->Delete();

         nRetCode = 1;
      }
   }

   return nRetCode;
}

要件

ヘッダー afxwin.h

関連項目

マクロとグローバル
CWinApp クラス
CContextMenuManager クラス
CWnd クラス
CFrameWndEx クラス
CMFCToolBar クラス
CKeyboardManager クラス
CMenuTearOffManager クラス
CMouseManager クラス
CShellManager クラス
CUserToolsManager クラス