アプリケーションの情報と管理
アプリケーションを記述するときは、1 つの CWinApp
派生オブジェクトを作成します。 場合によっては、-derived オブジェクトの外部からこのオブジェクトに関する情報を CWinApp
取得できます。 または、他のグローバル "マネージャー" オブジェクトへのアクセスが必要な場合があります。
Microsoft Foundation クラス ライブラリには、これらのタスクの実行に役立つ次のグローバル関数が用意されています。
アプリケーション情報と管理機能
名前 | 説明 |
---|---|
AfxBeginThread |
新しいスレッドを作成します。 |
AfxContextMenuManager |
グローバル コンテキスト メニュー マネージャーへのポインター。 |
AfxEndThread |
現在のスレッドを終了します。 |
AfxFindResourceHandle |
リソース チェーンをウォークし、リソース ID とリソースの種類別に特定のリソースを見つけます。 |
AfxFreeLibrary |
読み込まれたダイナミック リンク ライブラリ (DLL) モジュールの参照カウントをデクリメントします。 参照カウントが 0 に達すると、モジュールはマップ解除されます。 |
AfxGetApp |
アプリケーションの単一 CWinApp オブジェクトへのポインターを返します。 |
AfxGetAppName |
アプリケーションの名前を含む文字列を返します。 |
AfxGetInstanceHandle |
アプリケーションの HINSTANCE このインスタンスを表す値を返します。 |
AfxGetMainWnd |
OLE 以外のアプリケーションの現在の "メイン" ウィンドウ、またはサーバー アプリケーションのインプレース フレーム ウィンドウへのポインターを返します。 |
AfxGetPerUserRegistration |
この関数を使用して、アプリケーションがレジストリ アクセスを (HKCU ) ノードにHKEY_CURRENT_USER リダイレクトするかどうかを確認します。 |
AfxGetResourceHandle |
アプリケーションの HINSTANCE 既定のリソースのソースに an を返します。 アプリケーションのリソースに直接アクセスするために使用します。 |
AfxGetThread |
現在 の CWinThread オブジェクトへのポインターを取得します。 |
AfxInitRichEdit |
アプリケーションのバージョン 1.0 リッチ エディット コントロールを初期化します。 |
AfxInitRichEdit2 |
アプリケーションのバージョン 2.0 以降のリッチ エディット コントロールを初期化します。 |
AfxIsExtendedFrameClass |
指定されたウィンドウが拡張フレーム オブジェクトかどうかを確認します。 |
AfxIsMFCToolBar |
指定されたウィンドウがツール バー オブジェクトであるかどうかを判断します。 |
AfxKeyboardManager |
グローバル キーボード マネージャーへのポインター。 |
AfxLoadLibrary |
DLL モジュールをマップし、DLL 関数のアドレスを取得するために使用できるハンドルを返します。 |
AfxLoadLibraryEx |
指定したオプションを使用して DLL モジュールをマップし、DLL 関数のアドレスを取得するために使用できるハンドルを返します。 |
AfxMenuTearOffManager |
グローバル 破棄メニュー マネージャーへのポインター。 |
AfxMouseManager |
グローバル マウス マネージャーへのポインター。 |
AfxRegisterClass |
MFC を使用する DLL にウィンドウ クラスを登録します。 |
AfxRegisterWndClass |
MFC によって自動的に登録されたものを補完する Windows ウィンドウ クラスを登録します。 |
AfxSetPerUserRegistration |
アプリケーションがレジストリ アクセスを (HKCU ) ノードにHKEY_CURRENT_USER リダイレクトするかどうかを設定します。 |
AfxSetResourceHandle |
アプリケーションの既定のリソースが読み込まれる場所の HINSTANCE ハンドルを設定します。 |
AfxShellManager |
グローバル シェル マネージャーへのポインター。 |
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
からRUNTIME_CLASS
CWinThread
派生したオブジェクトの値です。
pParam
制御関数に渡すパラメーター。
nPriority
スレッドに設定する優先度。 使用可能な優先順位の完全な一覧と説明については、Windows SDK を参照してください SetThreadPriority
。
nStackSize
新しいスレッドへのスタックのバイト サイズを指定します。 0 である場合、スタック サイズの既定値は、このスレッドを生成するスレッドのスタックと同じサイズです。
dwCreateFlags
スレッドの作成を制御する追加のフラグを指定します。 このフラグは、2 つの値の 1 つを含めることができます。
CREATE_SUSPENDED
中断カウントが 1 のスレッドを開始します。 スレッドの実行を開始する前に、オブジェクトのCWinThread
メンバー データ (派生クラスのメンバーなどm_bAutoDelete
) を初期化する場合に使用CREATE_SUSPENDED
します。 初期化が完了したら、スレッドの実行を開始するために使用CWinThread::ResumeThread
します。 スレッドは呼び出されるまでCWinThread::ResumeThread
実行されません。0 作成直後にスレッドを開始します。
lpSecurityAttrs
スレッドの SECURITY_ATTRIBUTES
セキュリティ属性を指定する構造体を指します。 場合 NULL
は、作成スレッドと同じセキュリティ属性が使用されます。 この構造の詳細については、Windows SDK を参照してください。
戻り値
新しく作成されたスレッド オブジェクトへのポインター、または NULL
エラーが発生した場合。
解説
AfxBeginThread
の最初のフォームはワーカー スレッドを作成します。 2 番目のフォームは、ユーザー インターフェイス スレッドまたはワーカー スレッドとして機能可能なスレッドを作成します。
AfxBeginThread
は、新しい CWinThread
オブジェクトを作成し、その CreateThread
関数を呼び出してスレッドの実行を開始し、スレッドへのポインターを返します。 なんらかの原因でスレッド生成に失敗すると、スレッド生成処理全体をチェックし、すべてのオブジェクトを確実に解放します。 スレッドを終了するには、スレッド内から呼び出 AfxEndThread
すか、ワーカー スレッドの制御関数から戻ります。
マルチスレッドは、アプリケーションによって有効化される必要があります。それ以外の場合、この関数は失敗します。 マルチスレッドを有効にする方法の詳細については、「、(ランタイム ライブラリを使用する)」を参照してください。/MD
/MT
/LD
詳細についてはAfxBeginThread
、「マルチスレッド: ワーカー スレッドの作成とマルチスレッド: ユーザー インターフェイス スレッドの作成」の記事を参照してください。
例
CSocket::Attach
の例を参照してください。
必要条件
ヘッダーafxwin.h
AfxContextMenuManager
グローバル コンテキスト メニュー マネージャーへのポインター。
構文
CContextMenuManager* afxContextMenuManager;
必要条件
ヘッダー:afxcontextmenumanager.h
AfxEndThread
現在実行中のスレッドを終了するには、この関数を呼び出します。
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE);
パラメーター
nExitCode
スレッドの終了コードを指定します。
bDelete
スレッド オブジェクトをメモリから削除します。
解説
終了するには、スレッド内から呼び出す必要があります。
詳細については、マルチスレッド: スレッドの終了に関AfxEndThread
する記事を参照してください。
必要条件
ヘッダーafxwin.h
AfxFindResourceHandle
リソース チェーンをウォークし、リソース ID とリソースの種類別に特定のリソースを検索するために使用 AfxFindResourceHandle
します。
構文
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 は現在のプロセスに割り当てられたリソースをクリーンできます。 エントリ ポイント関数が戻った後、ライブラリ モジュールは現在のプロセスのアドレス空間から削除されます。
DLL モジュールをマップするために使用 AfxLoadLibrary
します。
アプリケーションで複数のスレッドを使用 AfxFreeLibrary
AfxLoadLibrary
する場合は、必ず (Win32 関数 FreeLibrary
ではなく LoadLibrary
) 使用してください。 AfxFreeLibrary
MFC 拡張 DLL の読み込みとアンロード時に実行されるスタートアップ コードとシャットダウン コードを使用AfxLoadLibrary
して、グローバル 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
アプリケーションの現在のインスタンスへのインスタンス。 MFC の USRDLL バージョンにリンクされている DLL 内から呼び出された場合は、 HINSTANCE
DLL に対して返されます。
解説
AfxGetInstanceHandle
は、USRDLL バージョンの MFC にリンクされた DLL 内から呼び出されない限り、実行可能ファイル (.EXE) を常に返 HINSTANCE
します。 この場合、DLL に対して an 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
この関数を使用して、アプリケーションがレジストリ アクセスを (HKCU
) ノードにHKEY_CURRENT_USER
リダイレクトするかどうかを確認します。
BOOL AFXAPI AfxGetPerUserRegistration();
戻り値
TRUE
は、レジストリ情報がノードに HKCU
転送されていることを示します。 FALSE
は、アプリケーションがレジストリ情報を既定のノードに書き込みます。 既定のノードは (HKCR
) ですHKEY_CLASSES_ROOT
。
解説
レジストリ リダイレクトを有効にした場合、フレームワークはアクセスを次の場所に 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
は、リッチ エディット コントロールのバージョン 1.0 を初期化するために読み込まれます RICHED32.DLL
。 バージョン 2.0 と 3.0 のリッチエディット コントロールを使用するには、 RICHED20.DLL
読み込む必要があります。 への呼び出し AfxInitRichEdit2
を行うことによって読み込まれます。
既存の Visual C++ アプリケーションのリッチ エディット コントロールをバージョン 2.0 に更新するには、次を開きます。RC ファイルをテキストとして、各リッチ エディット コントロールのクラス名を "" から "RICHEDIT
RichEdit20a
" に変更します。 次に、呼び出しを次のようにAfxInitRichEdit
AfxInitRichEdit2
置き換えます。
この関数は、ライブラリがまだプロセス用に初期化されていない場合は、共通コントロール ライブラリも初期化します。 MFC アプリケーションからリッチ エディット コントロールを直接使用する場合は、この関数を呼び出して、MFC がリッチ エディット コントロール ランタイムを適切に初期化したことを確認します。 、または CRichEditDoc
、のCRichEditView
CRichEditCtrl
メソッドをCreate
呼び出す場合は、通常、この関数を呼び出す必要はありませんが、必要な場合があります。
必要条件
ヘッダーafxwin.h
AfxInitRichEdit2
この関数を呼び出して、アプリケーションのリッチ エディット コントロール (バージョン 2.0 以降) を初期化します。
BOOL AFXAPI AfxInitRichEdit2();
解説
この関数を呼び出して、リッチ エディット コントロールの RICHED20.DLL
バージョン 2.0 を読み込んで初期化します。 、または CRichEditDoc
、のCRichEditView
CRichEditCtrl
メソッドを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
は .
解説
このメソッドは、 TRUE
派生元の場合 pWnd
に CMFCToolBar
返します。 このメソッドは、関数またはメソッド パラメーターがオブジェクトであることを検証する必要がある場合に CMFCToolBar
便利です。
必要条件
ヘッダー:afxpriv.h
AfxKeyboardManager
グローバル キーボード マネージャーへのポインター。
構文
CKeyboardManager* afxKeyboardManager;
必要条件
ヘッダー:afxkeyboardmanager.h
AfxLoadLibrary
DLL モジュールをマップするために使用 AfxLoadLibrary
します。
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);
パラメーター
lpszModuleName
モジュールの名前 (.DLL または .EXE ファイル) を含む null で終わる文字列を指します。 指定された名前はモジュールのファイル名です。
文字列がパスを指定しているが、指定したディレクトリにファイルが存在しない場合、関数は失敗します。
パスが指定されておらず、ファイル名拡張子が省略されている場合は、既定の拡張子 .DLL が追加されます。 ただし、ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 パスが指定されていない場合、関数はデスクトップ アプリケーションの 検索順序を使用します。
戻り値
関数が成功した場合、戻り値はモジュールへのハンドルです。 失敗した場合、戻り値は NULL
.
解説
DLL 関数のアドレスを取得するために使用 GetProcAddress
できるハンドルを返します。 AfxLoadLibrary
を使用して、他の実行可能モジュールをマップすることもできます。
各プロセスメイン読み込まれた各ライブラリ モジュールの参照カウントが含まれます。 この参照カウントは、呼び出されるたびにインクリメント AfxLoadLibrary
され、呼び出されるたびに AfxFreeLibrary
デクリメントされます。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。
アプリケーションが複数のスレッドを使用 AfxLoadLibrary
している場合、および AfxFreeLibrary
MFC 拡張 DLL を動的に読み込む場合は、必ず (Win32 関数 LoadLibrary
の FreeLibrary
代わりに) 使用してください。 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
DLL モジュールをマップするために使用 AfxLoadLibraryEx
します。
HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);
パラメーター
lpFileName
モジュールの名前 (.DLL または .EXE ファイル) を含む null で終わる文字列を指します。 指定された名前はモジュールのファイル名です。
文字列がパスを指定しているが、指定したディレクトリにファイルが存在しない場合、関数は失敗します。
パスが指定されておらず、ファイル名拡張子が省略されている場合は、既定の拡張子 .DLL が追加されます。 ただし、ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 パスが指定されていない場合、関数はデスクトップ アプリケーションの 検索順序を使用します。
hFile
このパラメーターは将来使用するために予約されています。 次の名前を指定 NULL
する必要があります。
dwFlags
モジュールの読み込み時に実行するアクション。 フラグが指定されていない場合、この関数の動作は関数と AfxLoadLibrary
同じです。 このパラメーターの使用可能な値については、ドキュメントで LoadLibraryEx
説明します。
戻り値
関数が成功した場合、戻り値はモジュールへのハンドルです。 失敗した場合、戻り値は NULL
.
解説
AfxLoadLibraryEx
は、DLL 関数のアドレスを取得するために使用 GetProcAddress
できるハンドルを返します。 AfxLoadLibraryEx
を使用して、他の実行可能モジュールをマップすることもできます。
各プロセスメイン読み込まれた各ライブラリ モジュールの参照カウントが含まれます。 この参照カウントは、呼び出されるたびにインクリメント AfxLoadLibraryEx
され、呼び出されるたびに AfxFreeLibrary
デクリメントされます。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からマップ解除され、ハンドルは無効になります。
アプリケーションが複数のスレッドを使用 AfxLoadLibraryEx
し AfxFreeLibrary
、MFC 拡張 DLL を動的に読み込む場合は、必ず (Win32 関数 LoadLibraryEx
の FreeLibrary
代わりに) 使用してください。 AfxFreeLibrary
MFC 拡張 DLL の読み込みとアンロード時に実行されるスタートアップ コードとシャットダウン コードを使用AfxLoadLibraryEx
して、グローバル MFC 状態が破損しないようにします。
アプリケーションで使用 AfxLoadLibraryEx
するには、MFC の DLL バージョンに動的にリンクする必要があります。 のヘッダー ファイルAfxLoadLibraryEx
Afxdll_.h
は、MFC が DLL としてアプリケーションにリンクされている場合にのみ含まれます。 MFC 拡張 DLL を使用または作成するには、MFC の DLL バージョンにリンクする必要があるため、この要件は仕様です。
必要条件
ヘッダーafxdll_.h
AfxMenuTearOffManager
グローバル 破棄メニュー マネージャーへのポインター。
構文
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 で終わる文字列。 このクラス名をメンバー関数またはその他の Create
**CWnd-
**派生クラスにCWnd
渡してウィンドウを作成できます。 この名前は、Microsoft Foundation クラス ライブラリによって生成されます。
Note
戻り値は、静的バッファーへのポインターです。 この文字列を保存するには、変数に CString
割り当てます。
解説
Microsoft Foundation クラス ライブラリでは、いくつかの標準ウィンドウ クラスが自動的に登録されます。 独自のウィンドウ クラスを登録する場合は、この関数を呼び出します。
クラス AfxRegisterWndClass
に登録される名前は、パラメーターのみに依存します。 同じパラメーターを使用して複数回呼び出すと、最初の呼び出 AfxRegisterWndClass
しでクラスのみが登録されます。 同じパラメーターを使用した AfxRegisterWndClass
後の呼び出しでは、既に登録されているクラス名が返されます。
クラスごとに個別のウィンドウ クラスを取得する代わりに、同じパラメーターを持つ複数CWnd
の派生クラスを呼び出AfxRegisterWndClass
す場合、各クラスは同じウィンドウ クラスを共有します。 この共有により、クラス スタイルが使用されている場合に CS_CLASSDC
問題が発生する可能性があります。 複数 CS_CLASSDC
のウィンドウ クラスの代わりに、最終的には 1 つの CS_CLASSDC
ウィンドウ クラスになります。 そのクラスを使用するすべての C++ ウィンドウは、同じ DC を共有します。 この問題を回避するには、クラスの登録を呼び出 AfxRegisterClass
します。
ウィンドウ クラスの登録と関数の詳細については、「テクニカル ノート TN001: ウィンドウ クラスの登録 」を AfxRegisterWndClass
参照してください。
例
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
アプリケーションがレジストリ アクセスを (HKCU
) ノードにHKEY_CURRENT_USER
リダイレクトするかどうかを設定します。
void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);
パラメーター
bEnable
[in] TRUE
は、レジストリ情報がノードに HKCU
転送されていることを示します。 FALSE
は、アプリケーションがレジストリ情報を既定のノードに書き込みます。 既定のノードは (HKCR
) ですHKEY_CLASSES_ROOT
。
解説
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
グローバル シェル マネージャーへのポインター。
構文
CShellManager* afxShellManager;
必要条件
ヘッダー:afxshellmanager.h
AfxSocketInit
オーバーライドでこの関数を CWinApp::InitInstance
呼び出して、Windows ソケットを初期化します。
BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);
パラメーター
lpwsaData
WSADATA
構造体へのポインター。 等しくない場合lpwsaData
は、構造体のWSADATA
アドレスが呼び出WSAStartup
しによって入力NULL
されます。 また、この関数を 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
クラス
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示