複製鏈接
請複製以下鏈接發送給好友

AfxGetApp

鎖定
AfxGetApp( )這個函數可以得到當前應用進程的指針,是CWinApp*類型的,通過這個指針可以訪問到這個進程中的對象。
中文名
AfxGetApp
類    型
CWinApp
函數原型
CWinApp*AFXAPI AfxGetApp()
返回值
單一的CWinApp對象的指針

AfxGetApp基本概述

CWinApp*AFXAPI AfxGetApp();
A pointer to the single CWinApp object for the application.
返回指向應用程序的單一的CWinApp對象的指針
注意:
The pointer returned by this function can be used to access application information such as the main message-dispatch code or the topmost window.
這個函數返回的指針可以被用來訪問應用程序的信息,比如主消息調度代碼以及頂層窗口等。
例子:
// Print the application's executable filename.
TRACE("Executable filename = %s\n", AfxGetApp()->m_pszExeName);

AfxGetApp數據解剖

AfxGetApp( )是全局的。
比如在全局函數中要向對話框中的列表寫數據。
void writeString(char* pString)
{
CWnd* pWnd = AfxGetApp()->GetMainWnd();
CMyDlg * pDlg;
pDlg=(CMyDlg *) pWnd;
pDlg->ShowMsg(pString);
}
AfxGetApp()得到進程指針CWinApp*,通過這個指針可以得到pWnd。要不在全局函數裏你怎麼對已存在的對話框操作呢。
AfxGetApp( )這個函數可以得到當前引用的指針CWinApp*,通過這個指針可以訪問到這個進程中的對象。
==============================================================================
我們在任何一個VC工程中都會看到一個類似於:
//Test.cpp文件中
CTestApptheApp;(工程名為Test)
的語句。它是指向工程對象的一個指針,你可以用它訪問Test工程的成員函數和變量。
如果工程中添加了一個CConfig類,在CConfig中想調用Test工程中的成員函數和變量,則可以這樣調用之:
CTestApp*pApp = (CTestApp*)AfxGetApp( );
如果在CTest類中我們聲明如下一些變量:
//Test.cpp文件
class CTestApp: public CWinApp
{
CTestApp( );
CString str;//添加的對話框變量
...
}
//Test.cpp文件
CTestApp::CTestApp()
{
str="abc";
}
好了,現在我們就在CConfig類中調用str吧!
//Config.cpp文件
CTestApp *pApp=(CTestApp *)AfxGetApp( );
AfxMessageBox(pApp->str);
這樣,就實現了對CTestApp類中變量的調用。
================================================================
afxgetapp -- 取應用程序實例指針
getmainwnd -- 取主窗口對象指針
這兩個函數可以合成一個: afxgetmainwnd();
================================================================
我通常把一些重要的工程一開始就需要初始化的並且在其它地方類中都要用到的變量或
函數定義在C***App類中,然後通過此函數獲得這些變量或函數。
如果你定義為取全局變量,只需在需要的地方用extern聲名即可
如果把變量在你的C*App類中定義,就可以通過通過AfxGetApp()獲取C*App的指針,這樣就可以調用它的變量了.如果是全局變量,這不需要用這個函數調用它AfxGetApp()的返回值是指向theApp的指針,與全局變量無關。
AfxGetApp()這個函數在VC當中很常見,主要是用來獲得CWinAPP生成的全局對象的。一般情況下將其強制類型轉換成你自己寫的App類就可以調用裏面的方法了。但是如果編寫的是DLL程序的話,情況會稍有不同。你會發現在DLL中調用AfxGetApp這個函數會得到DLL的應用對象。原因出現在DLL的模塊狀態上。應用程序在調用DLL時為了保證資源不出問題,往往會調用一句:
AFX_MANAGE_STATE(AfxGetStaticModuleState())
注意這是一個宏。他的作用是切換模塊的全局變量範圍,即把應用程序的那些全局變量拷貝切換到這個DLL的全局變量拷貝,自然用AfxGetApp得到就是DLL裏面的這個APP了。如果想訪問應用程序的App對象,那麼只要把模塊狀態切換回去就可以了,記着執行完後一定要把狀態再切換回來啊,否則就要出問題了。
例如:
// switch thread state back to application
_AFX_THREAD_STATE* pState = AfxGetThreadState();
AfxSetModuleState(pState->m_pPrevModuleState);
// do something with the application
AfxGetApp()->...
// switch thread state back to dll
AFX_MANAGE_STATE(AfxGetStaticModuleState())