青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

love in C++, live on MFC

to get ready...

C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
  47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks

csdn上難得的好文章,怕不爭氣的csdn網(wǎng)站過幾天又找不到這篇文章了,我得先轉(zhuǎn)一下,保存一下:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=193097

Q : MFC返回的臨時(shí)對象指針成因?
主要解答者: QunKangLi 提交人: QunKangLi
感謝: oldforest、yu_hl、QunKangLi
審核者: happyparrot 社區(qū)對應(yīng)貼子: 查看
???? A :

msdn在介紹GetDlgItem的時(shí)候,明確指出: ?
The ?returned ?pointer ?may ?be ?temporary ?and ?should ?not ?be ?stored ?for ?later ?use. ?
如果真是這樣那我不慘了!在我的一個(gè)軟件中,因?yàn)槌3R骨袚Q按鈕的可用與不可用以及改變按鈕文字,所以我用DetDlgItem把它們存了起來,用的時(shí)候直接到數(shù)組里面取,這樣的話這個(gè)軟件不是犯了一個(gè)重大的錯(cuò)誤了?可是用這么久也沒出錯(cuò)。 ?
另外,它也是說可能是臨時(shí)的,那一定在某種情況下不是臨時(shí)的,高手能不能解釋一下這個(gè)問題? ?
--------------------------------------------------------------- ?
// ? ?Most ?Windows ?objects ?are ?represented ?with ?a ?HANDLE, ?including ?
// ? ? ? ? ? ?the ?most ?important ?ones, ?HWND, ?HDC, ?HPEN, ?HFONT ?etc. ?
// ? ?We ?want ?C++ ?objects ?to ?wrap ?these ?handle ?based ?objects ?whenever ?we ?can. ?
// ? ?Since ?Windows ?objects ?can ?be ?created ?outside ?of ?C++ ?(eg: ?calling ?
// ? ? ? ? ? ?::CreateWindow ?will ?return ?an ?HWND ?with ?no ?C++ ?wrapper) ?we ?must ?
// ? ? ? ? ? ?support ?a ?reasonably ?uniform ?mapping ?from ?permanent ?handles ?
// ? ? ? ? ? ?(i.e. ?the ?ones ?allocated ?in ?C++) ?and ?temporary ?handles ?(i.e. ?
// ? ? ? ? ? ?the ?ones ?allocated ?in ?C, ?but ?passed ?through ?a ?C++ ?interface. ?
// ? ?We ?keep ?two ?dictionaries ?for ?this ?purpose. ? ?The ?permanent ?dictionary ?
// ? ? ? ? ? ?stores ?those ?C++ ?objects ?that ?have ?been ?explicitly ?created ?by ?
// ? ? ? ? ? ?the ?developer. ? ?The ?C++ ?constructor ?for ?the ?wrapper ?class ?will ?
// ? ? ? ? ? ?insert ?the ?mapping ?into ?the ?permanent ?dictionary ?and ?the ?C++ ?
// ? ? ? ? ? ?destructor ?will ?remove ?it ?and ?possibly ?free ?up ?the ?associated ?
// ? ? ? ? ? ?Windows ?object. ?
// ? ?When ?a ?handle ?passes ?through ?a ?C++ ?interface ?that ?doesn't ?exist ?in ?
// ? ? ? ? ? ?the ?permanent ?dictionary, ?we ?allocate ?a ?temporary ?wrapping ?object ?
// ? ? ? ? ? ?and ?store ?that ?mapping ?into ?the ?temporary ?dictionary. ?
// ? ?At ?idle ?time ?the ?temporary ?wrapping ?objects ?are ?flushed ?(since ?you ?better ?
// ? ? ? ? ? ?not ?be ?holding ?onto ?something ?you ?didn't ?create). ?
// ?
?
?
在CWinThread::OnIdle里調(diào)用AfxUnlockTempMaps,AfxUnlockTempMaps會(huì)釋放temporary ?maps. ?
?
所以不要保留GetDlgItem等返回的臨時(shí)指針,可以直接保存HWND ?objects,然后CWnd::FromHandle獲取臨時(shí)指針來用。 ?
?
--------------------------------------------------------------- ?
?
臨時(shí)包裝對象會(huì)在空閑時(shí)間刪除.在同一函數(shù)中多次使用是沒用問題的,不同函數(shù)中使用先前保存下來的指針就有可能出錯(cuò),特別是對話框初使化時(shí)候存下來的指針. ?
? ? ? ?在MFC層次上的函數(shù)使用CWnd對象,而本地Windows代碼(API)使用句柄.如:當(dāng)Windows系統(tǒng)調(diào)用一個(gè)窗口過程時(shí)將傳遞一個(gè)HWND參數(shù),而MFC本身的消息機(jī)制使用CWnd類;為了更好更高效的實(shí)現(xiàn),MFC需要與Windows系統(tǒng)合作,將句柄與CWnd對象進(jìn)行關(guān)聯(lián)---它用CHandleMap完成關(guān)聯(lián). ?
CHandleMap有兩個(gè)CMapPtrToPtr的成員變量:m_permanentMap(永久映射表,程序運(yùn)行過程中對象/句柄之間的關(guān)系),m_temporaryMap(臨時(shí)映射表,在消息存在的過程中才存在).永久表保存顯式創(chuàng)建的CWnd對象,當(dāng)對象創(chuàng)建時(shí)將在永久目錄下插入一個(gè)條目,在CWnd::OnNcDestrory時(shí)刪除對應(yīng)條目.但是Windows有時(shí)會(huì)傳入某些不是由開發(fā)人員顯式創(chuàng)建的窗口的句柄,此時(shí)MFC會(huì)分配一個(gè)臨時(shí)對象來包裝這個(gè)句柄并將它們的映射保存到臨時(shí)映射表中,這些臨時(shí)對象會(huì)在空閑時(shí)間被刪除并移走相應(yīng)的臨時(shí)映射表?xiàng)l目.類似的MFC對象與Windows句柄的映射表有: ?
m_pmapHWND: ?? ?? ?? ?? ?? ?? ?? ??窗口句柄與CWnd對象 ?
m_pampHMENU: ?? ?? ?? ?? ?? ?? ?? ??菜單句柄與CMenu對象 ?
m_pmapHDC: ?? ?? ?? ?? ?? ?? ?? ??設(shè)備環(huán)境句柄與CDC對象 ?
m_pmapHGDIOBJ: ?? ?? ?? ?? ?? ?? ?? ??GDI句柄與CGDI對象 ?
m_mapHIMAGELIST: ?? ?? ?? ??圖像鏈表句柄到CImageList對象 ?
?
當(dāng)給定句柄,如HWND時(shí),MFC簡單調(diào)用CWnd* ?PASCAL ?CWnd::FromHandle(HWND ?hWnd), ?此函數(shù)內(nèi)部使用CHandleMap::FromHandle(hWnd)獲取相關(guān)聯(lián)的CWnd對象.在CHandleMap::FromHandle(h)內(nèi)部(源代碼在WinHand.cpp),先使用CObject* ?pObject ?= ?LookupPermanent(h); ?? ?? ?? ??if ?(pObject ?!= ?NULL)return ?pObject; ? ?檢查永久表;如永久表中不存在,使用pObject ?= ?LookupTemporary(h)) ?!= ?NULL檢查臨時(shí)表,都不存在時(shí),使用pTemp ?= ?= ?m_pClass->CreateObject();if ?(pTemp ?== ?NULL)AfxThrowMemoryException();m_temporaryMap.SetAt((LPVOID)h, ?pTemp);創(chuàng)建臨時(shí)對象并將其插入到臨時(shí)表中去,同時(shí)返回該臨時(shí)對象. ?
void ?CHandleMap::RemoveHandle(HANDLE ?h)的注釋說明臨時(shí)對象將在空閑時(shí)由OnIdel釋放: ?
?? ?? ?? ??// ?remove ?only ?from ?permanent ?map ?-- ?temporary ?objects ?are ?removed ?
?? ?? ?? ??// ? ?at ?idle ?in ?CHandleMap::DeleteTemp, ?always! ?
如果想不自動(dòng)釋放臨時(shí)對象,使用void ?AFXAPI ?AfxLockTempMaps()/BOOL ?AFXAPI ?AfxUnlockTempMaps(BOOL ?bDeleteTemps)進(jìn)行鎖定. ?



