關於AfxLockTempMaps和AfxUnlockTempMaps

轉自:http://blog.csdn.net/golq/archive/2008/07/14/2651204.aspx

 

 

 

在看《VC.net技術內幕(第六版)》中第23.10.2節“自動化組件DLL”時,發現以下代碼:

P549:組件接口方法中有如下代碼:

=====================================================================

... AfxLockTempMaps(); CWnd* pTopWnd = CWnd::FromHandle(::GetTopWindow(NULL)); ... AfxUnlockTempMaps(); ...

=====================================================================

 

其中,AfxLockTempMaps和AfxUnlockTempMaps的含義很是迷惑,書中550頁的說明也含混不清,MSDN中也找不到。參考http://blog.csdn.net/mood8125/archive/2006/08/24/1113341.aspx後有所領悟:

我們知道CWnd::FromHandle靜態函數返回指定句柄的窗口的指針,但該窗口指針所指向的CWnd類對象是MFC臨時創建的對象,該對象與窗口Attach。這種C++類對象與Windows窗口對象之間的映射關係保存在一個映射表中,且該映射表也是臨時性的。由於該映射表是臨時性的,隨時可能被Windows刪除,所以FromHandle的註釋中特別指出:

“The pointer may be temporary and should not be stored for later use.”(該指針是臨時性的,不能被保存作他用。)

爲了防止Windows自動刪除臨時映射表(因爲我們需要FromHandle返回的指針),調用AfxLockTempMaps將臨時映射表鎖定,而在使用結束後調用AfxUnlockTempMaps解鎖,允許Windows在OnIdle中刪除此類臨時對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章