锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍦–璇█涓紝鍋囪鎴戜滑鏈夎繖鏍風(fēng)殑涓涓嚱鏁幫細(xì) int function(int a,int b) 璋冪敤鏃跺彧瑕佺敤result = function(1,2)榪欐牱鐨勬柟寮忓氨鍙互浣跨敤榪欎釜鍑芥暟銆備絾鏄紝褰撻珮綰ц璦琚紪璇戞垚璁$畻鏈哄彲浠ヨ瘑鍒殑鏈哄櫒鐮佹椂錛屾湁涓涓棶棰樺氨鍑哥幇鍑烘潵錛氬湪CPU涓紝璁$畻鏈烘病鏈夊姙娉曠煡閬撲竴涓嚱鏁拌皟鐢ㄩ渶瑕佸灝戜釜銆佷粈涔堟牱鐨勫弬鏁幫紝涔熸病鏈夌‖浠跺彲浠ヤ繚瀛樿繖浜涘弬鏁般備篃灝辨槸璇達(dá)紝璁$畻鏈轟笉鐭ラ亾鎬庝箞緇欒繖涓嚱鏁頒紶閫掑弬鏁幫紝浼犻掑弬鏁扮殑宸ヤ綔蹇呴』鐢卞嚱鏁拌皟鐢ㄨ呭拰鍑芥暟鏈韓鏉ュ崗璋冦備負(fù)姝わ紝璁$畻鏈烘彁渚涗簡(jiǎn)涓縐嶈縐頒負(fù)鏍堢殑鏁版嵁緇撴瀯鏉ユ敮鎸佸弬鏁頒紶閫掋?/p> 鏍堟槸涓縐嶅厛榪涘悗鍑虹殑鏁版嵁緇撴瀯錛屾爤鏈変竴涓瓨鍌ㄥ尯銆佷竴涓爤欏舵寚閽堛傛爤欏舵寚閽堟寚鍚戝爢鏍堜腑絎竴涓彲鐢ㄧ殑鏁版嵁欏癸紙琚О涓烘爤欏訛級(jí)銆傜敤鎴峰彲浠ュ湪鏍堥《涓婃柟鍚戞爤涓姞鍏ユ暟鎹紝榪欎釜鎿嶄綔琚О涓哄帇鏍?Push)錛屽帇鏍堜互鍚庯紝鏍堥《鑷姩鍙樻垚鏂板姞鍏ユ暟鎹」鐨勪綅緗紝鏍堥《鎸囬拡涔熼殢涔嬩慨鏀廣傜敤鎴蜂篃鍙互浠庡爢鏍堜腑鍙栬蛋鏍堥《錛岀О涓哄脊鍑烘爤(pop)錛屽脊鍑烘爤鍚庯紝鏍堥《涓嬬殑涓涓厓绱犲彉鎴愭爤欏訛紝鏍堥《鎸囬拡闅忎箣淇敼銆?/p> 鍑芥暟璋冪敤鏃訛紝璋冪敤鑰呬緷嬈℃妸鍙傛暟鍘嬫爤錛岀劧鍚庤皟鐢ㄥ嚱鏁幫紝鍑芥暟琚皟鐢ㄤ互鍚庯紝鍦ㄥ爢鏍堜腑鍙栧緱鏁版嵁錛屽茍榪涜璁$畻銆傚嚱鏁拌綆楃粨鏉熶互鍚庯紝鎴栬呰皟鐢ㄨ呫佹垨鑰呭嚱鏁版湰韜慨鏀瑰爢鏍堬紝浣垮爢鏍堟仮澶嶅師瑁呫?/p> 鍦ㄥ弬鏁頒紶閫掍腑錛屾湁涓や釜寰堥噸瑕佺殑闂蹇呴』寰楀埌鏄庣‘璇存槑錛?/p> 鍦ㄩ珮綰ц璦涓紝閫氳繃鍑芥暟璋冪敤綰﹀畾鏉ヨ鏄庤繖涓や釜闂銆傚父瑙佺殑璋冪敤綰﹀畾鏈夛細(xì)
stdcall寰堝鏃跺欒縐頒負(fù)pascal璋冪敤綰﹀畾錛屽洜涓簆ascal鏄棭鏈熷緢甯歌鐨勪竴縐嶆暀瀛︾敤璁$畻鏈虹▼搴忚璁¤璦錛屽叾璇硶涓ヨ皚錛屼嬌鐢ㄧ殑鍑芥暟璋冪敤綰﹀畾灝辨槸stdcall銆傚湪Microsoft C++緋誨垪鐨凜/C++緙栬瘧鍣ㄤ腑錛屽父甯哥敤PASCAL瀹忔潵澹版槑榪欎釜璋冪敤綰﹀畾錛岀被浼肩殑瀹忚繕鏈塛INAPI鍜孋ALLBACK銆?/p> stdcall璋冪敤綰﹀畾澹版槑鐨勮娉曚負(fù)(浠ュ墠鏂囩殑閭d釜鍑芥暟涓轟緥錛夛細(xì) int __stdcall function(int a,int b) stdcall鐨勮皟鐢ㄧ害瀹氭剰鍛崇潃錛?錛夊弬鏁頒粠鍙沖悜宸﹀帇鍏ュ爢鏍堬紝2錛夊嚱鏁拌嚜韜慨鏀瑰爢鏍?3)鍑芥暟鍚嶈嚜鍔ㄥ姞鍓嶅鐨勪笅鍒掔嚎錛屽悗闈㈢揣璺熶竴涓狜絎﹀彿錛屽叾鍚庣揣璺熺潃鍙傛暟鐨勫昂瀵?/p> 浠ヤ笂榪拌繖涓嚱鏁頒負(fù)渚嬶紝鍙傛暟b棣栧厛琚帇鏍堬紝鐒跺悗鏄弬鏁癮錛屽嚱鏁拌皟鐢╢unction(1,2)璋冪敤澶勭炕璇戞垚姹囩紪璇█灝嗗彉鎴愶細(xì) 鑰屽浜庡嚱鏁拌嚜韜紝鍒欏彲浠ョ炕璇戜負(fù)錛? 鑰屽湪緙栬瘧鏃訛紝榪欎釜鍑芥暟鐨勫悕瀛楄緲昏瘧鎴恄function@8
娉ㄦ剰涓嶅悓緙栬瘧鍣ㄤ細(xì)鎻掑叆鑷繁鐨勬眹緙栦唬鐮佷互鎻愪緵緙栬瘧鐨勯氱敤鎬э紝浣嗘槸澶т綋浠g爜濡傛銆傚叾涓湪鍑芥暟寮濮嬪淇濈暀esp鍒癳bp涓紝鍦ㄥ嚱鏁扮粨鏉熸仮澶嶆槸緙栬瘧鍣ㄥ父鐢ㄧ殑鏂規(guī)硶銆?/p> 浠庡嚱鏁拌皟鐢ㄧ湅錛?鍜?渚濇琚玴ush榪涘爢鏍堬紝鑰屽湪鍑芥暟涓張閫氳繃鐩稿浜巈bp(鍗沖垰榪涘嚱鏁版椂鐨勫爢鏍堟寚閽堬級(jí)鐨勫亸縐婚噺瀛樺彇鍙傛暟銆傚嚱鏁扮粨鏉熷悗錛宺et 8琛ㄧず娓呯悊8涓瓧鑺傜殑鍫嗘爤錛屽嚱鏁拌嚜宸辨仮澶嶄簡(jiǎn)鍫嗘爤銆?/p> cdecl璋冪敤綰﹀畾鍙堢О涓篊璋冪敤綰﹀畾錛屾槸C璇█緙虹渷鐨勮皟鐢ㄧ害瀹氾紝瀹冪殑瀹氫箟璇硶鏄細(xì) 鍦ㄥ啓鏈枃鏃訛紝鍑轟箮鎴戠殑鎰忔枡錛屽彂鐜癱decl璋冪敤綰﹀畾鐨勫弬鏁板帇鏍堥『搴忔槸鍜宻tdcall鏄竴鏍風(fēng)殑錛屽弬鏁伴鍏堢敱鏈夊悜宸﹀帇鍏ュ爢鏍堛傛墍涓嶅悓鐨勬槸錛屽嚱鏁版湰韜笉娓呯悊鍫嗘爤錛岃皟鐢ㄨ呰礋璐f竻鐞嗗爢鏍堛傜敱浜庤繖縐嶅彉鍖栵紝C璋冪敤綰﹀畾鍏佽鍑芥暟鐨勫弬鏁扮殑涓暟鏄笉鍥哄畾鐨勶紝榪欎篃鏄疌璇█鐨勪竴澶х壒鑹層傚浜庡墠闈㈢殑function鍑芥暟錛屼嬌鐢╟decl鍚庣殑姹囩紪鐮佸彉鎴愶細(xì) MSDN涓錛岃淇グ鑷姩鍦ㄥ嚱鏁板悕鍓嶅姞鍓嶅鐨勪笅鍒掔嚎錛屽洜姝ゅ嚱鏁板悕鍦ㄧ鍙瘋〃涓璁板綍涓篲function錛屼絾鏄垜鍦ㄧ紪璇戞椂浼間箮娌℃湁鐪嬪埌榪欑鍙樺寲銆?/p> 鐢變簬鍙傛暟鎸夌収浠庡彸鍚戝乏欏哄簭鍘嬫爤錛屽洜姝ゆ渶寮濮嬬殑鍙傛暟鍦ㄦ渶鎺ヨ繎鏍堥《鐨勪綅緗紝鍥犳褰撻噰鐢ㄤ笉瀹氫釜鏁板弬鏁版椂錛岀涓涓弬鏁板湪鏍堜腑鐨勪綅緗偗瀹氳兘鐭ラ亾錛屽彧瑕佷笉瀹氱殑鍙傛暟涓暟鑳藉鏍規(guī)嵁絎竴涓悗鑰呭悗緇殑鏄庣‘鐨勫弬鏁扮‘瀹氫笅鏉ワ紝灝卞彲浠ヤ嬌鐢ㄤ笉瀹氬弬鏁幫紝渚嬪瀵逛簬CRT涓殑sprintf鍑芥暟錛屽畾涔変負(fù)錛?
int sprintf(char* buffer,const char* format,...) 鐢變簬鎵鏈夌殑涓嶅畾鍙傛暟閮藉彲浠ラ氳繃format紜畾錛屽洜姝や嬌鐢ㄤ笉瀹氫釜鏁扮殑鍙傛暟鏄病鏈夐棶棰樼殑銆?/p> fastcall璋冪敤綰﹀畾鍜宻tdcall綾諱技錛屽畠鎰忓懗鐫錛?
鍏跺0鏄庤娉曚負(fù)錛歩nt fastcall function(int a,int b) thiscall鏄敮涓涓涓笉鑳芥槑紜寚鏄庣殑鍑芥暟淇グ錛屽洜涓簍hiscall涓嶆槸鍏抽敭瀛椼傚畠鏄疌++綾繪垚鍛樺嚱鏁扮己鐪佺殑璋冪敤綰﹀畾銆傜敱浜庢垚鍛樺嚱鏁拌皟鐢ㄨ繕鏈変竴涓猼his鎸囬拡錛屽洜姝ゅ繀欏葷壒孌婂鐞嗭紝thiscall鎰忓懗鐫錛?
涓轟簡(jiǎn)璇存槑榪欎釜璋冪敤綰﹀畾錛屽畾涔夊涓嬬被鍜屼嬌鐢ㄤ唬鐮侊細(xì) callee鍑芥暟琚炕璇戞垚姹囩紪鍚庡氨鍙樻垚錛? 鍙錛屽浜庡弬鏁頒釜鏁板浐瀹氭儏鍐典笅錛屽畠綾諱技浜巗tdcall錛屼笉瀹氭椂鍒欑被浼糲decl 榪欐槸涓涓緢灝戣鐨勮皟鐢ㄧ害瀹氾紝涓鑸▼搴忚璁¤呭緩璁笉瑕佷嬌鐢ㄣ傜紪璇戝櫒涓嶄細(xì)緇欒繖縐嶅嚱鏁板鍔犲垵濮嬪寲鍜屾竻鐞嗕唬鐮侊紝鏇寸壒孌婄殑鏄紝浣犱笉鑳界敤return榪斿洖榪斿洖鍊鹼紝鍙兘鐢ㄦ彃鍏ユ眹緙栬繑鍥炵粨鏋溿傝繖涓鑸敤浜庡疄妯″紡椹卞姩紼嬪簭璁捐錛屽亣璁懼畾涔変竴涓眰鍜岀殑鍔犳硶紼嬪簭錛屽彲浠ュ畾涔変負(fù)錛? 娉ㄦ剰錛岃繖涓嚱鏁版病鏈夋樉寮忕殑return榪斿洖鍊鹼紝榪斿洖閫氳繃淇敼eax瀵勫瓨鍣ㄥ疄鐜幫紝鑰屼笖榪為鍑哄嚱鏁扮殑ret鎸囦護(hù)閮藉繀欏繪樉寮忔彃鍏ャ備笂闈唬鐮佽緲昏瘧鎴愭眹緙栦互鍚庡彉鎴愶細(xì) 娉ㄦ剰榪欎釜淇グ鏄拰__stdcall鍙?qiáng)cdecl緇撳悎浣跨敤鐨勶紝鍓嶉潰鏄畠鍜宑decl緇撳悎浣跨敤鐨勪唬鐮侊紝瀵逛簬鍜宻tdcall緇撳悎鐨勪唬鐮侊紝鍒欏彉鎴愶細(xì) 鑷充簬榪欑鍑芥暟琚皟鐢紝鍒欏拰鏅氱殑cdecl鍙?qiáng)stdcall璋冪敤鍑芥暟涓鑷淬?/p> 濡傛灉瀹氫箟鐨勭害瀹氬拰浣跨敤鐨勭害瀹氫笉涓鑷達(dá)紝鍒欏皢瀵艱嚧鍫嗘爤琚牬鍧忥紝瀵艱嚧涓ラ噸闂錛屼笅闈㈡槸涓ょ甯歌鐨勯棶棰橈細(xì)
浠ュ悗鑰呬負(fù)渚嬶紝鍋囪鎴戜滑鍦╠ll縐嶅0鏄庝簡(jiǎn)涓縐嶅嚱鏁頒負(fù)錛? 浣跨敤鏃朵唬鐮佷負(fù)錛? 鐢變簬璋冪敤鑰呮病鏈夌悊瑙INAPI鐨勫惈涔夐敊璇殑澧炲姞浜?jiǎn)杩欎釜淇图屼笂杩颁唬鐮佸繀鐒跺D嚧鍫嗘爤琚牬鍧忥紝MFC鍦ㄧ紪璇戞椂鎻掑叆鐨刢heckesp鍑芥暟灝嗗憡璇変綘錛屽爢鏍堣鐮村潖浜?jiǎn)銆?/p>璁鴻皟鐢ㄧ害瀹?
stdcall璋冪敤綰﹀畾
push 2 絎簩涓弬鏁板叆鏍?push 1 絎竴涓弬鏁板叆鏍?call function 璋冪敤鍙傛暟錛屾敞鎰忔鏃惰嚜鍔ㄦ妸cs:eip鍏ユ爤
push ebp 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠ mov ebp,esp 淇濆瓨鍫嗘爤鎸囬拡 mov eax,[ebp + 8H] 鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp,cs:eip,a,b,ebp +8鎸囧悜a add eax,[ebp + 0CH] 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡(jiǎn)b mov esp,ebp 鎭㈠esp pop ebp ret 8
cdecl璋冪敤綰﹀畾
int function (int a ,int b) //涓嶅姞淇グ灝辨槸C璋冪敤綰﹀畾 int __cdecl function(int a,int b)//鏄庣‘鎸囧嚭C璋冪敤綰﹀畾
璋冪敤澶?/b> push 1 push 2 call function add esp,8 娉ㄦ剰錛氳繖閲岃皟鐢ㄨ呭湪鎭㈠鍫嗘爤琚皟鐢ㄥ嚱鏁癬function澶?/b> push ebp 淇濆瓨ebp瀵勫瓨鍣紝璇ュ瘎瀛樺櫒灝嗙敤鏉ヤ繚瀛樺爢鏍堢殑鏍堥《鎸囬拡錛屽彲浠ュ湪鍑芥暟閫鍑烘椂鎭㈠ mov ebp,esp 淇濆瓨鍫嗘爤鎸囬拡 mov eax,[ebp + 8H] 鍫嗘爤涓璭bp鎸囧悜浣嶇疆涔嬪墠渚濇淇濆瓨鏈塭bp,cs:eip,a,b,ebp +8鎸囧悜a add eax,[ebp + 0CH] 鍫嗘爤涓璭bp + 12澶勪繚瀛樹簡(jiǎn)b mov esp,ebp 鎭㈠esp pop ebp ret 娉ㄦ剰錛岃繖閲屾病鏈変慨鏀瑰爢鏍?/b>
fastcall
thiscall
class A { public: 聽聽 int function1(int a,int b); 聽聽 int function2(int a,...); }; int A::function1 (int a,int b) { 聽聽 return a+b; } #include //鍑芥暟function1璋冪敤 0401C1D push 2 00401C1F push 1 00401C21 lea ecx,[ebp-8] 00401C24 call function1 娉ㄦ剰錛岃繖閲宼his娌℃湁琚叆鏍?//鍑芥暟function2璋冪敤 00401C29 push 3 00401C2B push 2 00401C2D push 1 00401C2F push 3 00401C31 lea eax,[ebp-8] 榪欓噷寮曞叆this鎸囬拡 00401C34 push eax 00401C35 call function2 00401C3A add esp,14h
naked call
__declspec(naked) int add(int a,int b) { __asm mov eax,a __asm add eax,b __asm ret } mov eax,[ebp+8] add eax,[ebp+12] ret 8
__declspec(naked) int __stdcall function(int a,int b) { __asm mov eax,a __asm add eax,b __asm ret 8 //娉ㄦ剰鍚庨潰鐨? } 鍑芥暟璋冪敤綰﹀畾瀵艱嚧鐨勫父瑙侀棶棰?/h2>
__declspec(dllexport) int func(int a,int b);//娉ㄦ剰錛岃繖閲屾病鏈塻tdcall錛屼嬌鐢ㄧ殑鏄痗decl
typedef int (*WINAPI DLLFUNC)func(int a,int b); hLib = LoadLibrary(...); DLLFUNC func = (DLLFUNC)GetProcAddress(...)//榪欓噷淇敼浜?jiǎn)璋冪敤绾﹀?result = func(1,2);//瀵艱嚧閿欒
聽聽聽浣跨敤Visual C++緙栫▼錛屾湁濡備笅鏂規(guī)硶榪涜鏂囦歡鎿嶄綔錛?/font>
錛?錛変嬌鐢ㄦ爣鍑咰榪愯搴撳嚱鏁幫紝鍖呮嫭fopen銆乫close銆乫seek絳夈?/font>
聽聽聽錛?錛変嬌鐢╓in16涓嬬殑鏂囦歡鍜岀洰褰曟搷浣滃嚱鏁幫紝濡俵open銆乴close銆乴seek絳夈備笉榪囷紝鍦╓in32涓嬶紝榪欎簺鍑芥暟涓昏鏄負(fù)浜?jiǎn)鍜學(xué)in16鍚戝悗鍏煎銆?/font>
聽聽聽錛?錛変嬌鐢╓in32涓嬬殑鏂囦歡鍜岀洰褰曟搷浣滃嚱鏁幫紝濡侰reateFile錛孋opyFile錛孌eleteFile錛孎indNextFile錛岀瓑絳夈?/font>
聽聽聽聽聽聽Win32涓嬶紝鎵撳紑鍜屽垱寤烘枃浠墮兘鐢盋reateFile瀹屾垚錛屾垚鍔熺殑璇濓紝寰楀埌涓涓猈in32涓嬬殑鍙ユ焺錛岃繖涓嶅悓浜庘淐鈥濈殑fopen榪斿洖鐨勫彞鏌勩傚湪Win16涓嬶紝璇ュ彞鏌勫拰C榪愯搴撴枃浠舵搷浣滃嚱鏁扮浉瀹廣備絾鍦╓in32涓嬶紝鈥淐鈥濈殑鏂囦歡鎿嶄綔鍑芥暟涓嶈兘浣跨敤璇ュ彞鏌勶紝濡傛灉闇瑕佺殑璇濓紝鍙互浣跨敤鍑芥暟_open_osfhandle浠嶹in32鍙ユ焺寰楀埌涓涓淐鈥濇枃浠跺嚱鏁板彲浠ヤ嬌鐢ㄧ殑鏂囦歡鍙ユ焺銆?/font> 鍏抽棴鏂囦歡浣跨敤Win32鐨凜loseHandle銆?/font> 鍦╓in32涓嬶紝CreateFile鍙互鎿嶄綔鐨勫璞¢櫎浜?jiǎn)纾佺洏鏂囦欢澶栧Q岃繕鍖呮嫭璁懼鏂囦歡濡傞氳绔彛銆佺閬撱佹帶鍒跺彴杈撳叆銆侀偖浠舵Ы絳夌瓑銆?/font>
錛?錛変嬌鐢–File鍜屽叾媧劇敓綾昏繘琛屾枃浠舵搷浣溿侰File浠嶤Object媧劇敓錛屽叾媧劇敓綾誨寘鎷搷浣滄枃鏈枃浠剁殑CStdioFile錛屾搷浣滃唴瀛樻枃浠剁殑CmemFile錛岀瓑絳夈侰File鏄緩绔嬪湪Win32鐨勬枃浠舵搷浣滀綋緋葷殑鍩虹涓婏紝瀹冨皝瑁呬簡(jiǎn)閮ㄥ垎Win32鏂囦歡鎿嶄綔鍑芥暟銆傛渶濂芥槸浣跨敤CFile綾伙紙鎴栨淳鐢熺被錛夌殑瀵硅薄鏉ユ搷浣滄枃浠訛紝蹇呰鐨勮瘽錛屽彲浠ヤ粠榪欎簺綾繪淳鐢熻嚜宸辯殑鏂囦歡鎿嶄綔綾匯傜粺涓浣跨敤CFile鐨勭晫闈㈠彲浠ュ緱鍒板ソ鐨勭Щ妞嶆с?br />
2銆?a name="_Toc452640992">鏂囦歡鎿嶄綔鐨勬柟娉?
MFC鐢ㄤ竴浜涚被鏉ュ皝瑁呮枃浠惰闂殑Win32 API銆備互CFile涓哄熀紜錛屼粠CFile媧劇敓鍑哄嚑涓被錛屽CStdioFile錛孋MemFile錛孧FC鍐呴儴浣跨敤鐨凜MiororFile錛岀瓑絳夈?br />
2.1銆丆File鐨勭粨鏋?/b>
聽聽聽聽聽2.1.1銆丆File瀹氫箟鐨勬灇涓劇被鍨?/b>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽CFile綾誨畾涔変簡(jiǎn)涓浜涘拰鏂囦歡鎿嶄綔鐩稿叧鐨勬灇涓劇被鍨嬶紝涓昏鏈夊洓縐嶏細(xì)OpenFlags錛孉ttribute錛孲eekPosition錛宧FileNull銆備笅闈紝鍒嗗埆瑙i噴榪欎簺鏋氫婦綾誨瀷銆?/p>
OpenFlags瀹氫箟浜?3縐嶆枃浠惰闂拰鍏變韓妯″紡錛?/p>
enum OpenFlags {
//絎竴錛堜粠鍙籌紝涓嬪悓錛夎嚦絎簩浣嶏紝鎵撳紑鏂囦歡鏃惰闂ā寮忥紝璇?鍐?璇誨啓
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32浣峂FC涓病鐢?/p>
//絎簲鍒扮涓冧綅錛屾墦寮鏂囦歡鏃剁殑鍏變韓妯″紡
shareExclusive = 0x0010,//鐙崰鏂瑰紡錛岀姝㈠叾浠栬繘紼嬭鍐?/p>
shareDenyWrite = 0x0020,//紱佹鍏朵粬榪涚▼鍐?/p>
shareDenyRead = 0x0030,//紱佹鍏朵粬榪涚▼璇?/p>
shareDenyNone = 0x0040,//鍏佽鍏朵粬榪涚▼鍐?/p>
//絎叓浣嶏紝鎵撳紑鏂囦歡鏃剁殑鏂囦歡緇ф壙鏂瑰紡
modeNoInherit = 0x0080,//涓嶅厑璁稿瓙榪涚▼緇ф壙
//絎崄涓夈佸崄鍥涗綅錛屾槸鍚﹀垱寤烘柊鏂囦歡鍜屽垱寤烘柟寮?/p>
modeCreate = 0x1000,//鍒涘緩鏂版枃浠訛紝鏂囦歡闀垮害0
modeNoTruncate = 0x2000,//鍒涘緩鏂版枃浠舵椂濡傛枃浠跺凡瀛樺湪鍒欐墦寮
//絎崄浜斻佸崄鍏綅錛屾枃浠朵互浜岃繘鍒舵垨鑰呮枃鏈柟寮忔墦寮錛屽湪媧劇敓綾籆StdioFile涓敤
typeText = 0x4000,
typeBinary = (int)0x8000
};
Attribute瀹氫箟浜?jiǎn)鏂囦欢灞炴э細(xì)姝e父銆佸彧璇匯侀殣鍚佺郴緇熸枃浠訛紝鏂囦歡鎴栬呯洰褰曠瓑銆?/p>
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
}
SeekPosition瀹氫箟浜?jiǎn)涓壙U嶆枃浠朵綅緗細(xì)澶淬佸熬銆佸綋鍓嶏細(xì)
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
hFileNull瀹氫箟浜?jiǎn)绌烘枃錃g鍙ユ焺
enum { hFileNull = -1 };
2.1.2銆丆File鐨勫叾浠栦竴浜涙垚鍛樺彉閲?/b>
CFile闄や簡(jiǎn)瀹氫箟鏋氫婦綾誨瀷錛岃繕瀹氫箟浜?jiǎn)涓浜涙垚鍛樺彉閲忋備緥濡傦細(xì)
UINT m_hFile
璇ユ垚鍛樺彉閲忔槸public璁塊棶灞炴э紝淇濆瓨::CreateFile榪斿洖鐨勬搷浣滅郴緇熺殑鏂囦歡鍙ユ焺銆侻FC閲嶈澆浜?jiǎn)杩惤帡绗﹀彿HFILE鏉ヨ繑鍥瀖_hFile錛岃繖鏍峰湪浣跨敤HFILE綾誨瀷鍙橀噺鐨勫湴鏂瑰彲浠ヤ嬌鐢–File瀵硅薄銆?/p>
BOOL m_bCloseOnDelete;
CString m_strFileName;
榪欎袱涓垚鍛樺彉閲忔槸protected璁塊棶灞炴с俶_bCloseOnDelete鐢ㄦ潵鎸囩ず鏄惁鍦ㄥ叧闂枃浠舵椂鍒犻櫎CFile瀵硅薄錛沵_strFileName鐢ㄦ潵淇濆瓨鏂囦歡鍚嶃?br />
2.1.3銆丆File鐨勬垚鍛樺嚱鏁?/b>
CFile鐨勬垚鍛樺嚱鏁板疄鐜頒簡(jiǎn)瀵筗in32鏂囦歡鎿嶄綔鍑芥暟鐨勫皝瑁咃紝瀹屾垚浠ヤ笅鍔ㄤ綔錛氭墦寮銆佸垱寤恒佸叧闂枃浠訛紝鏂囦歡鎸囬拡瀹氫綅錛屾枃浠剁殑閿佸畾涓庤В閿侊紝鏂囦歡鐘舵佺殑璇誨彇鍜屼慨鏀癸紝絳夌瓑銆傚叾涓紝鐢ㄥ埌浜?jiǎn)m_hFile鏂囦歡鍙ユ焺鐨勪竴鑸槸铏氭嫙鍑芥暟錛屽拰姝ゆ棤鍏崇殑涓鑸槸闈欐佹垚鍛樺嚱鏁般備竴鑸湴錛屾垚鍛樺嚱鏁拌鏄犲皠鍒板搴旂殑Win32鍑芥暟錛屽琛?1-1鎵紺恒?/p>
琛?1-1 CFile鍑芥暟瀵筗in32鏂囦歡鍑芥暟鐨勫皝瑁?/p>
|
铏氭嫙 |
闈欐? |
鎴愬憳鍑芥暟 |
瀵瑰簲鐨刉in32鍑芥暟 |
|
鏂囦歡鐨勫垱寤恒佹墦寮銆佸叧闂? |
|||
|
鈭? |
銆 |
Abort |
CloseHandle |
|
鈭? |
銆 |
Duplicate |
DuplicateHandle |
|
鈭? |
銆 |
Open |
CreateFile |
|
鈭? |
銆 |
Close |
CloseHandle |
|
鏂囦歡鐨勮鍐? |
|||
|
鈭? |
銆 |
Read |
ReadFile |
| 銆 | 銆 |
ReadHuge錛堝悜鍚庡吋瀹癸級(jí) |
璋冪敤Read鎴愬憳鍑芥暟 |
|
鈭? |
銆 |
Write |
WriteFile |
| 銆 | 銆 |
WriteHuage(鍚戝悗鍏煎) |
璋冪敤Write鎴愬憳鍑芥暟 |
|
鈭? |
銆 |
Flush |
FlushFileBuffers |
|
鏂囦歡瀹氫綅 |
|||
|
鈭? |
銆 |
Seek |
SetFilePointer |
| 銆 | 銆 |
SeekToBegin |
璋冪敤Seek鎴愬憳鍑芥暟 |
| 銆 | 銆 |
SeekToEnd |
璋冪敤Seek鎴愬憳鍑芥暟 |
|
鈭? |
銆 |
GetLength |
璋冪敤Seek鎴愬憳鍑芥暟 |
|
鈭? |
銆 |
SetLength |
SetEndOfFile |
|
鏂囦歡鐨勯攣瀹?瑙i攣 |
|||
|
鈭? |
銆 |
LockRange |
LockFile |
|
鈭? |
銆 |
UnlockRange |
UnlockFile |
|
鏂囦歡鐘舵佹搷浣滃嚱鏁? |
|||
|
鈭? |
銆 |
GetPosition |
SetFilePointer |
| 銆 | 銆 |
GetStatus(CFileStatus&) |
GetFileTime,GetFileSize絳? |
| 銆 |
鈭? |
GetStatus(LPSTR lpszFileName CFileStatus&) |
FindFirstFile |
|
鈭? |
銆 |
GetFileName |
涓嶆槸綆鍗曞湴鏄犲皠鍒版煇涓嚱鏁? |
|
鈭? |
銆 |
GetFileTitle |
銆 |
|
鈭? |
銆 |
GetFilePath |
銆 |
|
鈭? |
銆 |
SetFilePath |
銆 |
| 銆 |
鈭? |
SetStatus |
銆 |
|
鏀瑰悕鍜屽垹闄? |
|||
| 銆 |
鈭? |
Rename |
MoveFile |
| 銆 |
鈭? |
Remove |
DeleteFile |
2.1.4銆丆File鐨勯儴鍒嗗疄鐜?/b>
榪欓噷涓昏璁ㄨCFile瀵硅薄鐨勬瀯閫犲嚱鏁板拰鏂囦歡鐨勬墦寮/鍒涘緩鐨勮繃紼嬨?/p>
CFile鏈夊涓嬪嚑涓瀯閫犲嚱鏁幫細(xì)
緙虹渷鏋勯犲嚱鏁幫紝浠呬粎鏋勯犱竴涓狢File瀵硅薄錛岃繕蹇呴』浣跨敤Open鎴愬憳鍑芥暟鏉ユ墦寮鏂囦歡銆?/p>
宸茬粡鎵撳紑浜?jiǎn)涓涓枃浠秇File錛屽湪姝ゅ熀紜涓婃瀯閫犱竴涓狢File瀵硅薄鏉ョ粰瀹冩墦鍖呫侶File灝嗚璧嬪肩粰C(jī)File鐨勬垚鍛樺彉閲弇_hFile銆?/p>
鎸囧畾涓涓枃浠跺悕鍜屾枃浠舵墦寮鏂瑰紡錛屾瀯閫燙File瀵硅薄錛岃皟鐢∣pen鎵撳紑/鍒涘緩鏂囦歡錛屾妸鏂囦歡鍙ユ焺淇濆瓨鍒癿_hFile銆?/p>
Open鐨勫師鍨嬪涓嬶細(xì)
BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pException)
Open璋冪敤Win32鍑芥暟::CreateFile鎵撳紑鏂囦歡錛屽茍鎶婃枃浠跺彞鏌勪繚瀛樺埌鎴愬憳鍙橀噺m_hFile涓?/p>
CreateFile鍑芥暟鐨勫師鍨嬪涓嬶細(xì)
HANDLE CreateFile(
LPCTSTR lpFileName,// pointer to name of the file
DWORD dwDesiredAccess,// access (read-write) mode
DWORD dwShareMode,// share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
DWORD dwCreationDistribution,// how to create
DWORD dwFlagsAndAttributes,// file attributes
HANDLE hTemplateFile// handle to file with attributes to copy
);
鏄劇劧錛孫pen蹇呴』鎶婅嚜宸辯殑涓や釜鍙傛暟l(fā)pszFileName鍜宯OpenFlags鏄犲皠鍒癈reateFile鐨勪竷涓弬鏁頒笂銆?/p>
浠嶰penFlags鐨勫畾涔夊彲浠ョ湅鍑猴紝錛坣OpenFlags & 3)琛ㄧず浜?jiǎn)璇诲啓鏍囪瘑锛屾槧灏勬垚鍙橀噺dwAccess錛屽彲浠ュ彇鍊間負(fù)Win32鐨凣ENERIC_READ銆丟ENERIC_WRITE銆丟ENERIC_READ|GENERIC_WRITE銆?/p>
錛坣OpenFlags & 0x70)琛ㄧず浜?jiǎn)鍏变韩妯″紡锛屾槧灏勬垚鍙橀噺dwShareMode錛屽彲浠ュ彇鍊間負(fù)Win32鐨凢ILE_SHARE_READ銆丗ILE_SHARE_WRITE銆丗ILE_SHARE_WRITE|FILE_SHARE_READ銆?/p>
Open瀹氫箟浜?jiǎn)涓涓眬閮ㄧ殑SECURITY_ATTRIBUTES鍙橀噺sa錛?nOpenFlags & 0x80)琚祴鍊肩粰sa.bInheritHandle銆?/p>
(nOpenFlags & modeCreate)琛ㄧず浜?jiǎn)鍒涘缓鏂瑰紡锛屾槧灏勬垚鍙橀噺dwCreateFlag錛屽彲浠ュ彇鍊間負(fù)Win32鐨凮PEN_ALWAYS銆丆REATE_ALWAYS銆丱PEN_EXISTING銆?/p>
鍦ㄧ敓鎴愪簡(jiǎn)涓婅堪鍙傛暟涔嬪悗錛屽厛璋冪敤::CreateFile錛?/p>
HANDLE hFile =::CreateFile(lpszFileName,
dwAccess, dwShareMode, &sa,
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
鐒跺悗錛宧File琚祴鍊肩粰鎴愬憳鍙橀噺m_hFile錛宮_bCloseOnDelete琚緗負(fù)TRUE銆?/p>
鐢變笂鍙互鐪嬪嚭錛孋File鎵撳紑(鍒涘緩)涓涓枃浠舵椂澶уぇ綆鍖栦簡(jiǎn):: CreateFile鍑芥暟鐨勫鏉傛э紝鍗沖彧闇瑕佹寚瀹氫竴涓枃浠跺悕銆佷竴涓墦寮鏂囦歡鐨勫弬鏁板嵆鍙傝嫢璇ュ弬鏁版寚瀹氫負(fù)0錛屽垯琛ㄧず浠ュ彧璇繪柟寮忔墦寮涓涓瓨鍦ㄧ殑鏂囦歡錛岀嫭鍗犱嬌鐢紝涓嶅厑璁稿瓙榪涚▼緇ф壙銆?/p>
鍦–File瀵硅薄浣跨敤鏃訛紝濡傛灉瀹冩槸鍦ㄥ爢涓垎閰嶇殑錛屽垯搴旇閿姣佸畠錛涘鏋滃湪鏍堜腑鍒嗛厤鐨勶紝鍒機(jī)File瀵硅薄灝嗚鑷姩閿姣併傞攢姣佹椂鏋愭瀯鍑芥暟琚皟鐢紝鏋愭瀯鍑芥暟鏄櫄鎷熷嚱鏁般傝嫢m_bCloseOnDelete涓虹湡涓攎_hFile闈炵┖錛屽垯鏋愭瀯鍑芥暟璋冪敤Close鍏抽棴鏂囦歡銆?/p>
鑷充簬鍏朵粬CFile鎴愬憳鍑芥暟鐨勫疄鐜幫紝榪欓噷涓嶄綔鍒嗘瀽浜?jiǎn)銆?/p>
2.1.5銆丆File鐨勬淳鐢熺被
榪欓噷涓昏綆瑕佸湴浠嬬粛CStdioFile鍜孋memFile鍙?qiáng)CFileFind銆?/p>
CStdioFile瀵規(guī)枃鏈枃浠惰繘琛屾搷浣溿?/p>
CStdioFile瀹氫箟浜?jiǎn)鏂扮殑鎴愬憳鍙橀噺m_pStream錛岀被鍨嬫槸FILE*銆傚湪鎵撳紑鎴栬呭垱寤烘枃浠舵椂錛屼嬌鐢╛open_osfhandle浠巑_hFile(Win32鏂囦歡鍙ユ焺)寰楀埌涓涓淐鈥濈殑FILE綾誨瀷鐨勬枃浠舵寚閽堬紝鐒跺悗錛屽湪鏂囦歡鎿嶄綔涓紝浣跨敤鈥淐鈥濈殑鏂囦歡鎿嶄綔鍑芥暟銆備緥濡傦紝璇繪枃浠朵嬌鐢╛fread錛岃屼笉鏄?:ReadFile錛屽啓鏂囦歡浣跨敤浜?jiǎn)_fwrite錛岃屼笉鏄?:WriteFile錛岀瓑絳夈俶_hFile鏄疌File鐨勬垚鍛樺彉閲忋?/p>
鍙﹀錛孋StdioFile涓嶆敮鎸丆File鐨凞umplicate銆丩ockRange銆乁nlockRange鎿嶄綔錛屼絾鏄疄鐜頒簡(jiǎn)涓や釜鏂扮殑鎿嶄綔ReadString鍜學(xué)riteString銆?/p>
CMemFile鎶婁竴鍧楀唴瀛樺綋浣滀竴涓枃浠舵潵鎿嶄綔錛屾墍浠ワ紝瀹冩病鏈夋墦寮鏂囦歡鐨勬搷浣滐紝鑰屾槸璁捐浜?jiǎn)Attach鍜孌etach鐢ㄦ潵鍒嗛厤鎴栬呴噴鏀句竴鍧楀唴瀛樸傜浉搴斿湴錛屽畠鎻愪緵浜?jiǎn)Alloc銆丗ree铏氭嫙鍑芥暟鏉ユ搷浣滃唴瀛樻枃浠訛紝瀹冭鐩栦簡(jiǎn)Read銆乄rite鏉ヨ鍐欏唴瀛樻枃浠躲?/p>
涓轟簡(jiǎn)鏂逛究鏂囦歡鏌ユ壘錛孧FC鎶婃湁鍏沖姛鑳藉綊緇撴垚涓轟竴涓被CFileFind銆侰FileFind媧劇敓浜嶤Object綾匯傞鍏堬紝瀹冧嬌鐢‵indFile鍜孎ineNextFile鍖呰浜?jiǎn)Win32鍑芥暟::FindFirstFile鍜?:FindNextFile錛涘叾嬈★紝瀹冩彁渚涗簡(jiǎn)璁稿鍑芥暟鐢ㄦ潵鑾峰彇鏂囦歡鐨勭姸鎬佹垨鑰呭睘鎬с?/p>
浣跨敤CFileStatus緇撴瀯鏉ユ弿榪版枃浠剁殑灞炴э紝鍏跺畾涔夊涓嬶細(xì)
struct CFileStatus
{
CTime m_ctime; // 鏂囦歡鍒涘緩鏃墮棿
CTime m_mtime; // 鏂囦歡鏈榪戜竴嬈′慨鏀規(guī)椂闂?/p>
CTime m_atime; // 鏂囦歡鏈榪戜竴嬈¤闂椂闂?/p>
LONG m_size; // 鏂囦歡澶у皬
BYTE m_attribute; // 鏂囦歡灞炴?/p>
BYTE _m_padding; // 娌℃湁瀹為檯鍚箟錛岀敤鏉ュ鍔犱竴涓瓧鑺?/p>
TCHAR m_szFullName[_MAX_PATH]; //緇濆璺緞
#ifdef _DEBUG
//瀹炵幇Dump铏氭嫙鍑芥暟錛岃緭鍑烘枃浠跺睘鎬?/p>
void Dump(CDumpContext& dc) const;
#endif
};
渚嬪錛?/p>
CFileStatus status;
pFile->GetStatus(status);
#ifdef _DEBUG
status.dump(afxDump);
#endif
銆
MFCWin32鎴栬匔璇█鐨勫唴瀛樺垎閰岮PI錛屾湁鍥涚鍐呭瓨鍒嗛厤API鍙緵浣跨敤銆?
姣忎竴涓繘紼嬮兘鍙互浣跨敤鍫嗗垎閰嶅嚱鏁板垱寤轟竴涓鏈夌殑鍫嗏攢鈹璋冪敤榪涚▼鍦板潃絀洪棿鐨勪竴涓垨鑰呭涓〉闈€侱LL鍒涘緩鐨勭鏈夊爢蹇呭畾鍦ㄨ皟鐢―LL鐨勮繘紼嬬殑鍦板潃絀洪棿鍐咃紝鍙兘琚皟鐢ㄨ繘紼嬭闂?
HeapCreate鐢ㄦ潵鍒涘緩鍫嗭紱HeapAlloc鐢ㄦ潵浠庡爢涓垎閰嶄竴瀹氭暟閲忕殑絀洪棿錛孒eapAlloc鍒嗛厤鐨勫唴瀛樻槸涓嶈兘縐誨姩鐨勶紱HeapSize鍙互紜畾浠庡爢涓垎閰嶇殑絀洪棿鐨勫ぇ灝忥紱HeapFree鐢ㄦ潵閲婃斁浠庡爢涓垎閰嶇殑絀洪棿錛汬eapDestroy閿姣佸垱寤虹殑鍫嗐?
鐢變簬Win32閲囩敤騫抽潰鍐呭瓨緇撴瀯妯″紡錛學(xué)in32涓嬬殑鍏ㄥ眬鍜屽眬閮ㄥ唴瀛樺嚱鏁伴櫎浜?jiǎn)鍚嶅瓧涓嶅悓澶栧Q屽叾浠栧畬鍏ㄧ浉鍚屻備換涓鍑芥暟閮藉彲浠ョ敤鏉ュ垎閰嶄換鎰忓ぇ灝忕殑鍐呭瓨錛堜粎浠呭彈鍙敤鐗╃悊鍐呭瓨鐨勯檺鍒訛級(jí)銆傜敤娉曞彲浠ュ拰W(xué)in16涓嬪熀鏈竴鏍楓?
Win32涓嬩繚鐣欒繖綾誨嚱鏁頒繚璇佷簡(jiǎn)鍜學(xué)in16鐨勫吋瀹廣?
C璇█鐨勬爣鍑嗗唴瀛樺垎閰嶅嚱鏁板寘鎷互涓嬪嚱鏁幫細(xì)
malloc錛宑alloc錛宺ealloc錛宖ree錛岀瓑銆?
榪欎簺鍑芥暟鏈鍚庨兘鏄犲皠鎴愬爢API鍑芥暟錛屾墍浠ワ紝malloc鍒嗛厤鐨勫唴瀛樻槸涓嶈兘縐誨姩鐨勩傝繖浜涘嚱鏁扮殑璋冨紡鐗堟湰涓?
malloc_dbg錛宑alloc_dbg錛宺ealloc_dbg錛宖ree_dbg錛岀瓑銆?
铏氭嫙鍐呭瓨API鏄叾浠朅PI鐨勫熀紜銆傝櫄鎷熷唴瀛楢PI浠ラ〉涓烘渶灝忓垎閰嶅崟浣嶏紝X86涓婇〉闀垮害涓?KB錛屽彲浠ョ敤GetSystemInfo鍑芥暟鎻愬彇欏甸暱搴︺傝櫄鎷熷唴瀛樺垎閰嶅嚱鏁板寘鎷互涓嬪嚱鏁幫細(xì)
DWORD cbSize,
DWORD fdwAllocationType,
DWORD fdwProtect);
璇ュ嚱鏁扮敤鏉ュ垎閰嶄竴瀹氳寖鍥寸殑铏氭嫙欏點(diǎn)傚弬鏁?鎸囧畾璧峰鍦板潃錛涘弬鏁?鎸囧畾鍒嗛厤鍐呭瓨鐨勯暱搴︼紱鍙傛暟3鎸囧畾鍒嗛厤鏂瑰紡錛屽彇鍊糓EM_COMMINT鎴栬匨EM_RESERVE錛涘弬鏁?鎸囧畾鎺у埗璁塊棶鏈鍒嗛厤鐨勫唴瀛樼殑鏍囪瘑錛屽彇鍊間負(fù)PAGE_READONLY銆丳AGE_READWRITE鎴栬匬AGE_NOACCESS銆?
LPVOID lpvAddress,
DWORD cbSize,
DWORD fdwAllocationType,
DWORD fdwProtect);
璇ュ嚱鏁板姛鑳界被浼間簬VirtualAlloc錛屼絾鏄厑璁告寚瀹氳繘紼媝rocess銆俈irtaulFree銆乂irtualProtect銆乂irtualQuery閮芥湁瀵瑰簲鐨勬墿灞曞嚱鏁般?
DWORD dwSize,
DWORD dwFreeType);
璇ュ嚱鏁扮敤鏉ュ洖鏀舵垨鑰呴噴鏀懼垎閰嶇殑铏氭嫙鍐呭瓨銆傚弬鏁?鎸囧畾甯屾湜鍥炴敹鎴栬呴噴鏀懼唴瀛樼殑鍩哄湴鍧錛涘鏋滄槸鍥炴敹錛屽弬鏁?鍙互鎸囧悜铏氭嫙鍦板潃鑼冨洿鍐呯殑浠諱綍鍦版柟錛屽鏋滄槸閲婃斁錛屽弬鏁?蹇呴』鏄疺irtualAlloc榪斿洖鐨勫湴鍧錛涘弬鏁?鎸囧畾鏄惁閲婃斁鎴栬呭洖鏀跺唴瀛橈紝鍙栧間負(fù)MEM_DECOMMINT鎴栬匨EM_RELEASE銆?
DWORD cbSize,
DWORD fdwNewProtect,
PDWORD pfdwOldProtect);
璇ュ嚱鏁扮敤鏉ユ妸宸茬粡鍒嗛厤鐨勯〉鏀瑰彉鎴愪繚鎶ら〉銆傚弬鏁?鎸囧畾鍒嗛厤欏電殑鍩哄湴鍧錛涘弬鏁?鎸囧畾淇濇姢欏電殑闀垮害錛涘弬鏁?鎸囧畾欏電殑淇濇姢灞炴э紝鍙栧糚AGE_READ銆丳AGE_WRITE銆丳AGE_READWRITE絳夌瓑錛涘弬鏁?鐢ㄦ潵榪斿洖鍘熸潵鐨勪繚鎶ゅ睘鎬с?
PMEMORY_BASIC_INFORMATION lpBuffer,
DWORD dwLength
);
璇ュ嚱鏁扮敤鏉ユ煡璇㈠唴瀛樹腑鎸囧畾欏電殑鐗規(guī)с傚弬鏁?鎸囧悜甯屾湜鏌ヨ鐨勮櫄鎷熷湴鍧錛涘弬鏁?鏄寚鍚戝唴瀛樺熀鏈俊鎭粨鏋勭殑鎸囬拡錛涘弬鏁?鎸囧畾鏌ヨ鐨勯暱搴︺?
璇ュ嚱鏁扮敤鏉ラ攣瀹氬唴瀛橈紝閿佸畾鐨勫唴瀛橀〉涓嶈兘浜ゆ崲鍒伴〉鏂囦歡銆傚弬鏁?鎸囧畾瑕侀攣瀹氬唴瀛樼殑璧峰鍦板潃錛涘弬鏁?鎸囧畾閿佸畾鐨勯暱搴︺?
鍙傛暟1鎸囧畾瑕佽В閿佺殑鍐呭瓨鐨勮搗濮嬪湴鍧錛涘弬鏁?鎸囧畾瑕佽В閿佺殑鍐呭瓨鐨勯暱搴︺?br />
C++鐨刵ew 鍜?delete鎿嶄綔絎?
MFC瀹氫箟浜?jiǎn)涓たU嶄綔鐢ㄨ寖鍥寸殑new鍜宒elete鎿嶄綔絎︺傚浜巒ew錛屼笉璁哄摢縐嶏紝鍙傛暟1綾誨瀷蹇呴』鏄痵ize_t錛屼笖榪斿洖void綾誨瀷鎸囬拡銆?
鍘熷瀷濡備笅錛?
void _cdecl ::operator new(size_t nSize);
void __cdecl operator delete(void* p);
璋冭瘯鐗堟湰錛?
void* __cdecl operator new(size_t nSize, int nType,
LPCSTR lpszFileName, int nLine)
鍘熷瀷濡備笅錛?
void* PASCAL classname::operator new(size_t nSize);
void PASCAL classname::operator delete(void* p);
綾葷殑operator new鎿嶄綔絎︽槸綾葷殑闈欐佹垚鍛樺嚱鏁幫紝瀵硅綾葷殑瀵硅薄鏉ヨ灝嗚鐩栧叏灞鐨刼perator new銆傚叏灞鐨刼perator new鐢ㄦ潵緇欏唴閮ㄧ被鍨嬪璞★紙濡俰nt錛夈佹病鏈夊畾涔塷perator new鎿嶄綔絎︾殑綾葷殑瀵硅薄鍒嗛厤鍐呭瓨銆?
new鎿嶄綔絎﹁鏄犲皠鎴恗alloc鎴栬卪alloc_dbg錛宒elete琚槧灝勬垚free鎴栬協(xié)ree_dbg銆?
MFC搴旂敤紼嬪簭鍙互浣跨敤C榪愯搴撶殑璋冭瘯鎵嬫錛屼篃鍙互浣跨敤MFC鎻愪緵鐨勮皟璇曟墜孌點(diǎn)備袱縐嶈皟璇曟墜孌靛垎鍒榪板涓嬨?br />
C榪愯搴撴彁渚涘拰鏀寔鐨勮皟璇曞姛鑳藉涓嬶細(xì)
鐢ㄦ潵鎶ュ憡搴旂敤紼嬪簭鐨勮皟璇曠増鏈繍琛屾椂鐨勮鍛婂拰鍑洪敊淇℃伅銆傚寘鎷細(xì)
_CrtDbgReport 鐢ㄦ潵鎶ュ憡璋冭瘯淇℃伅錛?/p>
_CrtSetReportMode 璁劇疆鏄惁璀﹀憡銆佸嚭閿欐垨鑰呮柇璦淇℃伅錛?/p>
_CrtSetReportFile 璁劇疆鏄惁鎶婅皟璇曚俊鎭啓鍏ュ埌涓涓枃浠躲?/p>
鏂█瀹忎富瑕佹湁錛?/p>
assert 媯(gè)楠屾煇涓潯浠舵槸鍚︽弧瓚籌紝涓嶆弧瓚崇粓姝㈢▼搴忔墽琛屻?/p>
楠岃瘉鍑芥暟涓昏鏈夛細(xì)
_CrtIsValidHeapPointer 楠岃瘉鏌愪釜鎸囬拡鏄惁鍦ㄦ湰鍦板爢涓紱
_CrtIsValidPointer 楠岃瘉鎸囧畾鑼冨洿鐨勫唴瀛樻槸鍚﹀彲浠ヨ鍐欙紱
_CrtIsMemoryBlock 楠岃瘉鏌愪釜鍐呭瓨鍧楁槸鍚﹀湪鏈湴鍫嗕腑銆?/p>
malloc_dbg 鍒嗛厤鍐呭瓨鏃朵繚瀛樻湁鍏沖唴瀛樺垎閰嶇殑淇℃伅錛屽鍦ㄤ粈涔堟枃浠躲佸摢涓琛屽垎閰嶇殑鍐呭瓨絳夈傛湁涓緋誨垪鐢ㄦ潵鎻愪緵鍐呭瓨璇婃柇鐨勫嚱鏁幫細(xì)
_CrtMemCheckpoint 淇濆瓨鍐呭瓨蹇収鍦ㄤ竴涓猒CrtMemState緇撴瀯涓紱
_CrtMemDifference 姣旇緝涓や釜_CrtMemState錛?/p>
_CrtMemDumpStatistics 杞偍杈撳嚭涓_CrtMemState緇撴瀯鐨勫唴瀹癸紱
_CrtMemDumpAllObjectsSince 杈撳嚭涓婃蹇収鎴栫▼搴忓紑濮嬫墽琛屼互鏉ュ湪鍫嗕腑鍒嗛厤鐨勬墍鏈夊璞$殑淇℃伅錛?/p>
_CrtDumpMemoryLeaks 媯(gè)嫻嬬▼搴忔墽琛屼互鏉ョ殑鍐呭瓨婕忔礊錛屽鏋滄湁婕忔礊鍒欒緭鍑烘墍鏈夊垎閰嶇殑瀵硅薄銆?/p>
2.聽聽聽聽聽 MFC鎻愪緵鐨勮皟璇曟墜孌?/b>
MFC鍦–榪愯搴撴彁渚涘拰鏀寔鐨勮皟璇曞姛鑳藉熀紜涓婏紝璁捐浜?jiǎn)涓浜涚被銆佸嚱鏁扮瓑鏉ュ崗鍔╄皟璇曘?/p>
ASSERT
浣跨敤ASSERT鏂█鍒ゅ畾紼嬪簭鏄惁鍙互緇х畫鎵ц銆?/p>
TRACE
浣跨敤TRACE瀹忔樉紺烘垨鑰呮墦鍗拌皟璇曚俊鎭俆RACE鏄氳繃鍑芥暟AfxTrace瀹炵幇鐨勩傜敱浜嶢fxTrace鍑芥暟浣跨敤浜?jiǎn)cdecl璋冪敤綰﹀畾錛屾晠鍙互鎺ュ彈涓暟涓嶅畾鐨勫弬鏁幫紝濡傚悓printf鍑芥暟涓鏍楓傚畠鐨勫畾涔夊拰瀹炵幇濡備笅錛?/p>
void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...)
{
#ifdef _DEBUG // all AfxTrace output is controlled by afxTraceEnabled
if (!afxTraceEnabled)
return;
#endif
//澶勭悊涓暟涓嶅畾鐨勫弬鏁?/p>
va_list args;
va_start(args, lpszFormat);
int nBuf;
TCHAR szBuffer[512];
nBuf = _vstprintf(szBuffer, lpszFormat, args);
ASSERT(nBuf < _countof(szBuffer));
if ((afxTraceFlags & traceMultiApp) && (AfxGetApp() != NULL))
afxDump << AfxGetApp()->m_pszExeName << ": ";
afxDump << szBuffer;
va_end(args);
}
#endif //_DEBUG
鍦ㄧ▼搴忔簮鐮佷腑錛屽彲浠ユ帶鍒舵槸鍚︽樉紺鴻窡韙俊鎭紝鏄劇ず浠涔堣窡韙俊鎭傚鏋滃叏灞鍙橀噺afxTraceEnabled涓篢RUE錛屽垯TRACE瀹忓彲浠ヨ緭鍑猴紱鍚﹀垯錛屾病鏈塗RACE淇℃伅琚緭鍑恒傚鏋滈氳繃afxTraceFlags鎸囧畾浜?jiǎn)璺燀t粈涔堟秷鎭紝鍒欒緭鍑烘湁鍏寵窡韙俊鎭紝渚嬪涓轟簡(jiǎn)鎸囧畾鈥淢ultilple Application Debug鈥濓紝浠fxTraceFlags|=traceMultiApp銆傚彲浠ヨ窡韙殑淇℃伅鏈夛細(xì)
enum AfxTraceFlags
{
traceMultiApp = 1, // multi-app debugging
traceAppMsg = 2, // main message pump trace (includes DDE)
traceWinMsg = 4, // Windows message tracing
traceCmdRouting = 8, // Windows command routing trace
//(set 4+8 for control notifications)
traceOle = 16, // special OLE callback trace
traceDatabase = 32, // special database trace
traceInternet = 64 // special Internet client trace
};
榪欐牱錛屽簲鐢ㄧ▼搴忓彲浠ュ湪闇瑕佺殑鍦版柟鎸囧畾afxTraceEnabled鐨勫兼墦寮鎴栬呭叧闂璗RACE寮鍏籌紝鎸囧畾AfxTraceFlags鐨勫艱繃婊よ窡韙俊鎭?/p>
Visual C++鎻愪緵浜?jiǎn)涓涓猅RACE宸ュ叿錛屼篃鍙互鐢ㄦ潵瀹屾垚涓婅堪鍔熻兘銆?/p>
涓轟簡(jiǎn)鏄劇ず娑堟伅淇℃伅錛孧FC鍐呴儴瀹氫箟浜?jiǎn)涓涓狝FX_MAP_MESSAG綾誨瀷鐨勬暟緇刟llMessages錛屽偍瀛樹簡(jiǎn)Windows娑堟伅鍜屾秷鎭悕鏄犲皠瀵廣備緥濡傦細(xì)
allMessages[1].nMsg = WM_CREATE,
allMessages[1].lpszMsg = 鈥淲M_CREATE鈥?/p>
MFC鍐呴儴榪樹嬌鐢ㄥ嚱鏁癬AfxTraceMsg鏄劇ず璺熻釜娑堟伅錛屽畠鍙互鎺ユ敹涓涓瓧絎︿覆鍜屼竴涓狹SG鎸囬拡錛岀劧鍚庯紝鎶婅瀛楃涓插拰MSG鐨勫悇涓煙鐨勪俊鎭粍鍚堟垚涓涓ぇ鐨勫瓧絎︿覆騫朵嬌鐢ˋfxTrace鏄劇ず鍑烘潵銆?/p>
allMessages鍜屽嚱鏁癬AfxTraceMsg鐨勮緇嗗疄鐜板彲浠ュ弬瑙丄fxTrace.cpp銆?/p>
瀵硅薄鍐呭杞偍鏄疌Object綾繪彁渚涚殑鍔熻兘錛屾墍鏈変粠瀹冩淳鐢熺殑綾婚兘鍙互閫氳繃瑕嗙洊铏氭嫙鍑芥暟DUMP鏉ユ敮鎸佽鍔熻兘銆傚湪璁茶堪CObject綾繪椂鏇炬彁鍒拌繃銆?/p>
铏氭嫙鍑芥暟Dump鐨勫畾涔夛細(xì)
class ClassName : public CObject
{
public:
#ifdef _DEBUG
virtual void Dump( CDumpContext& dc ) const;
#endif
鈥?/p>
};
鍦ㄤ嬌鐢―ump鏃訛紝蹇呴』緇欏畠鎻愪緵涓涓狢DumpContext綾誨瀷鐨勫弬鏁幫紝璇ュ弬鏁版寚瀹氱殑瀵硅薄灝嗚礋璐h緭鍑鴻皟璇曚俊鎭備負(fù)姝わ紝MFC鎻愪緵浜?jiǎn)涓涓瀹氫箟鐨勫叏灞CDumpContext瀵硅薄afxDump錛屽畠鎶婅皟璇曚俊鎭緭閫佺粰璋冭瘯鍣ㄧ殑璋冭瘯紿楀彛銆備粠鍓嶉潰AfxTrace鐨勫疄鐜板彲浠ョ煡閬擄紝MFC浣跨敤浜?jiǎn)afxDump杈撳嚭璺熻釜淇℃伅鍒拌皟璇曠獥鍙c?/p>
CDumpContext綾繪病鏈夊熀綾伙紝瀹冩彁渚涗簡(jiǎn)浠ユ枃鏈艦寮忚緭鍑鴻瘖鏂俊鎭殑鍔熻兘銆?/p>
渚嬪錛?/p>
CPerson* pMyPerson = new CPerson;
// set some fields of the CPerson object...
//...
// now dump the contents
#ifdef _DEBUG
pMyPerson->Dump( afxDump );
#endif
瀵硅薄鏈夋晥鎬ф嫻嬫槸CObject綾繪彁渚涚殑鍔熻兘錛屾墍鏈変粠瀹冩淳鐢熺殑綾婚兘鍙互閫氳繃瑕嗙洊铏氭嫙鍑芥暟AssertValid鏉ユ敮鎸佽鍔熻兘銆傚湪璁茶堪CObject綾繪椂鏇炬彁鍒拌繃銆?/p>
铏氭嫙鍑芥暟AssertValid鐨勫畾涔夛細(xì)
class ClassName : public CObject
{
public:
#ifdef _DEBUG
virtual void AssertValid( ) const;
#endif
鈥?
};
浣跨敤ASSERT_VALID瀹忓垽鏂竴涓璞℃槸鍚︽湁鏁堬紝璇ュ璞$殑綾誨繀欏昏鐩栦簡(jiǎn)AssertValid鍑芥暟銆傚艦寮忎負(fù)錛欰SSERT_VALID(pObject)銆?/p>
鍙﹀錛孧FC鎻愪緵浜?jiǎn)涓浜涘嚱鏁版潵鍒ゆ柇鍦板潃鏄惁鏈夋晥錛屽錛?/p>
AfxIsMemoryBlock錛孉fxIsString錛孉fxIsValidAddress銆?/p>
10.1.3鍐呭瓨璇婃柇
MFC浣跨敤DEBUG_NEW鏉ヨ窡韙唴瀛樺垎閰嶆椂鐨勬墽琛岀殑婧愮爜鏂囦歡鍜岃鏁般?/p>
鎶?define new DEBUG_NEW鎻掑叆鍒版瘡涓涓簮鏂囦歡涓紝榪欐牱錛岃皟璇曠増鏈氨浣跨敤_malloc_dbg鏉ュ垎閰嶅唴瀛樸侻FC Appwizard鍦ㄥ垱寤烘鏋舵枃浠舵椂宸茬粡浣滀簡(jiǎn)榪欐牱鐨勫鐞嗐?/p>
MFC鎻愪緵浜?jiǎn)鍑芥暟AfxDoForAllObjects鏉ヨ拷韙姩鎬佸垎閰嶇殑鍐呭瓨瀵硅薄錛屽嚱鏁板師鍨嬪涓嬶細(xì)
void AfxDoForAllObjects( void (*pfn)(CObject* pObject,
void* pContext), void* pContext );
鍏朵腑錛?/p>
鍙傛暟1鏄竴涓嚱鏁版寚閽堬紝AfxDoForAllObjects瀵規(guī)瘡涓璞¤皟鐢ㄨ鎸囬拡琛ㄧず鐨勫嚱鏁般?/p>
鍙傛暟2灝嗕紶閫掔粰鍙傛暟1鎸囧畾鐨勫嚱鏁般?/p>
AfxDoForAllObjects鍙互媯(gè)嫻嬪埌鎵鏈変嬌鐢╪ew鍒嗛厤鐨凜Object瀵硅薄鎴栬匔Object綾繪淳鐢熺殑瀵硅薄錛屼絾鍏ㄥ眬瀵硅薄銆佸祵鍏ュ璞″拰鏍堜腑鍒嗛厤鐨勫璞¢櫎澶栥?/p>
10.1.4鍐呭瓨婕忔礊媯(gè)嫻?/strong>
浠呬粎鐢ㄤ簬new鐨凞EBUG鐗堟湰鍒嗛厤鐨勫唴瀛樸?/p>
瀹屾垚鍐呭瓨婕忔礊媯(gè)嫻嬶紝闇瑕佸涓嬬郴鍒楁楠わ細(xì)
afxMemDF錛宒elayFreeMemDF錛宑heckAlwaysMemDF
鍏朵腑錛歛llocMemDF琛ㄧず鍙互榪涜鍐呭瓨璇婃柇杈撳嚭錛沝elayFreeMemDF琛ㄧず鏄惁鏄湪搴旂敤紼嬪簭緇撴潫鏃舵墠璋冪敤free鎴栬卍elete錛岃繖鏍峰鑷寸▼搴忔渶澶у彲鑳界殑鍒嗛厤鍐呭瓨錛沜heckAlwaysMemDF琛ㄧず姣忎竴嬈″垎閰嶆垨鑰呴噴鏀懼唴瀛樹箣鍚庨兘璋冪敤鍑芥暟AfxCheckMemory榪涜鍐呭瓨?gòu)個(gè)嫻嬶紙AfxCheckMemory媯(gè)鏌ュ爢涓墍鏈夐氳繃new鍒嗛厤鐨勫唴瀛橈紙涓嶅惈malloc錛夛級(jí)銆?/p>
榪欎竴姝ユ槸鍙夋楠わ紝闈炲繀欏匯?/p>
渚嬪錛?/p>
// Declare the variables needed
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif
// do your memory allocations and deallocations...
CString s = "This is a frame variable";
// the next object is a heap object
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpStatistics();
//or diffMemState.DumpAllObjectsSince();
}
#endif
MFC鍦ㄥ簲鐢ㄧ▼搴忥紙璋冭瘯鐗堬級(jí)緇撴潫鏃訛紝鑷姩榪涜鍐呭瓨婕忔礊媯(gè)嫻嬶紝濡傛灉瀛樺湪婕忔礊錛屽垯杈撳嚭婕忔礊鐨勬湁鍏充俊鎭?/p>