posted on 2006-07-10 23:18 flyingxu 閱讀(1756) 評論(1)  編輯 收藏 引用 所屬分類: VC/MFC

Feedback

# re: [zz]MFC返回的臨時(shí)對象指針成因? 2008-06-04 16:43 Touchsoft
csdn上難得的好文章,怕不爭氣的csdn網(wǎng)站過幾天又找不到這篇文章了,我得先轉(zhuǎn)一下,保存一下:

我直接保存你的這篇到硬盤了 :)


如果真是這樣那我不慘了!在我的一個(gè)軟件中,因?yàn)槌3R骨袚Q按鈕的可用與不可用以及改變按鈕文字,所以我用DetDlgItem把它們存了起來,用的時(shí)候直接到數(shù)組里面取,這樣的話這個(gè)軟件不是犯了一個(gè)重大的錯(cuò)誤了?可是用這么久也沒出錯(cuò)。

我曾經(jīng)也這樣用,不過很遺憾,我發(fā)覺我獲取的CCombox添加的數(shù)據(jù)失敗了,后來沒辦法,就定義控件成員變量,看到這篇文章,所以收藏。

我沒看GetDlgItem的MSDN描述,一直相信它可以獲得“正確”的“穩(wěn)定”的指針。哎~  回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费观看日韩| 一区二区三区高清在线| 久久久综合网| 亚洲第一天堂无码专区| 欧美高清视频一区| 欧美成人国产| 亚洲视频自拍偷拍| 亚洲性感美女99在线| 国产精品一区二区在线| 久久综合福利| 欧美精品福利在线| 亚洲欧美一区二区激情| 欧美一区二区三区免费视频| 在线色欧美三级视频| 日韩视频国产视频| 国产午夜久久久久| 最新日韩中文字幕| 国产精品视频免费观看www| 久久久久久夜精品精品免费| 欧美高清视频免费观看| 亚洲欧美日韩国产成人| 久久久噜噜噜| 亚洲免费婷婷| 欧美www在线| 久久www成人_看片免费不卡| 久久综合伊人77777麻豆| 亚洲一区二区三区高清| 久久久91精品| 亚洲欧美日韩天堂| 嫩草影视亚洲| 久久精品视频一| 欧美日韩亚洲激情| 久热精品在线| 国产精品一区二区女厕厕| 亚洲国产精品福利| 国产专区精品视频| 这里是久久伊人| 亚洲精品小视频| 午夜亚洲精品| 亚洲男人影院| 欧美日本韩国一区二区三区| 久久视频在线免费观看| 国产精品久久久久久久久久尿| 欧美成人精精品一区二区频| 国产欧美午夜| 亚洲视频免费看| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美调教vk| 亚洲高清资源综合久久精品| 国产亚洲欧洲一区高清在线观看| 亚洲美女尤物影院| 亚洲激情在线| 久久久久久久综合日本| 久久成人免费日本黄色| 国产精品白丝黑袜喷水久久久| 欧美大片国产精品| 狠狠综合久久av一区二区小说 | 日韩视频在线观看一区二区| 亚洲高清影视| 久久久av水蜜桃| 久久久久久亚洲精品杨幂换脸 | 91久久极品少妇xxxxⅹ软件| 欧美一区视频在线| 欧美一区二区三区在| 国产精品久久久久高潮| 一区二区三区日韩欧美精品| 亚洲视频在线观看免费| 欧美日韩高清在线一区| 亚洲三级电影在线观看| 亚洲国产精品999| 老**午夜毛片一区二区三区| 美日韩在线观看| 亚洲电影专区| 免费看亚洲片| 亚洲国产综合视频在线观看| 亚洲成人资源网| 欧美va天堂| 亚洲国产一区二区在线| 日韩五码在线| 国产精品高潮呻吟| 小辣椒精品导航| 久久亚洲私人国产精品va媚药| 好吊色欧美一区二区三区视频| 久久久久久夜| 亚洲狼人综合| 欧美一区观看| 在线看日韩欧美| 欧美激情91| 亚洲欧美激情一区| 美女精品视频一区| 一区二区日韩伦理片| 国产精品久久久99| 久久精品国产一区二区三| 欧美国产第一页| 亚洲一区综合| 在线成人激情| 欧美视频在线看| 久久精品网址| 99国产麻豆精品| 久久久人成影片一区二区三区观看| 亚洲第一精品久久忘忧草社区| 欧美国产日韩精品| 亚洲欧美成人一区二区三区| 欧美aⅴ99久久黑人专区| 国产精品99久久久久久久vr| 国产午夜精品在线| 欧美老女人xx| 久久精品论坛| 中日韩高清电影网| 欧美国产日韩视频| 欧美在线综合视频| 日韩午夜精品视频| 韩国成人精品a∨在线观看| 欧美精品在线观看一区二区| 欧美一区二区三区免费观看| 亚洲三级国产| 欧美大色视频| 久久久国产精彩视频美女艺术照福利| 99精品国产热久久91蜜凸| 激情成人综合网| 国产精品久久久久一区| 欧美风情在线观看| 久久久中精品2020中文| 亚洲欧美国产高清| 日韩视频在线播放| 亚洲高清在线视频| 裸体素人女欧美日韩| 欧美有码在线观看视频| 亚洲一级电影| 一二三四社区欧美黄| 狠色狠色综合久久| 国产视频精品va久久久久久| 欧美午夜www高清视频| 欧美噜噜久久久xxx| 免费在线一区二区| 久色成人在线| 久久中文字幕导航| 久久久噜噜噜久噜久久| 久久精品一区蜜桃臀影院| 亚洲欧美视频在线| 午夜精品视频在线观看一区二区| 一区二区三区精品国产| 日韩午夜精品视频| 一本色道久久综合亚洲精品按摩| 亚洲国产精品久久久久婷婷老年| 欧美国产成人精品| 欧美国产日本| 最新成人av网站| 亚洲精选91| 一区二区三区精密机械公司 | 欧美中文字幕在线观看| 欧美一区2区三区4区公司二百| 亚洲免费在线观看视频| 午夜欧美理论片| 久久精品人人做人人综合| 久久青草欧美一区二区三区| 久久中文字幕导航| 欧美成人中文字幕| 亚洲日韩欧美视频| 国产精品99久久久久久人 | 亚洲福利专区| 亚洲人成网站999久久久综合| 99re6热在线精品视频播放速度| 日韩视频免费观看| 午夜精品在线看| 久久久久久午夜| 欧美激情综合色| 国产精品一区二区三区免费观看| 国产一区二区欧美| 亚洲黄色av| 亚洲欧美激情四射在线日 | 欧美一级一区| 久热精品视频在线| 亚洲精品免费网站| 亚洲欧美在线一区二区| 久久综合九色99| 国产精品成人v| 国内精品久久久久久| 亚洲精品社区| 久久国产高清| 亚洲国产高清视频| 午夜精品一区二区三区四区| 免费在线观看成人av| 国产精品日日摸夜夜摸av| 怡红院精品视频| 午夜精品久久久久久久99水蜜桃 | 91久久夜色精品国产九色| 亚洲一区二区三区午夜| 免费成人小视频| 国产精品亚洲产品| 亚洲精品久久久久久久久久久久久| 亚洲视频欧美视频| 欧美韩国在线| 欧美在线观看日本一区| 国产精品a久久久久| 亚洲黑丝在线| 老司机精品视频网站| 亚洲综合电影| 欧美午夜电影在线| 亚洲日本在线视频观看|