轉自: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中刪除此類臨時對象。