锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
HEAP: Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed
GFlags鏄疻indows debug tools 宸ュ叿鍖呬笅鐨勪竴涓伐鍏?鍦╓indows 2000鐨凴esource Kit涓篃鍙互鎵懼緱鍒般傜敤鏉ヨ緗竴浜涜皟璇曞睘鎬э紝鎬諱綋涓婂垎涓?涓駭鍒玈ystem錛孠ernel鍜孖mage File銆傛垜浠緗ソPath鐜鍙橀噺,灝嗗叾鎸囧悜Debug tools宸ュ叿鐨勭洰褰曚笅銆?/p>
涓嬭澆瀹夎 gflags:
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
http://www.ithov.com/Soft/system/systest/38210.shtml
GFlags
- 鑰佺墝鐨凱ageHeap閰嶇疆宸ュ叿錛屾湁鍛戒護琛屽拰GUI涓ょ鎿嶄綔鏂瑰紡錛屽姛鑳芥瘮杈冨叏錛屽寘鍚湪Windbg璋冭瘯鍣ㄥ畨瑁呭寘鍐呫傚悓鏍峰湪Windows 2000 Professional SP2 浠ヤ笂鍙敤銆?/span>
涓浜涗嬌鐢℅Flags鍛戒護琛岀殑渚嬪瓙錛?/span>
閰嶇疆姝e父欏靛爢錛?/span>
"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /enable qq.exe
閰嶇疆瀹屽叏欏靛爢錛?/span>
"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /enable qq.exe /full
鍒楀嚭褰撳墠鍚姩浜嗛〉鍫嗙殑榪涚▼鍒楄〃錛?/span>
"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p
鍙栨秷欏靛爢璁劇疆錛?/span>
"C:\Program Files\Debugging Tools for Windows (x86)\gflags.exe" /p /disable qq.exe
涓浜涚壒孌婇夐」瑙i噴錛?/span>
/unaligned
榪欎釜閫夐」鍙兘鐢ㄤ簬瀹屽叏欏靛爢銆傚綋鎴戜滑浠庢櫘閫氬爢綆$悊鍣ㄥ垎閰嶄竴鍧楀唴瀛樻椂錛屽唴瀛樻繪槸8瀛楄妭瀵歸綈鐨勶紝欏靛爢榛樿鎯呭喌涓嬩篃浼氫嬌鐢ㄨ繖涓榻愯鍒欙紝浣嗘槸榪欎細瀵艱嚧鍒嗛厤鐨勫唴瀛樺潡鐨勭粨灝句笉鑳借窡欏佃竟鐣岀簿紜榻愶紝鍙兘瀛樺湪0-7涓瓧鑺傜殑闂撮殭錛屾樉鐒訛紝瀵逛綅浜庨棿闅欒寖鍥村唴鐨勮闂槸涓嶄細琚珛鍗沖彂鐜般傛洿鍑嗙‘鐨勮錛岃鎿嶄綔灝嗘案榪滀笉鑳借鍙戠幇錛屽啓鎿嶄綔鍒欒絳夊埌鍐呭瓨鍧楅噴鏀炬椂鏍¢獙闂撮殭絀洪棿鍐呯殑濉厖淇℃伅鏃舵墠鍙戠幇銆?unaligned鐢ㄤ簬淇榪欎釜緙洪櫡錛屽畠鎸囧畾欏靛爢綆$悊鍣ㄤ笉蹇呴伒瀹?瀛楄妭瀵歸綈瑙勫垯錛屼繚璇佸唴瀛樺潡灝鵑儴綺劇‘瀵歸綈欏佃竟鐣屻?/span>
闇瑕佹敞鎰忕殑鏄紝涓浜涚▼搴忓惎鐢ㄨ繖涓夐」鍙兘鍑虹幇寮傚父錛屼緥濡侷E鍜孮Q灝變笉鏀寔銆?/span>
/backwards
榪欎釜閫夐」鍙兘鐢ㄤ簬瀹屽叏欏靛爢銆傝繖涓夐」浣垮緱鍒嗛厤鐨勫唴瀛樺潡澶撮儴涓庨〉杈圭晫瀵歸綈錛堣屼笉鏄熬閮ㄤ笌杈圭晫瀵歸綈錛夛紝閫氳繃榪欎釜閫夐」鏉ユ鏌ュご閮ㄧ殑璁塊棶瓚婄晫銆?/span>
/debug
鎸囧畾涓鍚姩榪涚▼鍗矨ttach鍒拌皟璇曞櫒錛屽浜庨偅浜涗笉鑳借嚜鍔ㄧ敓鎴恉ump鐨勭▼搴忥紝鏄瘮杈冩湁鐢ㄧ殑閫夐」銆?/span>
瀹屽叏欏靛爢錛?/span>
褰撳垎閰嶄竴鍧楀唴瀛樻椂錛岄氳繃璋冩暣鍐呭瓨鍧楃殑鍒嗛厤浣嶇疆錛屼嬌鍏剁粨灝炬伆濂戒笌緋葷粺鍒嗛〉杈圭晫瀵歸綈錛岀劧鍚庡湪杈圭晫澶勫啀澶氬垎閰嶄竴涓笉鍙闂殑欏典綔涓轟繚鎶ゅ尯鍩熴傝繖鏍鳳紝涓鏃﹀嚭鐜板唴瀛樿/鍐欒秺鐣屾椂錛岃繘紼嬪氨浼欳rash錛屼粠鑰屽府鍔╁強鏃舵鏌ュ唴瀛樿秺鐣屻?/span>
鍥犱負姣忔鍒嗛厤鐨勫唴瀛橀兘瑕佷互榪欑褰㈠紡甯冨眬錛屽挨鍏跺浜庡皬鐗囩殑鍐呭瓨鍒嗛厤錛屽嵆浣垮垎閰嶄竴涓瓧鑺傦紝涔熻鍒嗛厤涓涓唴瀛橀〉錛屽拰涓涓繚鐣欑殑铏氭嫙鍐呭瓨欏碉紙娉ㄦ剰鍦ㄧ洰鍓嶇殑瀹炵幇涓紝榪欎釜鐢ㄤ綔杈圭晫淇濇姢鍖哄煙鐨勯〉浠庢潵涓嶄細琚彁浜わ級銆傝繖灝遍渶瑕佸ぇ閲忕殑鍐呭瓨錛屽埌搴曚竴涓繘紼嬮渶瑕佸灝戝唴瀛橈紝寰堥毦浼扮畻錛屽洜姝ゅ湪浣跨敤Page Heap鍓嶏紝鑷沖皯淇濊瘉浣犵殑鏈哄櫒鑷沖皯璁劇疆浜?G铏氭嫙鍐呭瓨浠ヤ笂銆?/span>
姝e父欏靛爢
姝e父欏靛爢鍘熺悊涓嶤RT璋冭瘯鍐呭瓨鍒嗛厤鍑芥暟綾諱技錛岄氳繃鍒嗛厤灝戦噺鐨勫~鍏呬俊鎭紝鍦ㄩ噴鏀懼唴瀛樺潡鏃舵鏌ュ~鍏呭尯鍩熴傛潵媯嫻嬪唴瀛樻槸鍚﹁鎹熷潖錛屾鏂規硶鐨勪紭鐐規槸鏋佸ぇ鐨勫噺灝戜簡鍐呭瓨鑰楃敤閲忋傜己鐐規槸鍙兘鍦ㄩ噴鏀懼潡鏃舵嫻嬶紝涓嶅お濂借窡韙嚭閿欑殑浠g爜浣嶇疆銆?/span>
欏靛爢鑳藉鐞嗙殑閿欒綾誨瀷錛?/span>
閿欒綾誨瀷 姝e父欏靛爢 鏁撮〉鍫?nbsp;
鍫嗗彞鏌勬棤鏁?nbsp; 绔嬪嵆鍙戠幇 绔嬪嵆鍙戠幇
鍫嗗唴瀛樺潡鎸囬拡鏃犳晥 绔嬪嵆鍙戠幇 绔嬪嵆鍙戠幇
澶氱嚎紼嬭闂爢涓嶅悓姝?nbsp; 绔嬪嵆鍙戠幇 绔嬪嵆鍙戠幇
鍋囪閲嶆柊鍒嗛厤榪斿洖鐩稿悓鍦板潃(realloc) 90% 鍐呭瓨閲婃斁鍚庡彂鐜?nbsp; 90% 绔嬪嵆鍙戠幇
鍐呭瓨鍧楅噸澶嶉噴鏀?nbsp; 90% 绔嬪嵆鍙戠幇 90% 绔嬪嵆鍙戠幇
璁塊棶宸查噴鏀劇殑鍐呭瓨鍧?nbsp; 90% 鍦ㄥ疄闄呴噴鏀懼悗鍙戠幇 90% 绔嬪嵆鍙戠幇
璁塊棶鍧楃粨灝句箣鍚庣殑鍐呭 鍦ㄩ噴鏀懼悗鍙戠幇 绔嬪嵆鍙戠幇
璁塊棶鍧楀紑濮嬩箣鍓嶇殑鍐呭 鍦ㄩ噴鏀懼悗鍙戠幇 绔嬪嵆鍙戠幇
浠ヤ笅鏄婦渚嬶細
鍓嶆湡宸ヤ綔錛?灝唃flags錛堥粯璁ゅ畨瑁呭湪C:\Program Files\Debugging Tools for Windows (x86)錛夊姞鍏ュ埌path
妗堜緥1錛?/strong>
int _tmain(int argc, _TCHAR* argv[])
{
char *p = new char[8];
p[8] = 10;
delete[] p;
return 0;
}
紼嬪簭鏈韓鏄湁闂鐨勩傛暟緇勫凡緇忚秺鐣岋紝浣嗘槸debug妯″紡涓嬪茍涓嶆姤閿欙紝release妯″紡涓嬩篃寰堝ぇ鍙兘鏄笉crash鐨勩?/p>
鍦ㄥ懡浠ゆ彁紺虹涓嬭繍琛岋細
>gflags /p /enable test.exe /full
鍦╮elease妯″紡榪愯test.exe銆俥xception灝嗙洿鎺ュ畾浣嶅埌 p[8] = 10; 榪欎竴琛?/p>
妗堜緥2錛?/strong>
int _tmain(int argc, _TCHAR* argv[])
{
char *p = new char[9];
p[9] = 10;
delete[] p;
return 0;
}
浠ヤ笂浠g爜鍜屾渚?浠呮湁涓鐐逛笉鍚岋紝灝辨槸鏁扮粍澶у皬銆備絾鏄鏋滆繍琛?br>gflags /p /enable test.exe /full
鍦╮elease妯″紡涓嬪茍涓嶄細鍑虹幇exception騫跺畾浣嶅埌 p[9] = 10;
鍘熷洜鏄病鏈夎緗?/unaligned 鍙傛暟錛屽叿浣撶湅璇存槑銆傛渚?涓紝鏁扮粍鏈?瀛楄妭澶у皬錛屾寜鍐呭瓨8瀛楄妭瀵歸綈鐨勮娉曪紝榪欏潡鍐呭瓨搴旇鏄?/p>
16瀛楄妭錛屽悗闈㈣繕鏈?瀛楄妭鐨勭┖闂達紝鎵浠?p[9] = 10; 騫朵笉浼氫駭鐢焑xception銆傝緗?/unaligned 鍙傛暟錛岀姝?瀛楄妭瀵歸綈錛屽氨
鍙互璺熻釜鍒?p[9] = 10; 榪欎釜exception
>gflags /p /enable test.exe /full /unaligned
妗堜緥3錛?br>class A
{
public:
int a;
void del(){
delete this;
a = 10;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a = new A();
a->del();
return 0;
}
鍦╠ebug妯″紡涓嬪彲鑳戒駭鐢焑xception:
HEAP: Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed
鍦╮elease妯″紡涓嬭繍琛屽茍涓嶆姤閿欙紝浣嗘槸紼嬪簭鏈韓鏄湁闂鐨勶紝delete this; 涔嬪悗錛屽張緇欐垚鍛樺彉閲?a=10;
榪欐樉鐒舵槸涓嶅鐨勩?/p>
>gflags /p /enable test.exe /full
姝ゆ椂鍦╠ebug涓嬭繍琛岀▼搴忥紝浼氫駭鐢焑xception錛屽茍瀹氫綅鍒?nbsp; a = 10;
棣栧厛涓縐嶆瘮杈冪洿瑙傜畝媧佺殑鏂瑰紡灝辨槸鐢╓inDbg絳夎皟璇曞櫒鐩存帴attach鍒伴渶瑕佽皟璇曠殑榪涚▼錛岃皟璇曞畬姣曚箣鍚庡啀detach鍗沖彲銆備絾鏄繖縐嶆柟寮忔湁涓己鐐瑰氨鏄墽琛宒ebugger鍛戒護鏃跺繀欏誨厛break榪欎釜榪涚▼錛屾墽琛屽畬debug鍛戒護涔嬪悗鍙堝緱璧剁揣F5璁╀粬緇х畫榪愯錛屽洜涓鴻浣燽reak浣忕殑鏃跺欐剰鍛崇潃鏁翠釜榪涚▼涔熷凡緇忚浣犳寕璧楓傚彟澶栦篃緇忓父浼氱敱浜嶧irst Chance Excetpion鑰岃嚜鍔╞reak錛屼綘寰楁椂鍒葷暀鎰忛伩鍏嶉暱鏃墮棿break鏁翠釜榪涚▼銆傛墍浠ヨ繖鏍風殑璋冭瘯鏂瑰紡瀵規椂闂存槸涓緢澶х殑鑰冮獙錛屽線寰娌℃湁鍏呰鐨勬椂闂存潵鍋氫粩緇嗗垎鏋愩?/p>
鍙︿竴縐嶆柟寮忓垯鏄湪鍑虹幇闂鐨勬椂鍊欙紝姣斿CPU鎸佺畫闀挎椂闂?00%錛屽唴瀛樼獊鐒舵毚娑ㄧ瓑闈炴甯告儏鍐典笅錛岄氳繃瀵規湇鍔¤繘紼媠napshot鎶撳彇涓涓猟ump鏂囦歡錛屽畬鎴恉ump涔嬪悗鍏坉eatch錛岃榪涚▼緇х畫榪愯銆傜劧鍚庣敤windbg絳夊伐鍏鋒潵鍒嗘瀽榪欎釜鎶撳彇鍒扮殑dump鏂囦歡銆?/p>
閭d箞濡備綍鍦ㄤ笉緇堟榪涚▼鐨勬儏鍐典笅鎶撳彇dump鏂囦歡鍛紵Debugging Tools for Windows閲屾彁渚涗簡涓涓潪甯稿ソ鐨勫伐鍏鳳紝adplus.vbs銆備粠鍚嶅瓧鍙互鐪嬪嚭錛屽疄闄呬笂鏄竴涓獀b鑴氭湰錛屽彧鏄cdb璋冭瘯鍣ㄤ綔鐨勪竴涓寘瑁呰剼鏈?/p>
鍏惰礬寰勪笌Debugging Tools for Windows鐨勫畨瑁呰礬寰勭浉鍚岋紝浣跨敤鐨勬柟娉曚篃寰堢畝鍗曪紝濡備笅鎵紺?
adplus.vbs -hang -p 1234 -o d:\dump
鍏朵腑-hang鎸囨槑浣跨敤hang妯″紡錛屼害鍗沖湪榪涚▼榪愯榪囩▼涓檮鍔犱笂鍘籹napshot鎶撳彇涓涓猟ump鏂囦歡錛屽畬鎴愪箣鍚巇etach銆備笌涔嬪搴旂殑鏄?crash宕╂簝妯″紡錛岀敤鎴峰厛鍚姩adplus錛岀劧鍚庣敱瀹冨惎鍔ㄨ鐩戞帶鐨勭▼搴忥紝鍦ㄥ嚭鐜板紓甯稿穿婧冩椂鑷姩鐢熸垚dump鏂囦歡錛屾垨鑰呴氳繃Ctrl-C浜轟負鍙戝嚭鎶撳彇鎸囦護銆備絾鏄?crash妯″紡鍦ㄦ姄鍙栧畬鎴愪箣鍚庯紝琚洃鎺х殑榪涚▼灝卞繀欏葷粓姝€傚洜姝ゆ垜浠湪榪欓噷鍙夌敤-hang妯″紡銆?/p>
-p鏄璋冭瘯鐨勮繘紼婭D錛屾瘮濡侫SP.NET搴旂敤綰跨▼姹狅紝鍦╓in2003涓嬪氨鏄痺3wp.exe
-o 鎸囧畾瑕乷utput鐨刣ump鏂囦歡璺緞銆?/p>
鍙﹀錛屼笌adplus綾諱技鐨勶紝鏈変釜UserDump宸ュ叿錛屼絾鏄姄鍙栫敤鎴鋒ā寮忕殑榪涚▼錛岃宎dplus鍒欐槸鍐呮牳妯″紡鍜岀敤鎴鋒ā寮忎袱鑰呯殕鍙?/p>
鑰屾繪墍鍛ㄨ嚦鐨凞r. Waston錛屽垯浼氬湪榪涚▼宕╂簝涔嬪悗鐨勮嚜鍔ㄦ椂鍊欐姄鍙杁ump鏂囦歡錛屼竴鏍峰彲浠ョ敤浜巜indbg絳夎皟璇曞櫒鏉ヤ簨鍚庡垎鏋愮▼搴忓穿婧冩椂鐨勭姸鎬併?/p>
錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳
0:000> !dumpheap -stat
No export dumpheap found
======瑙e喅鏂規硶錛?br>.load clr20\sos.dll錛屼綘瑕佸厛鎵ц鐨勩俿os.dll鍦ㄩ粯璁ょ殑c:\windows\microsoft.net\framework\v2.....涓嬮潰錛屼綘澶嶅埗鍒癱:\program files\debugging tools for windows涓嬮潰鐨刢lr20鐩綍涓嬮潰錛坈lr20鏄綘鎵嬪伐鍒涘緩鐨勶級
錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛?br>
鍦?NET涓嬪紑鍙戞椂錛屾渶鍩烘湰鐨勮皟璇曟柟娉曞氨鏄嬌鐢╒isual Studio鐨勫崟姝ヨ皟璇曘備絾鏄浜庝竴浜涚壒孌婃儏鍐碉紝鐗瑰埆鏄秹鍙婂埌CLR鍐呴儴鐨勬椂鍊欎嬌鐢ㄨ繖縐嶆柟寮忓氨杈句笉鍒扮洰鐨勪簡銆?
濡傛灉瑕佹煡鐪嬭繍琛屾椂鍐呭瓨浣跨敤鎯呭喌錛孖L浠g爜錛孋LR淇℃伅絳夊彲浠ヤ嬌鐢ㄤ互涓嬩袱縐嶆柟寮忥細
1銆佷嬌鐢╒S2005 + sos.dll
2銆佷嬌鐢╓indbg + sos.dll
絎簩縐嶆柟寮忓姛鑳芥洿鍔犲己澶э紝涓嬮潰鎴戝氨閫氳繃瀹為檯鎿嶄綔灞曠ず涓涓嬫庝箞浣跨敤榪欑鏂規硶寰楀埌榪愯鏃禔rrayList鍐呴儴鐨勫箋?
鏈変漢鍙兘浼氳錛氭垜鐩存帴鐢╒isual Studio鐨勫崟姝ヨ皟璇曞矀涓嶆槸鏇村揩錛熷綋鐒訛紝榪欎釜鍙槸涓涓紨紺猴紝閫氳繃榪欎釜婕旂ず鏄負浠ュ悗鐨勯珮綰ц皟璇曟墦涓嬪熀紜
鍦ㄦ搷浣滀箣鍓嶏紝鍏堢啛鎮変竴涓嬪熀鏈煡璇嗭細
A銆佷嬌鐢╒S2005 + sos.dll璋冭瘯
1銆侀渶瑕佸湪欏圭洰->灞炴?>璋冭瘯-銆夊惎鐢ㄩ潪鎵樼浠g爜璋冭瘯
2銆佹墦寮璋冭瘯-銆夌獥鍙?銆夊嵆鏃?
3銆佸湪鍗蟲椂紿楀彛涓緭鍏?!load sos 鍔犺澆璋冭瘯妯″潡
4銆佽緭鍏ュ叾瀹冭皟璇曡鍙?
B銆佷嬌鐢╓indbg + sos.dll
1銆佸幓寰蔣鐨勭綉绔欎笅杞芥渶鏂扮殑Windbg
2銆佹墦寮Windbg鍦‵ile-銆塖ymbol File Path ...紿楀彛涓緭鍏?srv*c:\symbols*http://msdl.microsoft.com/download/symbols
3銆佽繍琛岄渶瑕佽皟璇曠殑紼嬪簭錛岀劧鍚庡湪Windbg涓璅ile-銆堿ttach to Process涓夋嫨鍒氭墠榪愯鐨勭▼搴?
4銆佸湪鍑虹幇鐨凜ommand紿楀彛涓氨鍙互杈撳叆璋冭瘯璇彞
5銆佸父鐢ㄨ皟璇曡鍙ワ細
lm //鏌ョ湅鍔犺澆浜嗗摢浜涙ā鍧?
.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll //鍔犺澆璋冭瘯妯″潡
ld TestClass //鍔犺澆璋冭瘯絎﹀彿
!name2ee TestClass.exe TestClass.Program.test //鏄劇ずtest鏂規硶鐩稿叧鐨勫湴鍧
!dumpmt -md 00976d48 //寰楀埌綾葷殑鎴愬憳鍑芥暟璇︾粏淇℃伅
!dumpil 00973028 // 鏄劇ず榪欎釜鏂規硶琚紪璇戝櫒緙栬瘧涔嬪悗鐨処L浠g爜
!dumpheap -stat //璇ュ懡浠ゆ樉紺虹▼搴忎腑鎵鏈夊璞$殑緇熻淇℃伅錛屾樉紺虹殑澶у皬鏄璞℃湰韜殑澶у皬錛屼笉鍖呮嫭瀵硅薄閲岄潰鍊肩殑澶у皬
!dumpheap -mt 790fcb30 //璇ュ懡浠ゆ樉紺篗ethodTable 790fcb30鐨勮緇嗕俊鎭?
!gcroot 012919b8 //鏉ユ樉紺轟竴涓疄渚嬬殑鎵灞炲叧緋?
!dumpobj(do) 012a3904 //鏄劇ず涓涓璞$殑鍏蜂綋鍐呭錛岀湅瀵硅薄閲岄潰鏈変粈涔堬紝鍊兼槸浠涔?
!ObjSize 012a1ba4 //瀵硅薄瀹為檯鍦ㄥ唴瀛樹腑鐨勫ぇ灝?
!eeheap -gc //鏌ョ湅鎵樼鍫嗙殑鎯呭喌(鍖呮嫭澶у皬)
!DumpArray //鏌ョ湅鏁扮粍淇℃伅
涓嬮潰灝辨潵鐪嬬湅鍏蜂綋鐨勮皟璇曟楠わ細
1銆佹垜浠殑嫻嬭瘯浠g爜
namespace TestClass
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add("aaaa");
list.Add("bbbb");
Console.ReadLine();
}
}
}寰堢畝鍗曪紝灝辨槸涓涓狝rrayList
榪愯榪欎釜紼嬪簭(寮濮嬫墽琛岋紝涓嶈皟璇?錛岀劧鍚庤繘鍏indbg錛孉ttach鍒拌繖涓繘紼?
2銆佹煡鐪嬫墍鏈夊爢鏍堜俊鎭?
0:004> !dumpheap -stat
MT Count TotalSize Class Name
7910062c 1 12 System.Security.Permissions.SecurityPermission
7918e284 1 16 System.IO.TextReader+SyncTextReader
79102d10 1 20 Microsoft.Win32.SafeHandles.SafeFileMappingHandle
79102cb4 1 20 Microsoft.Win32.SafeHandles.SafeViewOfFileHandle
79101d30 1 20 System.Text.InternalEncoderBestFitFallback
79100a7c 1 20 Microsoft.Win32.SafeHandles.SafeFileHandle
79105cd4 1 24 System.Collections.ArrayList
......
7912ad90 11 9036 System.Object[]
790fcb30 2083 131492 System.String
Total 2202 objects
闄や簡鎴戜滑鐨凙rrayList澶栵紝榪樻湁寰堝鍏跺畠鐨勭郴緇熶俊鎭紝鍏堜笉鐢ㄧ瀹?
3銆佹煡鐪嬫垜浠殑ArrayList鐨勪俊鎭?
0:004> !dumpheap -mt 79105cd4
Address MT Size
012a1b88 79105cd4 24
total 1 objects
Statistics:
MT Count TotalSize Class Name
79105cd4 1 24 System.Collections.ArrayList
Total 1 objects
4銆佹煡鐪嬪搴斿湴鍧鍐呴儴瀹為檯鐨勫?
0:004> !do 012a1b88
Name: System.Collections.ArrayList
MethodTable: 79105cd4
EEClass: 79105c28
Size: 24(0x18) bytes
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
7912ad90 40008df 4 System.Object[] 0 instance 012a1bb0 _items
791018e0 40008e0 c System.Int32 1 instance 2 _size
791018e0 40008e1 10 System.Int32 1 instance 2 _version
790fc35c 40008e2 8 System.Object 0 instance 00000000 _syncRoot
7912ad90 40008e3 1c0 System.Object[] 0 shared static emptyArray
>> Domain:Value 00149c58:012a1ba0 <<
鍙互鐪嬪埌ArrayList鐨勫ぇ灝忎負2錛屽叿浣撶殑鍊間繚瀛樺湪鍦板潃012a1bb0涓紝鏄竴涓猄ystem.Object[]綾誨瀷鐨勬暟緇?
5銆佹煡鐪嬫暟緇勪俊鎭?
0:004> !DumpArray 012a1bb0
Name: System.Object[]
MethodTable: 7912ad90
EEClass: 7912b304
Size: 32(0x20) bytes
Array: Rank 1, Number of elements 4, Type CLASS
Element Methodtable: 790fc35c
[0] 012a1b50
[1] 012a1b6c
[2] null
[3] null
6銆佹煡鐪嬫暟緇勫唴瀵硅薄鐨勫?
0:004> !do 012a1b50
Name: System.String
MethodTable: 790fcb30
EEClass: 790fca90
Size: 26(0x1a) bytes
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: aaaa
Fields:
MT Field Offset Type VT Attr Value Name
791018e0 4000096 4 System.Int32 1 instance 5 m_arrayLength
791018e0 4000097 8 System.Int32 1 instance 4 m_stringLength
790fe534 4000098 c System.Char 1 instance 61 m_firstChar
790fcb30 4000099 10 System.String 0 shared static Empty
>> Domain:Value 00149c58:790d81bc <<
7912b1d8 400009a 14 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00149c58:012a16f0 <<
錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳錛濓紳
windbg浣跨敤灝忔葷粨
銆愭姄dump銆?br>1銆佷竴鑸姄娉?br>adplus -hang -p 3230 -quiet 鎶?230 pid榪涚▼錛宧ang妯″紡錛岀浉褰撲簬鎶婇偅涓繘紼嬫殏鍋滀綇錛屽彇鍐呭瓨蹇収
adplus -crash -pn w3wp -quiet 鎶搘3wp榪涚▼錛宑rash妯″紡錛屽綋閭d釜榪涚▼宕╂簝緇撴潫鐨勬椂鍊欒嚜鍔ㄦ姄鍙栧綋鏃剁殑鍐呭瓨
adplus -hang -iis -quiet 鎶揑IS鐩稿叧榪涚▼錛屽寘鎷叾涓奾ost鐨剋eb搴旂敤錛屼互鍙奿is鑷韓
2銆佹姄window鏈嶅姟
http://support.microsoft.com/kb/824344/zh-cn
3銆佽繙紼嬫姄
http://blog.joycode.com/tingwang/archive/2006/08/11/79763.aspx
4銆佹姄钃濆睆鍜屾鏈虹殑dump
鐢佃剳鏃犳晠閲嶅惎鎴栬呰摑灞忎細鍦–:\WINDOWS\Minidump\涓嬩繚瀛樹竴涓猰inidump錛屼絾鏄繖涓猰inidump鍙敤鐨勫懡浠ゅ緢灝戯紝涓鑸彧鎵?analyze –v鐪嬪埌鏄摢涓繘紼嬪紩璧風殑錛岃繕鏈夌浉鍏崇殑椹卞姩妯″潡灝卞熀鏈畾浣嶉棶棰樹簡銆?br>5銆両IS鍥炴敹鐨勬椂鍊欐姄
http://blog.yesky.com/blog/omakey/archive/2006/12/17/1618015.html
6銆佽鍒掍換鍔℃姄
姣斿涓涓繘紼嬭搗鏉ュ悗涓嶇煡閬撳畠浠涔堟椂鍊欎細鎰忓宕╂簝錛屽彲浠ュ湪璁″垝浠誨姟閲岀敤crash閲屾姄錛屽綋閭d釜榪涚▼鎰忓緇堟鐨勬椂鍊欙紝cdb鍙互鐩存帴闄勫姞涓婂幓錛屾姄鍙栧綋鏃剁殑dump錛屽鏋滆鎶撲竴浜涗細鑷姩閲嶅惎鐨勮繘紼嬶紝鑰屼笖瑕佹姄姣忔閲嶅惎鍓嶇殑dump錛屽彲浠ュ弬鑰冮檮褰曢噷涓鑺傘?/p>
銆愬父鐢ㄥ懡浠ゃ?br>1銆佸厛path C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727錛屾妸.net璺緞璁劇疆涓簆ath鐜鍙橀噺錛屼竴閬嶅湪windbg閲屽彲浠ョ洿鎺?load sos錛岃屼笉蹇?load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll
2銆乴d demo錛屽姞杞戒綘紼嬪簭鐨刾db鏂囦歡錛岃皟璇?net紼嬪簭涓鑸鎶妅ernel32鍜宮scorwks鐨勭鍙峰姞杞戒笂錛屽叧浜庤繖涓や釜涓滆タ澶у鍙互鏌ヨ祫鏂欙紝灝ゅ叾鏄悗鑰呮湁鍝簺鍑芥暟鍙互澶氫簡瑙d竴浜涖?br>3銆佸湪windbg鐨刦ile/symbol file path瀵硅瘽妗嗛噷杈撳叆浠ヤ笅鏂囧瓧錛屼互渚胯嚜鍔ㄥ姞杞藉拰涓嬭澆絎﹀彿
C:\WINDOWS\Symbols;d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\symbols;.sympath SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols
鍏朵腑鏈墂indows銆?net2.0鍜岃嚜鍔ㄤ粠緗戜笂涓嬭澆鐨勮皟璇曠鍙鳳紝娉ㄦ剰鏍規嵁鑷繁鐨勬儏鍐甸傚綋淇敼鐩綍
銆愯皟璇曟閿併?br>1銆?syncblk錛屾煡鐪嬪摢浜涚嚎紼嬫嬁鍒頒簡閿?br>2銆亊67e!clrstack 璺沖埌鏌愪釜鎷垮埌閿佺殑綰跨▼鐪嬪畠姝e湪騫蹭粈涔堟搷浣滐紝榪熻繜涓嶈偗閲婃斁閿?br>3銆?runaway 鏌ョ湅榪欎釜鍗犳湁閿佺殑綰跨▼榪愯浜嗗闀挎椂闂淬?br>4銆亊*e!clrstack鏌ョ湅鎵鏈夌嚎紼嬬殑鎵樼鍫嗘爤錛岀湅鐪嬪摢浜涙槸姝e湪絳夊緟閿佺殑錛屾瘮濡俬ang鍦⊿ystem.Threading.Monitor.Enter(System.Object)
5銆亊136s閫夋嫨璇ョ嚎紼嬶紝鏄劇ず濡備笅
0:000> ~136s eax=00005763 ebx=08deeb5c ecx=03eff0d4 edx=5570ab69 esi=08deeb5c edi=7ffd6000 eip=7c95ed54 esp=08deeb10 ebp=08deebb8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c95ed54 c3 ret
鎵懼埌ecx瀵勫瓨鍣ㄧ殑鍊鹼紝澶嶅埗鍚巆trl+f錛屽悜涓婃煡鎵撅紝浼氭壘鍒?syncblk鐨勫湴鏂癸紝濡備笅
0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 1906 03ee4be4 5 1 03ee8f88 22c8 67 185e2ef0 System.Object 5390 052ca39c 3 1 05292b30 1dd4 49 1060d3ac System.Object 9372 0530702c 15 1 0012d3a8 1aa8 80 185e7704 System.Object 11428 03eff0d4 35 1 053b8fa8 169c 120 166acd98 System.Object 15278 0531c6b4 61 1 06bc1430 26d8 86 1a5bea88 System.Object
鍙互鐪嬪埌136綰跨▼絳夊緟鐨勯攣琚?20鍙風嚎紼嬪崰鐫涓嶆斁錛堟牸寮忔湁鐐逛貢錛屽噾鍚堢湅錛夛紝
6銆佹湁鏃跺欓氳繃ecx瀵勫瓨鍣ㄦ壘閿佷笉鏄緢紜畾錛屽彲浠ョ敤~* kb鏉ユ妸鎵鏈夌嚎紼嬪爢鏍堟墦鍑烘潵錛岀劧鍚庢牴鎹?syncblk鍑烘潵鐨勫悓姝ュ揩鐨勫煎幓鎼滅儲澶ф鏈夊灝戜釜綰跨▼鍦ㄧ瓑閭d釜閿併傚洜涓哄悓鏍鋒槸絳夊緟閿侊紝鍙瓑鐨勭姸鎬佷笉涓鏍鳳紝鏈夌殑鍦≦閲岋紝鏈夌殑閿佸凡緇忓崌綰э紝鏈夌殑鍘誨皾璇曞幓鎷塊攣浜嗭紝鎵浠ヤ笉涓瀹氬綋鏃秂cx瀵勫瓨鍣ㄦ寚鍚戦偅鍧楀唴瀛橈紝鍏蜂綋濡備綍鎵懼埌鏌愪釜姝e湪絳夊緟閿佺殑綰跨▼絳夊緟鐨勯攣鐨勫唴瀛樺湴鍧錛屼互鍙婂畠姝g瓑寰呯殑榪欎釜閿佽鍝釜綰跨▼鎷跨潃錛屾垜榪樻病鐞㈢(鍑鴻寰嬫潵錛屼絾涓鑸儏鍐典笅錛屽鏋滄湁鍏跺畠鍚屾瀵硅薄鐨勮瘽錛屾洿闅炬煡銆?net閲岀敤鎴戜笂闈㈣鐨勫嚑姝ュ氨鑳芥煡鍑洪攣鐨勯棶棰樹簡銆?/p>
銆愬唴瀛樻硠婕忋?br>1銆?dumpheap -stat鐪嬬湅鍝簺瀵硅薄涓暟鏈澶氾紝鍗犲唴瀛樻渶澶э紝
2銆佹壘鍒版煇涓牸寮忔瘮杈冨鐨勫璞★紝鍙互鐪嬪畠鐨勬柟娉曡〃錛岀劧鍚庣敤!dumpheap -mt 66398fa4鍘婚殢鏈烘壘鍑犱釜瀵硅薄鐨勫湴鍧
3銆佺敤!do 1e5a22bc鍛戒護鍘繪煡鐪嬪嚑涓璞$殑鐘舵侊紝灞炴х殑鍊肩瓑錛岀湅鐪嬫甯鎬笉姝e父
4銆佺敤!gcroot -nostacks 1e5a22bc鍘繪煡鐪嬪嚑涓璞$殑鏍規甯鎬笉姝e父錛屽鏋滄湁浜涘璞$殑鏍逛笉鏄嚜宸遍鍏堣璁$殑閭f牱錛屽緢鍙兘琚嚜宸辨病鎯沖埌鐨勫璞″己寮曠敤浜嗭紝鎵浠C鏃犳硶鍥炴敹瀹冿紝灝辨硠婕忎簡銆?br>銆怌PU鐧懼垎鐧俱?br>涓昏鐢ㄥ嚑涓鏁板櫒鍜?runaway鍛戒護錛屽叿浣撹浠ヤ笅閾炬帴
http://www.cnblogs.com/onlytianc ... 7/06/03/769307.html
銆愮嚎紼嬫睜鑰楀敖銆?br>!threadpool 鑳界湅鍒板畬鎴愮鍙o紝綰跨▼姹犲伐浣滅嚎紼嬪拰timer鍥炶皟鍚勫崰綰跨▼姹犵殑鎯呭喌銆?br>銆愬叾瀹冦?br>1銆?eestack -short -ee鏌ョ湅鎵鏈夐噸瑕?鑾峰彇閿佺殑錛屾墭綆$殑錛屽仠姝㈠茍鍏佽鍥炴敹鐨?綰跨▼鐨刣umpstack錛屽樊涓嶅鐩稿綋浜巭*e!dumpstack
2銆?time 鍙互鐪嬪埌榪涚▼璺戜簡澶氬皯鏃墮棿
3銆?dso 鏌ョ湅褰撳墠綰跨▼閲屾湁鍝簺瀵硅薄錛屽垎鏋愬唴瀛樻硠婕忛棶棰樹篃璁鎬細鐢ㄥ埌
銆愬皬緇撱?br>瑕佹兂寰堝ソ鐨勭敤windbg鎺掓煡.net闂錛岄鍏堣浜嗚В涓浜沜lr瀹夸富鐨勫熀紜鐭ヨ瘑錛屼互鍙奍L鐨勪竴浜涘熀紜錛岃繕鏈夌畝鍗曠殑瀵勫瓨鍣ㄥ拰姹囩紪灝濊瘯錛屽啀灝辨槸鏈変釜濂界殑鎬濊礬錛屾渶鍚庡氨鏄粡楠屽拰瀵逛唬鐮侀昏緫鐨勭悊瑙c?/p>
銆愰檮褰曪細鍐欎簡涓涓嚜鍔ㄦ姄dump鐨勫伐鍏鳳紝鍙湪紼嬪簭寮傚父閫鍑虹殑鏃跺欐姄dump銆?br>銆愪嬌鐢ㄦ柟娉曘?br>1銆佸厛鍦╟md涓嬭繍琛屼互涓嬪懡浠ょ‘淇濊鍒掍換鍔″紑鐫
net start "task scheduler"
2銆佹墽琛屼互涓嬪懡浠ゅ畨鎺掕嚜鍔ㄦ姄鍖?br>at 13:27 d:\myapp\autodump\processmon.exe
鍏朵腑璁″垝鍚姩鐨勬椂闂村拰鑷姩鎶撳寘鐨勭▼搴忚礬寰勮鏍規嵁鎯呭喌璁劇疆錛岃鍒掑惎鍔ㄤ箣鍓嶅綋鍓嶇敤鎴蜂竴瀹氳娉ㄩ攢銆?br>銆愮浉鍏抽厤緗?br><appSettings>
<add key="adplusPath" value="D:\MyApp\Debugging\adplus.vbs"/><!--adplus鐨勮礬寰?->
<add key="ProcessName" value="w3wp"/><!--瑕佹姄dump鐨勮繘紼嬬殑鍚嶅瓧錛屽彲鐢ㄩ儴鍒嗗悕瀛楋紝涓嶇敤瀹屾暣鐨?->
</appSettings>
銆愭簮鐮併?/p>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
namespace ProcessMon
{
class Program
{
static readonly List<int> _dumpPIDs = new List<int>();
private static readonly string _processName = System.Configuration.ConfigurationManager.AppSettings["ProcessName"];
private static readonly string _adplusPath = System.Configuration.ConfigurationManager.AppSettings["adplusPath"];
static void Main(string[] args)
{
while(true)
{
Console.WriteLine("..");
ThreadProc();
Thread.Sleep(10000);
}
}
private static void ThreadProc()
{
foreach(Process vProcess in Process.GetProcesses())
{
try
{
string processName = vProcess.ProcessName.ToLower();
if (processName.IndexOf(_processName) >= 0)
{
Console.WriteLine("{0}-{1}", vProcess.ProcessName, vProcess.Id);
if (_dumpPIDs.Contains(vProcess.Id))
continue;
_dumpPIDs.Add(vProcess.Id);
DumpProcessDeg d = DumpProcess;
d.BeginInvoke(vProcess.Id, null, null);
DumpProcess(vProcess.Id);
}
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
}
private delegate void DumpProcessDeg(int pid);
static void DumpProcess(int pid)
{
ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
Info.FileName = _adplusPath;
Info.Arguments = string.Format("-crash -p {0} -quiet",pid);
Info.WorkingDirectory = "C:\\";
Process Proc ;
try
{
Proc = Process.Start(Info);
}
catch(System.ComponentModel.Win32Exception e)
{
Console.WriteLine("緋葷粺鎵句笉鍒版寚瀹氱殑紼嬪簭鏂囦歡銆俓r{0}", e);
return;
}
Proc.EnableRaisingEvents = true;
Console.WriteLine("澶栭儴紼嬪簭鐨勫紑濮嬫墽琛屾椂闂達細{0}", Proc.StartTime);
Proc.WaitForExit(60000);
if(Proc.HasExited == false){
Console.WriteLine("鐢變富紼嬪簭寮鴻緇堟澶栭儴紼嬪簭鐨勮繍琛岋紒");
Proc.Kill();
}
else{
Console.WriteLine("鐢卞閮ㄧ▼搴忔甯擱鍑猴紒");
}
Console.WriteLine("澶栭儴紼嬪簭鐨勭粨鏉熻繍琛屾椂闂達細{0}", Proc.ExitTime);
Console.WriteLine("澶栭儴紼嬪簭鍦ㄧ粨鏉熻繍琛屾椂鐨勮繑鍥炲鹼細{0}", Proc.ExitCode);
}
}
}
===============
琛ュ厖鍑犱釜鍛戒護:
1銆?analyze -v 錛氱敤浜庡垎鏋愭寕鎺夌嚎紼嬬殑璇︾粏鎯呭艦錛岄敊璇師鍥犮?/p>
2銆?locks 錛氬垪鍑哄叏閮ㄨ祫婧愪嬌鐢ㄦ儏鍐點?/p>
3銆?locks -v 0x???????? 錛氱壒瀹氬湴鍧鐨勬閿佸垎鏋愩?/p>
4銆?thread 0x????????錛氱壒瀹氱嚎紼嬭鎯呫?/p>
5銆?thread 0x????????錛氳漿鍒版煇涓嚎紼嬪爢鏍堛?br>
瑕佹秷闄ょ獥鍙e璞?蹇呴』娓呮紿楀彛瀵硅薄鐨勬瀯鎴?鍦ㄤ竴涓氬父鐨勭▼搴忎腑錛屽厛鍒涘緩c++紿楀彛瀵硅薄,鐒跺悗鐢盬indows鍒涘緩瀹為檯鐨勭獥鍙g粨鏋?騫惰繑鍥炲彞鏌勪笌c++瀵硅薄榪炴帴.涔熷氨鏄,紿楀彛瀵硅薄鍖呭惈c++紿楀彛瀵硅薄鍜學indows紿楀彛瀵硅薄,涓よ呴氳繃鍙ユ焺HWND鑱旂郴.
鐜板湪,璁╂垜浠湅鐪?姝h"鐨勭獥鍙e璞℃竻闄ゆ祦紼?鎵璋撳璞$殑娓呴櫎鏄寚閲婃斁瀵硅薄鎵鍗犵殑璧勬簮,紿楀彛瀵硅薄涓璚indows紿楀彛瀵硅薄鍗犳湁鐨勬槸緋葷粺璧勬簮,c++瀵硅薄鍗犳湁鐨勬槸鍐呭瓨璧勬簮.閲婃斁緋葷粺璧勬簮鐩稿瑕佺畝鍗曚竴浜?璋冪敤铏氬嚱鏁癉estroyWindow鍒犻櫎Windows紿楀彛瀵硅薄.濡傛灉DestroyWindow鍒犻櫎鐨勬槸鐖剁獥鍙?Windows浼氳嚜鍔ㄤ負瀛愮獥鍙h皟鐢―estroyWindow.涓鑸潵璇?紼嬪簭涓嶅繀璋冪敤DestroyWindow.鍥犱負褰撶敤鎴峰叧闂獥鍙f椂,Windows渚垮彂閫乄M_CLOSE娑堟伅,WM_CLOSE鐨勭己鐪佹秷鎭鐞嗗嚱鏁癈Wnd::OnClose璋冪敤DestroyWindow.
鍒拌繖鏃?娓呴櫎宸ヤ綔宸茬粡瀹屾垚浜嗕竴鍗?灞忓箷涓婄殑紿楀彛宸茬粡涓嶈浜?浣嗘槸鍒繕浜?鍦ㄥ唴瀛樹腑榪樻湁涓涓猚++紿楀彛瀵硅薄.璁╂垜浠啀鐪嬬湅c++瀵硅薄娓呴櫎鐨勮繃紼?褰撶獥鍙h鍙栨秷鏃?紿楀彛鏈鍚庡彂閫佺殑涓涓秷鎭槸WM_NCDESTROY.瀹冪己鐪佺殑娑堟伅澶勭悊鍑芥暟CWnd::OnNcDestroy鎶奵++紿楀彛瀵硅薄涓庡彞鏌凥WND鍒嗙,騫惰皟鐢ㄤ竴涓緢閲嶈鐨勮櫄鍑芥暟PostNcDestroy.榪欎釜鍑芥暟鏄悶娓呯獥鍙e璞℃竻闄ょ殑鍏抽敭.Cwnd涓殑PostNcDestroy浠涔堥兘涓嶅仛.鏈変簺MFC紿楀彛綾諱細閲嶈澆瀹?騫跺姞鍏elete this浠g爜鍒犻櫎c++瀵硅薄.榪欎簺紿楀彛綾誨父甯告槸浠ew鎿嶄綔絎﹀緩绔嬪湪鍫嗕腑鐨?鐢變簬閲嶈澆浜哖ostNcDestroy,浣跨獥鍙f湁鑷姩娓呴櫎鍔熻兘.鍥犳,鎴戜滑涓嶇敤鍏沖績娓呴櫎闂浜?鍙﹀鐨勪竴浜汳FC紿楀彛綾諱竴鑸槸浠ュ彉閲忓艦寮忓垱寤虹殑,MFC娌℃湁涓轟篃娌″繀瑕佷負瀹冧滑閲嶈澆PostNcDestroy鍑芥暟.
涓嶅叿澶囪嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾?涓鑸湪鍫嗘爤涓垱寤烘垨宓屽叆浜庡叾瀹僣++瀵硅薄涓?
鎵鏈夋爣鍑嗙殑Windows鎺т歡綾?濡侰Static, CEdit, CListBox絳夌瓑)
鐢盋Wnd綾葷洿鎺ユ淳鐢熷嚭鏉ョ殑瀛愮獥鍙e璞?濡傜敤鎴峰畾鍒剁殑鎺т歡)
鎷嗗垎紿楀彛綾?CSplitterWnd)
緙虹渷鐨勬帶鍒舵潯綾?CControlBar鐨勬淳鐢熺被)
瀵硅瘽妗嗙被(CDialog)鍦ㄥ爢鏍堜笂鍒涘緩鐨勬ā鎬佸璇濇綾?/p>
鎵鏈夌殑Windows閫氱敤瀵硅瘽妗?闄FindReplaceDialog)
鐢盋lassWizard鍒涘緩鐨勫璇濇
鍏鋒湁鑷姩娓呴櫎鍔熻兘鐨勭獥鍙g被,涓鑸湪鍫嗕腑鍒涘緩:
涓繪鏋剁獥鍙g被(鐩存帴鎴栭棿鎺ヤ粠CFrameWnd綾繪淳鐢?
瑙嗗浘綾?鐩存帴鎴栭棿鎺ヤ粠CView綾繪淳鐢?
浠庢煇縐嶇▼搴︿笂鏉ヨ,MFC鐨?鏈嶅姟鍒板"浣垮垵瀛﹁呮湁浜涙壘涓嶇潃鍖?涓嶈繃,涓嶅緱涓嶆壙璁?MFC騫茬殑寰堟紓浜?
璋堝埌榪欓噷,鎴戜滑搴旇鏄庣櫧c++閲屼竴鏉¢噸瑕佺殑鍑嗗垯:鐢―estroyWindow娓呴櫎紿楀彛瀵硅薄,涓嶈鐢?delete".
瀵逛簬涓嶅叿澶囪嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾諱嬌鐢?delete"鏃?"delete"鍏堣皟鐢ㄦ瀽鏋勫嚱鏁伴噷鐨凞estroyWindow,鐢變簬鍦ㄦ瀽鏋勫嚱鏁頒腑,铏氭満鍒朵笉璧蜂綔鐢?榪欓噷鍙兘璋冪敤鏈湴鐗堟湰(Cwnd綾?DestroyWindow鍑芥暟,鏄劇劧榪欎笉鏄垜浠兂瑕佺殑.瀵逛簬鏈夎嚜鍔ㄦ竻闄ゅ姛鑳界殑紿楀彛綾?濂借薄闂鏇翠弗閲嶄竴鐐?鍓嶉潰鎻愬埌浜嗛噸杞界殑PostNcDestroy宸茬粡鍚湁浜?delete this",榪欐牱c++瀵硅薄灝辮閲婃斁浜嗕袱嬈?
寰堝浜鴻涓?vc++鍚寁b涓鏍?鏄竴涓畬鍏ㄥ彲瑙嗗寲鐨勪駭鍝?涓嶇敤鍦ㄧ湅c++鐨勪功浜?閫氳繃涓婇潰瀵圭獥鍙e璞$殑娓呴櫎鐨勪粙緇?鍙互鍙戠幇,Windows紼嬪簭鏄笌Windows绱у瘑緇撳悎鐨?鑰屼笖鐗墊秹鍒板緢澶歝++鐨勭煡璇?濡傝櫄鍑芥暟銆佹瀽鏋勫嚱鏁般乶ew鎿嶄綔絎︾瓑).瑕佸vc++鏈夎繘涓姝ョ悊瑙?蹇呴』鐞嗚ВWindows鏈哄埗,娣卞叆瀛︿範c++.
銆銆涓銆佷笌鍔犻熼敭琛ㄦ湁鍏崇殑鍑犱釜API鍑芥暟鍜岀粨鏋勩?/p>
銆銆鎿嶄綔鍔犻熼敭琛ㄤ嬌鐢ㄧ殑鍑犱釜API鍑芥暟錛堝叧浜庤繖鍑犱釜鍑芥暟鐨勮緇嗚鏄庤鍙傝冩湁鍏充功綾嶏級錛?br>銆銆HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableNAme);
銆銆LoadAccelerators鍑芥暟浠庣▼搴忕殑璧勬簮涓姞杞戒竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝鍔犺澆鎴愬姛鍚庤繑鍥炰竴涓姞閫熷仴琛ㄧ殑鍙ユ焺銆傚叾涓細
銆銆hInstance銆銆搴旂敤紼嬪簭鐨勫疄渚嬪彞鏌勩?br>銆銆lpTableName銆鎸囧悜鍔犻熼敭琛ㄥ悕縐板瓧絎︿覆鐨勬寚閽堛?/p>
銆銆HACCEL CreateAcceleratorTable(LPACCEL lpaccl, int cEntries);
銆銆CreateAcceleratorTable鍑芥暟鏍規嵁涓涓狝CCEL緇撴瀯鏁扮粍鍒涘緩涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ傝鍑芥暟涓嶭oadAccelerators涓嶅悓鐨勬槸錛歀oadAccelerators鍑芥暟鍔犺澆鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ湪紼嬪簭緇撴潫鍚庣郴緇熶細鑷姩灝嗚鍔犻熼敭琛ㄤ粠鍐呭瓨涓竻闄わ紝浣咰reateAcceleratorTable鍑芥暟鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄩ渶瑕佷嬌鐢ㄥ嚱鏁癉estoryAceleratorTable鍑芥暟榪涜娓呴櫎銆?br>銆銆lpaccl銆銆銆涓涓寚鍚慉CCEL緇撴瀯鏁扮粍鐨勬寚閽堛?br>銆銆cEntries銆銆鏁扮粍涓厓绱犵殑涓暟銆?/p>
銆銆BOOL銆DestoryAcceleratorTable(HACCEL hAccel);
銆銆DestoryAcceleratorTable鍑芥暟娓呴櫎鐢盋reateAcceleratorTable鍑芥暟鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝鎴愬姛鍒欒繑鍥濼RUE銆傚叾涓細
銆銆hAccel銆銆銆闇瑕佹竻闄ょ殑鍔犻熼敭琛ㄥ彞鏌勩?/p>
銆銆int TranslateAccelerator(HWND hWd, HACCEL hAccTable, LPMSG lpMsg);
銆銆TranslateAccelerator鍑芥暟璐熻矗緲昏瘧鍔犻熼敭銆傚叾涓細
銆銆hWnd銆銆銆銆 紿楀彛鍙ユ焺錛岀炕璇戝悗鐨勬秷鎭皢琚彂寰璇ョ獥鍙?br>銆銆hAccTable銆銆鍔犻熼敭琛ㄥ彞鏌勩?br>銆銆lpMsg銆銆銆銆鎸囧悜MSG緇撴瀯鐨勬寚閽堛?/p>
銆銆ACCEL緇撴瀯鐨勫畾涔夛細
typedef struct tagACCEL{
BYTE fVirt;
WORD key;
WORD cmd;
}ACCEL,*LPACCEL;
鍏朵腑錛?br>銆銆fVirt銆銆銆鍔犻熼敭鐨勬爣璁般?br>銆銆key銆銆銆銆閿殑浠g爜銆傚fVirt鎴愬憳鍖呭惈FVIRTKEY鏍囧織錛屽垯key鎸囦竴涓櫄閿爜錛屽惁鍒欐槸涓涓狝SCII鐮併?br>銆銆cmd銆銆銆銆鍛戒護ID鍙鳳紝璇ュ弬鏁板皢琚斁鍏M錛緾OMMAND鎴朩M錛縎YSCOMMAND娑堟伅鐨剋Param鍙傛暟鐨勪綆浣嶅瓧鍙戣嚦紿楀彛銆?/p>
銆銆浜屻佸湪windows涓嬪浣曚嬌鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?/p>
銆銆鍦╳indow涓嬩嬌鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄤ竴鑸湁涓ょ鏂規硶錛?錛屽垱寤轟竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭璧勬簮錛屽湪紼嬪簭涓嬌鐢ˋPI鍑芥暟LoadAccelerators鏉ュ皢鍔犻熼敭琛ㄥ姞杞藉叆鍐呭瓨銆傚茍鍦ㄦ秷鎭驚鐜腑浣跨敤API鍑芥暟TranslateAccelerator鏉ョ炕璇戣鍔犻熼敭琛ㄣ?銆佸湪紼嬪簭涓~鍏呬竴涓狝CCEL鏁扮粍銆傜劧鍚庤皟鐢ˋPI鍑芥暟CreateAcceleratorTable鏉ュ垱寤哄姞閫熻〃錛岀炕璇?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍚屼笂錛屼絾涓嶈蹇樿鍦ㄩ鍑虹▼搴忓墠浣跨敤API鍑芥暟DestoryAcceleratorTable鏉ユ竻闄ゅ畠銆備笅闈㈠垎鍒粰鍑轟竴涓緥瀛愶細
/*渚?:浣跨敤LoadAccelerators銆?br>銆鍋囪浣犲凡緇忓緩绔嬩簡涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭璧勬簮錛孖D涓篒DR錛緼CCEL銆?br>銆鍋囪浣犲凡緇忓畾涔変簡鍒濆鍖栧嚱鏁癐nitApplication(HINSTANCE hInstance,int nCmdShow),
銆璇ュ嚱鏁版墽琛屾敞鍐岀獥鍙g被鍜屽垱寤虹獥鍙f搷浣溿?br>*/
#include <windows.h>
#include "rc/resource.h"
BOOL InitApplication(HINSTANCE hInstance,int nCmdShow);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HANDLE hAccelTable;
// 鍒濆鍖栧簲鐢ㄧ▼搴忥紝騫剁敓鎴愪富紿楀彛.
if (!InitApplication(hInstance, nCmdShow))
{
return FALSE; // 鍒濆鍖栧け璐?br> }
//浣跨敤鍑芥暟LoadAccelerators浠庣▼搴忚祫婧愪腑鍔犺澆鍔犻熼敭琛?br> hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL));
// 鍙栧緱騫跺垎鍙戞秷鎭洿鍒版帴鏀跺埌 WM_QUIT 娑堟伅.
while (GetMessage(&msg, NULL, 0, 0))
{
//鍦ㄥ垎鍙戞秷鎭墠棣栧厛璇曠潃鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀炕璇戯紝濡傛灉鏄竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍒欑敱
//TranslateAccelerator鍑芥暟榪涜緲昏瘧錛屼笉鍐嶇戶緇鐞嗚娑堟伅銆?br> if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam; // Returns the value from PostQuitMessage
}
/*渚?:浣跨敤CreateAcceleratorTable銆?br>銆鍋囪浣犲凡緇忓畾涔変簡鍒濆鍖栧嚱鏁癐nitApplication(HINSTANCE hInstance,int nCmdShow),
銆璇ュ嚱鏁版墽琛屾敞鍐岀獥鍙g被鍜屽垱寤虹獥鍙f搷浣溿?br>*/
#include <windows.h>
#include "rc/resource.h"
錛僤efine ID_CMD_A 0x00000230
錛僤efine ID_CMD_B 0x00000231
錛僤efine ID_CMD_C 0x00000232
錛僤efine ID_CMD_D 0x00000233
錛僤efine ID_CMD_E 0x00000234
錛僤efine ID_CMD_F 0x00000235
錛僤efine ID_CMD_G 0x00000236
//瀹氫箟浜嗕竷涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭,璇峰湪娑堟伅鍥炶皟鍑芥暟涓鐞嗚繖涓冧釜鍛戒護ID銆?br>static ACCEL accel[]={
{FVIRTKEY|FCONTROL,VK_F5,ID_CMD_A},
{FVIRTKEY|FCONTROL,VK_F6,ID_CMD_B},
{FVIRTKEY|FCONTROL,VK_HOME,ID_CMD_C},
{FVIRTKEY|FCONTROL,VK_END,ID_CMD_D},
{FVIRTKEY|FCONTROL,"G",ID_CMD_E},
{FVIRTKEY|FCONTROL,VK_SPACE,ID_CMD_F},
{FVIRTKEY|FCONTROL,"K",ID_CMD_G},
};
BOOL InitApplication(HINSTANCE hInstance,int nCmdShow);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HANDLE hAccelTable;
// 鍒濆鍖栧簲鐢ㄧ▼搴忥紝騫剁敓鎴愪富紿楀彛.
if (!InitApplication(hInstance, nCmdShow))
{
return FALSE; // 鍒濆鍖栧け璐?br> }
//浣跨敤鍑芥暟CreateAcceleratorTable浠庢暟緇刟ccel涓姞杞?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛?br> hAccelTable = CreateAcceleratorTable(accel, sizeof(accel)/sizeof(ACCEL));
// 鍙栧緱騫跺垎鍙戞秷鎭洿鍒版帴鏀跺埌 WM_QUIT 娑堟伅.
while (GetMessage(&msg, NULL, 0, 0))
{
//鍦ㄥ垎鍙戞秷鎭墠棣栧厛璇曠潃鐢?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀炕璇戯紝濡傛灉鏄竴涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鍒欑敱
//TranslateAccelerator鍑芥暟榪涜緲昏瘧錛屼笉鍐嶇戶緇鐞嗚娑堟伅銆?br> if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//鍒犻櫎鍔犻熼敭琛?br> DestoryAcceleratorTable(hAccelTable);
return msg.wParam; // Returns the value from PostQuitMessage
}
銆銆鍦∕FC紼嬪簭璁捐涓紝鏈夊叧浜?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑鎿嶄綔宸茬粡琚獵FrameWnd綾昏繘琛屼簡灝佽銆傞氬父錛屾垜浠殑紼嬪簭鐨勪富妗嗘灦綾籆MainFrame浠嶤FrameWnd綾繪淳鐢燂紙SDI鐣岄潰紼嬪簭錛夛紝鎴栬呬粠CMDIFrameWnd綾繪淳鐢燂紙MDI鐣岄潰紼嬪簭錛夛紝鑰孋MDIFrameWnd綾諱篃鏄粠CFrameWnd綾繪淳鐢熺殑銆傛墍浠ワ紝鎴戜滑騫朵笉鐢ㄥ幓鍏沖績閭d釜璧勬簮鍙蜂負IDR_MAINFRAME鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄦ槸濡備綍鍔犺澆鐨勶紝濡傛灉浣犲彧鏄渶瑕佷竴涓繖鏍風殑闈欐佺殑鍔犻熼敭琛ㄧ殑璇濄?br>銆銆閭d箞鎴戜滑鑳戒笉鑳戒嬌鐢ㄨ嚜宸辯殑鍔犻熼敭琛ㄥ憿錛熺瓟妗堟槸錛氬彲浠ョ殑銆?br>銆銆鍒涘緩鍔犻熼敭琛ㄧ殑鏂規硶鍚屽墠銆傜敱浜庡湪MFC涓紝WinMain鍑芥暟琚殣钘忥紝鎴戜滑涓嶈兘鐩存帴淇敼WinMain鍑芥暟錛屾墍浠ワ紝鍔犻熼敭琛ㄧ殑鍒涘緩灝嗗湪CMainFrame鐨凮nCreate鍑芥暟涓垱寤恒?br>銆銆1銆佸湪CMainFrame綾諱腑娣誨姞涓涓狧ACCEL綾誨瀷淇濇姢鎴愬憳鍙橀噺錛歮_hMyAccel銆傚湪鏋勯犲嚱鏁頒腑鍒濆鍖栦負NULL銆?br>銆銆2銆佸湪CMainFrame::OnCreate鍑芥暟鐨?“return 0;”鍙ュ墠澧炲姞鍒涘緩鍔犻熼敭琛ㄧ殑浠g爜銆傝繑鍥炵殑鍔犻熼敭琛ㄥ彞鏌勪繚瀛樺湪m_hMyAccel涓細
銆銆銆鏂規硶1錛?IDR錛縈YACCEL涓轟綘瀹氫箟鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ祫婧愬彿)
銆銆銆m_hMyAccel=LoadAccelerators(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDR_MYACCEL));
銆銆銆鏂規硶2錛?accel鍚屽墠闈㈢殑渚嬪瓙涓鏍峰湪鏈枃浠剁殑寮澶撮儴鍒嗚繘琛屽畾涔?
銆銆銆m_hMyAccel=CreateAcceleratorTable(accel,sizeof(accel)/sizeof(ACCEL));
銆銆3銆佸鏋滄槸浣跨敤CreateAccelTable鍑芥暟鍒涘緩鐨勶紝鍒欓噸杞借櫄鎷熷嚱鏁癉estoryWindow()銆傚湪璇ュ嚱鏁扮殑“return CMDIFrameWnd::DestroyWindow();”鍓嶅鍔犲涓嬩唬鐮?
if(m_hMyAccel!=NULL){
DestroyAcceleratorTable(m_hMyAccel);
m_hMyAccel=NULL;
}
銆銆閫氳繃鍓嶉潰鐨勪笁姝ワ紝鍔犻熼敭琛ㄥ凡緇忚兘姝g‘鍦拌鍒涘緩鍜屽垹闄や簡錛屼絾鏄畠榪樻病鏈夊伐浣溿備笅闈㈠氨鏄璁╂垜浠垰鎵嶆墍鍒涘緩鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ伐浣滆搗鏉ャ?br>銆銆鍦ˋPI紼嬪簭璁捐涓ぇ瀹跺凡緇忕煡閬撲簡鍔犻熼敭鏄浣曞伐浣滅殑銆備篃灝辨槸鍦ㄦ秷鎭繕娌℃湁鍒嗗彂鍑哄幓涔嬪墠鍏堟鏌ユ槸涓嶆槸涓涓?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭銆傛垜浠氳繃API鍑芥暟TranslateAccelerator鏉ュ疄鐜般傚湪MFC涓紝娑堟伅鏈哄埗宸茬粡琚皝瑁呬簡錛屾垜浠笉鑳藉幓淇敼娑堟伅寰幆銆備絾鏄紝妗嗘灦鍦ㄥ垎鍙戞秷鎭墠浼氳皟鐢ㄨ櫄鎷熷嚱鏁癙erTranslateMessage錛屽茍涓斿鏋滆鍑芥暟榪斿洖TRUE錛屽垯涓嶅啀澶勭悊璇ユ秷鎭傝繖姝f槸鎴戜滑鎵闇瑕佺殑銆?br>銆銆璁╂垜浠啀鍥炲埌CMainFrame綾伙紝鐢熸垚PerTranslateMessage鍑芥暟鐨勮鐩栫増鏈備慨鏀瑰嚱鏁頒綋濡備笅錛?/p>
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(m_hMyAccel&&TranslateAccelerator(m_hWnd, m_hMyAccel, pMsg))
return TRUE;
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
銆銆濂戒簡錛岀幇鍦ㄦ垜浠殑鍔犻熼敭宸茬粡鑳芥甯稿湴宸ヤ綔浜嗐備互涓婃柟娉曠敤鍦ㄥ叾瀹冪獥鍙e悓鏍鋒湁鏁堬紙濡傚璇濇涓紝浣犱笉濡ㄥ湪瀵硅瘽妗嗕腑璇曡瘯錛夈?/p>
銆銆涓夈佸彲鍦ㄨ繍琛屾椂緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?/p>
銆銆閫氳繃涓婇潰鐨勫彊榪幫紝浣犲彲鑳藉凡緇忓鍙紪杈戠殑鍔犻熼敭琛ㄦ湁浜嗕竴瀹氱殑杞粨銆傚叾瀹炲叾瀹炵幇鎬濇兂寰堢畝鍗曪細鍙瀵逛竴涓狝CCEL鏁扮粍榪涜淇敼錛岀劧鍚庨噸鏂扮敓鎴?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ氨琛屼簡銆?br>銆銆涓轟簡鍖哄垎鍛戒護錛屾垜浠負姣忎釜鍛戒護鍙栦竴涓悕瀛椼傚湪CMainFrame綾誨畾涔夌殑鍓嶉潰鍔犱笂涓嬮潰鐨勪竴涓粨鏋勫畾涔夛細
typedef struct{
char cCmd[32];
ACCEL accel;
}ACCELITEM,*LPACCELITEM;
銆銆鎴戜滑灝嗕嬌鐢ㄨ緇撴瀯鏉ヤ繚瀛?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑鏁版嵁銆傚湪CMainFrame綾諱腑娣誨姞涓や釜淇濇姢鎴愬憳鍙橀噺錛?/p>
LPACCELITEM m_lpAccel;
DWORD m_dwAccelCount;
銆銆鍦ㄦ瀯閫犲嚱鏁頒腑灝唌_lpAccel鍒濆鍖栦負NULL錛宮_dwAccelCount鍒濆鍖栦負0銆傚湪鏁扮粍accel鐨勫畾涔変笅闈㈠鍔犱竴涓瓧絎︿覆鏁扮粍鐨勯潤鎬佸彉閲忕殑瀹氫箟錛堢敤鏉ユ寚瀹氬懡浠ょ殑鍚嶇О,璇蜂豢鐓т笅闈㈣嚜宸卞畾涔夛紝涓暟澶氬皯涓嶉檺錛屽瓧絎︿覆闀垮害涓嶈瓚呰繃31涓瓧絎︼級錛?/p>
static char strCmd[][32]={
"Command One",
"Command Two",
"Command Three",
"Command Four",
"Command Five"
};
銆銆鍦–MainFrame綾諱腑娣誨姞涓涓繚鎶ゆ垚鍛樺嚱鏁癓oadAccel(),璇ュ嚱鏁扮敤鏉ュ皢鍔犻熼敭琛ㄨ鍏ワ紝瀹氫箟濡備笅錛?/p>
BOOL CMainFrame::LoadAccel()
{
ASSERT(m_hActAccel==NULL);
ASSERT(m_lpAccel==NULL);
m_dwAccelCount=sizeof(accel)/sizeof(ACCEL);
m_lpAccel=new ACCELITEM[m_dwAccelCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*m_dwAccelCount);
DWORD dwCmdStr=sizeof(strCmd)/sizeof(char[32]);
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=accel[dw];
strcpy(m_lpAccel[dw].cCmd,dw<dwCmdStr?strCmd[dw]:"Command Unknow");
}
m_hActAccel=CreateAcceleratorTable(accel,m_dwAccelCount);
return TRUE;
}
銆銆鍒犻櫎OnCreate鍑芥暟涓師鏉ュ垱寤?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄧ殑浠g爜錛屾敼鎴愬LoadAccel()鐨勮皟鐢細
LoadAccel();
銆銆鍦–MainFrame鐨勬瀽鏋勫嚱鏁頒腑澧炲姞浠ヤ笅鍐呭錛?/p>
if(m_lpAccel)
delete[] m_lpAccel;
銆銆涓轟簡鑳藉瀵?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁榪涜緙栬緫錛屾垜浠湪宸ョ▼涓坊鍔犱竴涓璇濇璧勬簮錛孖D涓?#8220;IDD_ACCELEDIT”錛屽湪瀵硅瘽妗嗕笂鏀劇疆涓変釜鎴愮粍妗嗭紙Group Box錛夛紝宸﹁竟涓涓爣棰樹負“鍛戒護”錛涗腑闂翠竴涓爣棰樹負“緇勫悎閿?#8221;錛涘彸杈逛竴涓爣棰樹負“铏氶敭鍊?#8221;銆傚湪宸﹁竟鎴愮粍妗嗕腑鏀劇疆涓涓垪琛ㄦ錛圠ist Box錛夛紝ID涓?#8220;IDC_LST_CMD”銆傚湪涓棿鎴愮粍妗嗕腑鏀劇疆涓変釜鏍擱夋錛圕heck Box錛夛紝涓婁笅鎺掑垪銆備笂闈㈢殑鏍擱夋鐨処D涓?#8220;IDC_CHK_ALT”錛屾爣棰樹負“Alt”錛屽茍鍕鵑?#8220;Group”灞炴э紱涓棿鐨勬牳閫夋鐨処D涓?#8220;IDC_CHK_SHIFT”錛屾爣棰樹負“Shift”錛屽彇娑?#8220;Group”灞炴э紱涓嬮潰鐨勬牳閫夋鐨処D涓?#8220;IDC_CHK_CTRL”錛屾爣棰樹負“Ctrl”錛屽彇娑?#8220;Group”灞炴с傚湪鍙寵竟鐨勬垚緇勬涓斁緗竴涓垪琛ㄦ錛孖D涓?#8220;IDC_LST_KEY”銆傝皟鏁村悇涓帶浠剁殑灝哄鍙婁綅緗嚦鍚堥傘傝緗帶浠剁殑TAB璺寵漿欏哄簭錛屼粠宸﹁嚦鍙熾佷粠涓婂埌涓嬨備緷嬈′負錛氬乏鎴愮粍妗嗐両DC_LST_CMD鍒楄〃妗嗐佷腑鎴愮粍妗嗐両DC_CHK_ALT鏍擱夋銆両DC_CHK_SHIFT鏍擱夋銆両DC_CHK_CTRL鏍擱夋銆佸彸鎴愮粍妗嗐両DC_LST_KEY鍒楄〃妗嗐丱K鎸夐挳銆丆ANCEL鎸夐挳銆?br>銆銆鎵撳紑綾誨悜瀵鹼紝涓哄璇濇鏂板緩涓涓被錛岀被鍚嶄負“CDlgEditAccel”銆備負涓や釜鍒楄〃妗嗗拰涓変釜鏍擱夋鏄犲皠鍙橀噺錛屽涓嬶細
銆銆鎺т歡ID:ID_LST_CMD錛涚被鍨?Control/CListBox錛涘悕縐?m_LstCmd錛?br>銆銆鎺т歡ID:ID_LST_KEY錛涚被鍨?Control/CListBox錛涘悕縐?m_LstKey錛?br>銆銆鎺т歡ID:ID_CHK_ALT錛涚被鍨?Control/CButton錛涘悕縐?m_ChkAlt錛?br>銆銆鎺т歡ID:ID_CHK_SHIFT錛涚被鍨?Control/CButton錛涘悕縐?m_ChkShift錛?br>銆銆鎺т歡ID:ID_CHK_CTRL錛涚被鍨?Control/CButton錛涘悕縐?m_ChkCtrl錛?/p>
銆銆鍦ㄧ被CDlgEditAccel鐨勫畾涔夊墠鍔犲叆涓嬮潰鐨勫畾涔夛細
typedef struct tag_KeyName{
CString m_strName;
WORD m_wID;
tag_KeyName(CString str,WORD id){m_strName=str,m_wID=id;}
}KEYNAME,*LPKEYNAME;
typedef struct tag_ActAccel{
CString m_strCmd;
ACCEL m_Accel;
}ACTACCEL,*LPACTACCEL;
class CActAccelList
{
public:
CActAccelList();
~CActAccelList();
protected:
LPACTACCEL m_lpActAccel;
int m_iCount;
public:
ACTACCEL& operator[](int index);
BOOL SetSize(int iSize);
int GetSize();
};
銆銆鍦ㄦ枃浠禗lgEditAccel.cpp鏂囦歡涓畾涔夌被CActAccelList鐨勬垚鍛樺嚱鏁幫紝浠g爜濡備笅錛?br>CActAccelList::CActAccelList()
{
m_lpActAccel=NULL;
m_iCount=0;
}
CActAccelList::~CActAccelList()
{
if(m_iCount>0&&m_lpActAccel)
delete[] m_lpActAccel;
}
int CActAccelList::GetSize()
{
return m_iCount;
}
ACTACCEL& CActAccelList::operator []( int index)
{
if(!(index>=0&&index<m_iCount))
AfxThrowMemoryException();
return m_lpActAccel[index];
}
BOOL CActAccelList::SetSize(int iSize)
{
if(iSize<0)
return FALSE;
if(m_iCount>0&&m_lpActAccel)
delete[] m_lpActAccel;
m_iCount=0;
m_lpActAccel=new ACTACCEL[iSize];
if(m_lpActAccel==NULL)
return FALSE;
m_iCount=iSize;
return TRUE;
}
銆銆鍦―lgAccelEdit.cpp鏂囦歡澶撮儴瀹氫箟鍏ㄥ眬鍙橀噺錛嶏紞鏁扮粍key錛?br>static KEYNAME key[]={
KEYNAME("Left mouse button",VK_LBUTTON),
KEYNAME("Right mouse button",VK_RBUTTON),
KEYNAME("Control-break processing",VK_CANCEL),
KEYNAME("Middle mouse button",VK_MBUTTON),
KEYNAME("Back Space",VK_BACK),
KEYNAME("Tab",VK_TAB),
KEYNAME("Clear",VK_CLEAR),
KEYNAME("Enter",VK_RETURN),
KEYNAME("Shift",VK_SHIFT),
KEYNAME("Ctrl",VK_CONTROL),
KEYNAME("Alt",VK_MENU),
KEYNAME("Pause",VK_PAUSE),
KEYNAME("Caps Lock",VK_CAPITAL),
KEYNAME("Esc",VK_ESCAPE),
KEYNAME("Space",VK_SPACE),
KEYNAME("Page Up",VK_PRIOR),
KEYNAME("Page Down",VK_NEXT),
KEYNAME("End",VK_END),
KEYNAME("Home",VK_HOME),
KEYNAME("Left",VK_LEFT),
KEYNAME("Up",VK_UP),
KEYNAME("Right",VK_RIGHT),
KEYNAME("Down",VK_DOWN),
KEYNAME("Select",VK_SELECT),
KEYNAME("Excute",VK_EXECUTE),
KEYNAME("Print Screen",VK_SNAPSHOT),
KEYNAME("Insert",VK_INSERT),
KEYNAME("Delete",VK_DELETE),
KEYNAME("Help",VK_HELP),
KEYNAME("0",'0'),
KEYNAME("1",'1'),
KEYNAME("2",'2'),
KEYNAME("3",'3'),
KEYNAME("4",'4'),
KEYNAME("5",'5'),
KEYNAME("6",'6'),
KEYNAME("7",'7'),
KEYNAME("8",'8'),
KEYNAME("9",'9'),
KEYNAME("A",'A'),
KEYNAME("B",'B'),
KEYNAME("C",'C'),
KEYNAME("D",'D'),
KEYNAME("E",'E'),
KEYNAME("F",'F'),
KEYNAME("G",'G'),
KEYNAME("H",'H'),
KEYNAME("I",'I'),
KEYNAME("J",'J'),
KEYNAME("K",'K'),
KEYNAME("L",'L'),
KEYNAME("M",'M'),
KEYNAME("N",'N'),
KEYNAME("O",'O'),
KEYNAME("P",'P'),
KEYNAME("Q",'Q'),
KEYNAME("R",'R'),
KEYNAME("S",'S'),
KEYNAME("T",'T'),
KEYNAME("U",'U'),
KEYNAME("V",'V'),
KEYNAME("W",'W'),
KEYNAME("X",'X'),
KEYNAME("Y",'Y'),
KEYNAME("Z",'Z'),
KEYNAME("Left windows",VK_LWIN),
KEYNAME("Right windows",VK_RWIN),
KEYNAME("Applications",VK_APPS),
KEYNAME("Numeric keypad 0", VK_NUMPAD0),
KEYNAME("Numeric keypad 1", VK_NUMPAD1),
KEYNAME("Numeric keypad 2", VK_NUMPAD2),
KEYNAME("Numeric keypad 3", VK_NUMPAD3),
KEYNAME("Numeric keypad 4", VK_NUMPAD4),
KEYNAME("Numeric keypad 5", VK_NUMPAD5),
KEYNAME("Numeric keypad 6", VK_NUMPAD6),
KEYNAME("Numeric keypad 7", VK_NUMPAD7),
KEYNAME("Numeric keypad 8", VK_NUMPAD8),
KEYNAME("Numeric keypad 9", VK_NUMPAD9),
KEYNAME("Multiply",VK_MULTIPLY),
KEYNAME("Add",VK_ADD),
KEYNAME("Separator",VK_SEPARATOR),
KEYNAME("Subtract",VK_SUBTRACT),
KEYNAME("Decimal Point",VK_DECIMAL),
KEYNAME("Divide",VK_DIVIDE),
KEYNAME("F1",VK_F1),
KEYNAME("F2",VK_F2),
KEYNAME("F3",VK_F3),
KEYNAME("F4",VK_F4),
KEYNAME("F5",VK_F5),
KEYNAME("F6",VK_F6),
KEYNAME("F7",VK_F7),
KEYNAME("F8",VK_F8),
KEYNAME("F9",VK_F9),
KEYNAME("F10",VK_F10),
KEYNAME("F11",VK_F11),
KEYNAME("F12",VK_F12),
KEYNAME("F13",VK_F13),
KEYNAME("F14",VK_F14),
KEYNAME("F15",VK_F15),
KEYNAME("F16",VK_F16),
KEYNAME("F17",VK_F17),
KEYNAME("F18",VK_F18),
KEYNAME("F19",VK_F19),
KEYNAME("F20",VK_F20),
KEYNAME("F21",VK_F21),
KEYNAME("F22",VK_F22),
KEYNAME("F23",VK_F23),
KEYNAME("F24",VK_F24),
KEYNAME("Attn",VK_ATTN),
KEYNAME("CrSel",VK_CRSEL),
KEYNAME("ExSel",VK_EXSEL),
KEYNAME("Erase",VK_EREOF),
KEYNAME("Play",VK_PLAY),
KEYNAME("Zoom",VK_ZOOM),
KEYNAME("Reserved for future use",VK_NONAME ),
KEYNAME("PA1",VK_PA1),
KEYNAME("Clear(OEM)",VK_OEM_CLEAR ),
KEYNAME("file://",'//'),
KEYNAME("-",'-'),
KEYNAME("=",'='),
KEYNAME("[",'['),
KEYNAME("]",']'),
KEYNAME(";",';'),
KEYNAME("\'",'\''),
KEYNAME(",",','),
KEYNAME(".",'.'),
KEYNAME("/",'/'),
KEYNAME("`",'`')
};
銆銆鍦ㄧ被CDlgAccelEdit涓搷搴擶indows娑堟伅錛歐M_INITDIALOD錛屼唬鐮佸涓嬶細
BOOL CDlgEditAccel::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetWindowText("Edit Accelerator Table");
int iCount=m_AccelList.GetSize();
int i;
for(i=0;i<iCount;i++){
m_LstCmd.AddString(m_AccelList[i].m_strCmd);
}
for(i=0;i<sizeof(key)/sizeof(KEYNAME);i++)
{
m_LstKey.AddString(key[i].m_strName);
}
m_LstCmd.SetCurSel(0);
OnSelchangeLstCmd();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
銆銆涓虹被CDglAccelEdit澧炲姞涓涓繚鎶ゆ垚鍛樺嚱鏁幫細
void SaveChange(int index=-1);
銆銆鍦ㄦ枃浠禗lgAccelEdit涓畾涔夎鍑芥暟錛屼唬鐮佸涓嬶細
void CDlgEditAccel::SaveChange(int index)
{
if(index>=0||(index=m_LstCmd.GetCurSel())>=0)
{
if(m_LstKey.GetCurSel()<0){
AfxMessageBox("浣犲繀闇閫夋嫨涓涓敭鐮?");
return;
}
BYTE btCmp=((m_ChkAlt.GetCheck()==1)?FALT:NULL)|
((m_ChkCtrl.GetCheck()==1)?FCONTROL:NULL)|
((m_ChkShift.GetCheck()==1)?FSHIFT:NULL)|FVIRTKEY;
WORD wKey=key[m_LstKey.GetCurSel()].m_wID;
m_AccelList[index].m_Accel.fVirt=btCmp;
m_AccelList[index].m_Accel.key=wKey;
return;
}
}
銆銆鍝嶅簲鍒楄〃妗咺D_LST_CMD鐨勯氱煡娑堟伅“LBN_SELCHANGE”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnSelchangeLstCmd()
{
// TODO: Add your control notification handler code here
int iCmd=m_LstCmd.GetCurSel();
WORD wKey=m_AccelList[iCmd].m_Accel.key;
BYTE btCmp=m_AccelList[iCmd].m_Accel.fVirt;
m_ChkAlt.SetCheck(btCmp&FALT);
m_ChkCtrl.SetCheck(btCmp&FCONTROL);
m_ChkShift.SetCheck(btCmp&FSHIFT);
int iCount=sizeof(key)/sizeof(KEYNAME);
int id=-1;
for(int i=0;i<iCount;i++)
{
if(key[i].m_wID==wKey){
id=i;
break;
}
}
m_LstKey.SetCurSel(id);
}
銆銆鍝嶅簲鍒楄〃妗咺D_LST_KEY鐨勯氱煡娑堟伅“LBN_SELCHANGE”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnSelchangeLstKey()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_ALT鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkAlt()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_SHIFT鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkShift()
{
SaveChange();
}
銆銆鍝嶅簲鏍擱夋ID_CHK_CTRL鐨勯氱煡娑堟伅“BN_CLICKED”錛屽嚱鏁頒唬鐮佸涓嬶細
void CDlgEditAccel::OnChkCtrl()
{
SaveChange();
}
銆銆鑷蟲錛岀敤浜庣紪杈?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鐨勫璇濇宸茬粡瀹屾垚銆傛垜浠幇鍦ㄨ鍋氱殑灝辨槸鍦ㄧ▼搴忎腑鎵撳紑瀵硅瘽妗嗘潵緙栬緫浜嗐傝鎴戜滑鍥炲埌CMainFrame綾諱腑銆傛垜浠皢鍦ㄨ綾諱腑鍝嶅簲涓涓懡浠ゆ潵鎵撳紑緙栬緫瀵硅瘽妗嗭紝瀵?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄨ繘琛岀紪杈戙傚畬鎴愬悗鐐規寜OK鍥炲埌涓葷▼搴忎腑錛岀劧鍚庢洿鏂?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ傝繖鏍峰悗錛屾垜浠垰鍒氱紪杈戝ソ鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ氨寮濮嬭搗浣滅敤浜嗐?br>銆銆棣栧厛錛屾墦寮鑿滃崟銆傚湪“鏌ョ湅”欏瑰悗澧炲姞涓涓?#8220;宸ュ叿(&T)”涓嬫媺鑿滃崟錛屽湪涓嬫媺鑿滃崟涓鍔犱竴涓簡鑿滃崟錛?#8220;緙栬緫鍔犻熼敭琛?&A)...”錛孖D涓?#8220;ID_TOOL_ACCELEDIT”銆傛墦寮綾誨悜瀵鹼紝閫夋嫨CMainFrame綾伙紝鍝嶅簲“ID_TOOL_ACCELEDIT”鍛戒護銆傜紪杈戝搷搴斿嚱鏁板涓嬶細
void CMainFrame::OnToolAcceledit()
{
// TODO: Add your command handler code here
CDlgEditAccel dlg;
DWORD i;
dlg.m_AccelList.SetSize(m_dwAccelCount);
for(i=0;i<m_dwAccelCount;i++){
dlg.m_AccelList[i].m_strCmd=m_lpAccel[i].cCmd;
dlg.m_AccelList[i].m_Accel=m_lpAccel[i].accel;
}
if(IDOK==dlg.DoModal()){
ACCEL* pAccel=new ACCEL[m_dwAccelCount];
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=pAccel[dw]=dlg.m_AccelList[dw].m_Accel;
}
if(m_hActAccel!=NULL)
DestroyAcceleratorTable(m_hActAccel);
m_hActAccel=CreateAcceleratorTable(pAccel,m_dwAccelCount);
}
}
銆銆鍦ㄨ鏂囦歡鐨勫ご閮ㄥ寘鍚被CDlgEditAccel鐨勫ご鏂囦歡錛?/p>
#include "DlgEditAccel.h"
銆銆鑷蟲錛屽彲緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄥ凡緇忓畬鎴愪簡銆備笉濡ㄨ瘯璇曠湅銆?/p>
銆銆涓夈佸皢鍔犻熼敭琛ㄤ繚瀛樿嚦鏂囦歡錛屽茍鍦ㄧ▼搴忚繍琛屾椂鑷姩浠庢枃浠朵腑鍔犺澆銆?/p>
銆銆涓婇潰鎴戜滑瀹炵幇浜嗗彲緙栬緫鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ備絾鏄紝褰撶▼搴忛鍑哄悗錛屾垜浠紪杈戣繃鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁灝辨秷澶變簡錛屼笅嬈¤繍琛岀▼搴忔椂榪樻槸鍜屼互鍓嶄竴鏍蜂簡銆傚皢鍔犻熼敭琛ㄤ繚瀛樿搗鏉ヤ互澶囦笅嬈′嬌鐢紝榪欐槸鎴戜滑鎵甯屾湜鐨勩備笅闈㈣璁虹殑鏂規硶鏄嬌鐢ㄦ枃浠舵潵淇濆瓨鎴戜滑鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄣ?br>銆銆棣栧厛錛屽湪MainFrm.cpp鏂囦歡鐨勫ご閮ㄥ畾涔変竴涓叏灞瀛楃涓詫紝涔熷氨鏄敤浜庝繚瀛?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鐨勬枃浠跺悕錛?/p>
static char strAccelFileName[]="Accel.cus";
銆銆瀹氫箟涓涓狣WORD鍊間綔涓烘枃浠跺ご錛屾垜浠氳繃璇WORD鍊兼潵鍒ゆ柇鏄惁鏄竴涓湁鏁堟牸寮忕殑鏂囦歡錛?/p>
#define ACCEL_FILE_HEAD 0x00434341
銆銆鍏舵錛屼負CMainFrame綾繪坊鍔犱竴涓繚鎶ょ殑鎴愬憳鍑芥暟錛?#8220;BOOL SaveAccel()”錛岀紪杈戝叾浠g爜濡備笅錛?br>BOOL CMainFrame::SaveAccel()
{
char lpAppName[256];
char lpAppPath[256];
char* lpFilePart=NULL;
GetModuleFileName(AfxGetInstanceHandle(),lpAppName,255);
GetFullPathName(lpAppName,255,lpAppPath,&lpFilePart);
TRACE1("Application File Name:%s.\n",lpAppName);
strcpy(lpFilePart,strAccelFileName);
TRACE1("Accelerator File Name:%s.\n",lpAppPath);
try
{
DWORD dwHead=ACCEL_FILE_HEAD;
DWORD dwCount=m_dwAccelCount;
CFile fAccel(lpAppPath,CFile::modeCreate|CFile::modeWrite);
fAccel.SeekToBegin();
fAccel.Write(&dwHead,sizeof(DWORD));
fAccel.Write(&dwCount,sizeof(DWORD));
for(DWORD dw=0;dw<dwCount;dw++)
{
fAccel.Write(m_lpAccel+dw,sizeof(ACCELITEM));
}
return TRUE;
}
catch(CFileException* e)
{
char buf[256];
char buf2[512];
int iError;
iError=e->m_cause;
e->GetErrorMessage(buf,256);
sprintf(buf2,"灝?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄤ繚瀛樺埌鏂囦歡 \"%s\" 涓椂鍙戠敓閿欒!\n"
"閿?璇?鍙?%d\n"
"閿欒鎻忚堪:%s\n"
"\0",
strAccelFileName,iError,buf);
AfxMessageBox(buf2,MB_OK|MB_ICONSTOP|MB_DEFBUTTON1);
return FALSE;
}
}
銆銆鍐嶆錛屼慨鏀筁oadAccel()鍑芥暟濡備笅錛?/p>
BOOL CMainFrame::LoadAccel()
{
char lpAppName[256];
char lpAppPath[256];
char* lpFilePart=NULL;
GetModuleFileName(AfxGetInstanceHandle(),lpAppName,255);
GetFullPathName(lpAppName,255,lpAppPath,&lpFilePart);
TRACE1("Application File Name:%s.\n",lpAppName);
strcpy(lpFilePart,strAccelFileName);
TRACE1("Accelerator File Name:%s.\n",lpAppPath);
try
{
DWORD dwHead;
DWORD dwCount;
CFile fAccel(lpAppPath,CFile::modeRead);
fAccel.SeekToBegin();
if(fAccel.Read(&dwHead,sizeof(DWORD))!=sizeof(DWORD))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
if(dwHead!=ACCEL_FILE_HEAD)
AfxThrowFileException(CFileException::invalidFile,13,lpAppPath);
if(fAccel.Read(&dwCount,sizeof(DWORD))!=sizeof(DWORD))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
ASSERT(m_lpAccel==NULL);
m_lpAccel=new ACCELITEM[dwCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*dwCount);
m_dwAccelCount=dwCount;
for(DWORD dw=0;dw<dwCount;dw++)
{
if(fAccel.Read(m_lpAccel+dw,sizeof(ACCELITEM))!=sizeof(ACCELITEM))
AfxThrowFileException(CFileException::endOfFile,12,lpAppPath);
}
ACCEL* pAccel=new ACCEL[dwCount];
for(dw=0;dw<dwCount;dw++){
pAccel[dw]=m_lpAccel[dw].accel;
}
m_hActAccel=CreateAcceleratorTable(pAccel,dwCount);
return TRUE;
}
catch(CFileException* e)
{
char buf[256];
char buf2[512];
int iError;
iError=e->m_cause;
e->GetErrorMessage(buf,256);
sprintf(buf2,"浠庢枃浠?\"%s\" 涓姞杞?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛ㄦ椂鍙戠敓閿欒!\n"
"閿?璇?鍙?%d\n"
"閿欒鎻忚堪:%s\n"
"鏄惁鐢熸垚榛樿鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛?\n\0",
strAccelFileName,iError,buf);
if(IDYES==AfxMessageBox(buf2,MB_YESNO|MB_SYSTEMMODAL|MB_ICONSTOP|MB_DEFBUTTON1))
{
ASSERT(m_hActAccel==NULL);
ASSERT(m_lpAccel==NULL);
m_dwAccelCount=sizeof(accel)/sizeof(ACCEL);
m_lpAccel=new ACCELITEM[m_dwAccelCount];
memset(m_lpAccel,0,sizeof(ACCELITEM)*m_dwAccelCount);
DWORD dwCmdStr=sizeof(strCmd)/sizeof(char[30]);
for(DWORD dw=0;dw<m_dwAccelCount;dw++){
m_lpAccel[dw].accel=accel[dw];
strcpy(m_lpAccel[dw].cCmd,dw<dwCmdStr?strCmd[dw]:"Command Unknow");
}
m_hActAccel=CreateAcceleratorTable(accel,m_dwAccelCount);
SaveAccel();
return TRUE;
}
return FALSE;
}
}
銆銆鏈鍚庯紝鍦―estroyWindow()鍑芥暟澶撮儴澧炲姞瀵筍aveAccel()鍑芥暟鐨勮皟鐢細
SaveAccel();
...
銆銆濂戒簡錛屼綘鑷繁鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭鏁版嵁宸茬粡鑳戒繚瀛樺湪鏂囦歡涓簡錛屽茍鑳戒粠涓紜姞杞姐傚鏋滄枃浠朵笉瀛樺湪鎴栫▼搴忚鍙栨椂鍙戠幇閿欒鍒欐彁閱掍綘鏄惁寤虹珛緙虹渷鐨?strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">鍔犻熼敭琛紝濡備綘紜鐨勮瘽鍒欑敓鎴愮己鐪佺殑鍔犻熼敭琛ㄥ茍绔嬪埢淇濆瓨鑷蟲枃浠朵腑銆?br>銆銆鐢變簬姘村鉤鏈夐檺錛屽叾涓毦鍏嶆湁璇紝嬈㈣繋鎵硅瘎鎸囨銆佸彂琛ㄤ綘鐨勬剰瑙併傛湰浜轟笉鑳滄劅嬋銆?br>
void ClearMessage(HWND hWnd,BOOL bExtMsg)

