1. 程式人生 > >MFC規則dll中獲取當前模組控制代碼

MFC規則dll中獲取當前模組控制代碼

對於普通規則的Dll,有需要的情況下通常會在DllMain中儲存第一個引數hInstance的值,而MFC規則dll沒有DllMain(準確來說是由MFC框架封裝了),那該怎麼拿到呢?

有人說GetModuleHandle(lpDllName)醬紫方法可以拿到。但是考慮一個問題,如果dll名字唄改了(極少數情況。。。),應該有種更好的方法。我們看MFC中給出的DllMain:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\dllinit.cpp :

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
	try
	{
		if (dwReason == DLL_PROCESS_ATTACH)
		{

#ifdef _AFX_OLE_IMPL
			BOOL bRegister = !coreDLL.bInitialized;

			// shared initialization
			AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState();
			pModuleState->m_hCurrentInstanceHandle = hInstance;
			pModuleState->m_hCurrentResourceHandle = hInstance;
			pModuleState->m_pClassInit = pModuleState->m_classList.GetHead();
			pModuleState->m_pFactoryInit = pModuleState->m_factoryList.GetHead();
#endif
我們發現,hInstance是被儲存到 pModuleState中的這兩個成員裡面的:
m_hCurrentInstanceHandle 
m_hCurrentResourceHandle 
剛好MFC有個函式:

AfxGetModuleState();

所以我們可以醬紫拿到hInstance:

BOOL CMFC_Handle_TestApp::InitInstance()
{
	CWinApp::InitInstance();
    AFX_MODULE_STATE* state = AfxGetModuleState();
    cout << state->m_hCurrentInstanceHandle << endl;
	return TRUE;
}


相關推薦

MFC規則dll獲取當前模組控制

對於普通規則的Dll,有需要的情況下通常會在DllMain中儲存第一個引數hInstance的值,而MFC規則dll沒有DllMain(準確來說是由MFC框架封裝了),那該怎麼拿到呢? 有人說GetModuleHandle(lpDllName)醬紫方法可以拿到。但是考慮一個

MFC 獲取當前視窗控制,或者父子視窗控制

父子視窗 在子視窗中,需要用到父視窗的控制代碼: AfxGetMainWnd()->m_hWnd 注:在父視窗中,也可以這麼用來呼叫自己視窗的控制代碼 在子視窗中,需要用到自己視窗的控制代碼 ChildDlg *pChildDlg ; pChildDlg->m_h

MFC框架獲取視窗/檢視控制

1 獲取視窗控制代碼(用得較多的為:AfxGetApp()): 在CMainFrame(視窗)類中,可以用HWND m_hWnd; m_hWnd = AfxGetMainWnd()->m_hWnd;  取得視窗的控制代碼,如果在視窗類中獲得一控制元件的控制代碼,可以用

實用C++函式:取當前模組控制

當前模組的控制代碼在程式進入點可以獲得,一般做法是儲存為一個全域性變數,以後使用這個全域性變數即可。但有時在寫一些比較通用的程式碼時剛好要用到模組控制代碼,如果還去訪問這個全域性變數就破壞了程式碼的通用性。 下面函式可以取得當前模組的控制代碼,無須儲存,隨調隨得: /* 通

從父視窗獲取子視窗控制以及其例項控制

獲取父視窗控制代碼 HWND hWnddlg = AfxGetMainWnd()->m_hWnd;  //主視窗控制代碼 或者 HWND hWnddlg = this->m_hWnd; //主視窗控制代碼 獲取子視窗控制代碼 如果子視窗是控制元件,並有控制元件

DLL獲取自己的模組控制的方法

 這幾天看了一下window核心程式設計,第22章有一個例子使用遠端呼叫注入Dll的。其中注入Dll的時候載入dll的程序呼叫VirtualQuery查詢程序虛擬空間得到程序載入的所有模組路徑。但是,查詢程式碼很奇怪,於是翻看文件,VirtualQuery說明中沒有說到過任何與dll有關的話題,但作者又如何肯

VS2013的MFC獲取程式的控制

在VC6中,我可以右擊工具欄的空白處,勾選Controls以顯示控制元件(編輯框、按鈕、等),VS2013要怎麼做呢? 答:在VS2013中,你應該View->Toolbox以顯示這些控制元件,或者Ctrl+Alt+X快捷鍵調出來它。 spy++怎麼用? 答:先Too

獲取當前時間的

fun 獲取 w3c 當前 load etsec win 程序 onload 如標題: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html

Java運行時獲取當前運行類名、方法名

getc == all file turn ble number microsoft AC /* * 1.獲取當前運行代碼的類名,方法名,行號,主要是通過java.lang.StackTraceElement類 * * 2. 獲取調用者、當前方法名 * [1]獲

獲取ArcMap視窗控制,通過WinAPI獲取工作空間中點選要素的系統桌面座標

這裡用了個“桌面座標”,是希望區分一下ArcGis的“螢幕座標”(與之對應的還有一個“地理座標”)。 什麼是“螢幕座標”呢?使用ITool介面的OnMouseDown方法獲取的“x,y”值即是,其原點值在“工作空間”窗體左上角。 什麼是我所稱謂的“工作空間”呢?它是資料編輯區域,用Spy++檢視一下其窗體

程序模組控制

一、注意區別程序模組控制代碼和程序核心控制代碼 二、每個可執行檔案或者DLL檔案被裝入到某個程序地址空間後,都會有一個唯一的例項控制代碼,來表示裝入後的可執行檔案或者DLL,此時我們把這個可執行檔案或者DLL叫做程序地址空間中的一個模組。     &

獲取對話方塊控制

簡介: 獲取主對話方塊和子對話方塊的控制代碼,子對話方塊通過FindWindow。我之所以會用這個函式,其實我是有這個需求,那就是我需要在一個對話方塊的通過AfxBeginThread建立的執行緒中呼叫另一個對話方塊函式。廢話少數,如下: 1.主對話方塊 在其它對話方塊或者執

如何查詢窗體,獲取窗體的控制,Hwnd FindWindow函式

/*CWnd::FindWindowstatic CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTRlpszWindowNa- me );返回值:標識了具有指定的類名或視窗名的視窗。如果沒有找到這樣的視窗,則返回N

根據程序id獲取主視窗控制

struct ProcessWindowData { HWND hWnd; unsigned long lProcessId; }; BOOL CALLBACK EnumWindowCallback(HWND hWnd, LPARAM lParam) { ProcessWindowData&

MFC+OpenCV獲得動態建立視窗的控制

//獲得動態建立視窗的控制代碼 cvNamedWindow(“Mywindow”, 0); HWND  hWnd = (HWND)cvGetWindowHandle(“Mywindow”); //獲得動態建立視窗父視窗的控制代碼 HWND hParent = ::Ge

如何獲取控制檯視窗控制 (HWND)

HWND GetConsoleHwnd(void) { #define MY_BUFSIZE 1024 // Buffer size for console window titles. HWND hwndFound; // This is what

獲得模組控制

/* 獲取自己模組控制代碼 */ HMODULE GetSelfModuleHandle() { MEMORY_BASIC_INFORMATION mbi; return ((::VirtualQuery(GetSelfModuleHandle, &mbi,

模組控制和程序控制的區別?

         在WINDOWS下,模組指的是EXE和DLL等資料載入到記憶體中的影像,模組控制代碼又是比較特殊的,它跟一般的控制代碼不一樣,模組控制代碼指向的就是EXE和DLL等的在記憶體的位置(就是指向它們的資料起始位置);程序控制代碼只是WINDOWS用來標識某個程

python selenium 獲得當前視窗控制/獲得當前視窗

1. 獲得當前視窗控制代碼:    driver.current_window_handles2. 獲得當前所有一開啟的視窗控制代碼:   driver.window_handles3.切換視窗:    driver.switch_to.window()        #引數

自定義控制元件如何獲取父窗體控制

最近做專案時,需要過載picture control 來增加控制元件的右擊事件。在想父窗體傳送訊息時遇到了困難,不知道如何獲取父窗體的控制代碼,以及控制元件的ID。通過兩個函式來分別獲取控制元件ID以及父窗體控制代碼。void CPictureContorl::OnRButt