アプリケーションの情報と管理
アプリケーションを記述するときは、 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
は、どのリソースが含まれているかを示します。
モジュールは次の順序で検索されます。
メイン モジュール (MFC 拡張 DLL の場合)。
システム以外のモジュール。
言語固有のモジュール。
メイン モジュール (システム DLL の場合)。
システム モジュール。
要件
ヘッダー: afxwin.h
AfxFreeLibrary
AfxFreeLibrary
とAfxLoadLibrary
の両方で、読み込まれたライブラリ モジュールごとに参照カウントが保持されます。
BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);
パラメーター
hInstLib
読み込まれたライブラリ モジュールのハンドル。 AfxLoadLibrary
は、このハンドルを返します。
戻り値
TRUE
関数が成功した場合。それ以外の場合は FALSE
。
解説
AfxFreeLibrary
読み込まれたダイナミック リンク ライブラリ (DLL) モジュールの参照カウントをデクリメントします。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。 この参照カウントは、 AfxLoadLibrary
が呼び出されるたびにインクリメントされます。
ライブラリ モジュールをマップ解除する前に、システムは DLL を使用してプロセスからデタッチできるようにします。 これにより、DLL は現在のプロセスに割り当てられているリソースをクリーンアップできます。 エントリ ポイント関数が戻った後、ライブラリ モジュールは現在のプロセスのアドレス空間から削除されます。
AfxLoadLibrary
を使用して DLL モジュールをマップします。
アプリケーションで複数のスレッドを使用する場合は、 AfxFreeLibrary
と AfxLoadLibrary
(Win32 関数の FreeLibrary
と LoadLibrary
の代わりに) を使用してください。 AfxLoadLibrary
とAfxFreeLibrary
を使用すると、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
。 コンパイラのより新しいバージョンでは、スレッドが見つからなかった場合、 AfxGetThread
は NULL
を返します。 アプリケーション スレッドが必要な場合は、 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 がリッチ エディット コントロール ランタイムを適切に初期化したことを確認します。 CRichEditCtrl
、CRichEditView
、またはCRichEditDoc
のCreate
メソッドを呼び出す場合は、通常、この関数を呼び出す必要はありませんが、必要な場合があります。
要件
ヘッダー afxwin.h
AfxInitRichEdit2
この関数を呼び出して、アプリケーションのリッチ エディット コントロール (バージョン 2.0 以降) を初期化します。
BOOL AFXAPI AfxInitRichEdit2();
解説
この関数を呼び出して RICHED20.DLL
を読み込み、リッチ エディット コントロールのバージョン 2.0 を初期化します。 CRichEditCtrl
、CRichEditView
、またはCRichEditDoc
のCreate
メソッドを呼び出す場合は、通常、この関数を呼び出す必要はありませんが、必要な場合があります。
要件
ヘッダー 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
。
解説
このメソッドは、pWnd
がCMFCToolBar
から派生した場合に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 関数のLoadLibrary
とFreeLibrary
の代わりに) AfxLoadLibrary
とAfxFreeLibrary
を使用してください。 AfxLoadLibrary
と AfxFreeLibrary
を使用すると、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 関数のLoadLibraryEx
とFreeLibrary
の代わりに) AfxLoadLibraryEx
とAfxFreeLibrary
を使用してください。 AfxLoadLibraryEx
とAfxFreeLibrary
を使用すると、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
構造体へのポインター。 lpwsaData
がNULL
と等しくない場合、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
クラス