{
MSG GetMsg;
while(PeekMessage(&GetMsg,hWnd,0,0,PM_REMOVE))
{
if(GetMsg.message == WM_TIMER) continue;
TranslateMessage(&GetMsg);
DispatchMessage(&GetMsg);
}
if(hWnd != NULL && bExtMsg)
{
while(PeekMessage(&GetMsg,NULL,WM_WINDOWPOSCHANGING,WM_WINDOWPOSCHANGED,PM_REMOVE))
{
TranslateMessage(&GetMsg);
DispatchMessage(&GetMsg);
}
while(PeekMessage(&GetMsg,NULL,0,0,PM_QS_PAINT))
{
TranslateMessage(&GetMsg);
DispatchMessage(&GetMsg);
}
}
}
void CExportRegeditToXml::OnBnClickedCancel()

{

if ( ( NULL != m_TransRegedit ) && ( !pThreadData->m_brepalce) ) 
{
if(MessageBox(_T("鐩墠姝e湪瀵煎嚭娉ㄥ唽琛紝鏄惁鍙栨秷!"),_T("璀﹀憡"),MB_YESNO)!=IDYES)
return;
pThreadData->m_brepalce = TRUE;
while (m_TransRegedit && WaitForSingleObject(m_TransRegedit->m_hThread,40)!=WAIT_OBJECT_0) 
{
ClearMessage(NULL, TRUE);
}
m_TransRegedit = NULL;
}
OnCancel();
}