锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 褰撳ご鏂囦歡涓0鏄庝簡涓涓嚱鏁幫紝浣嗘槸鍦ㄧ浉搴旂殑婧愭枃浠朵腑鍗存病鏈夊璇ュ嚱鏁拌繘琛屽畾涔夛紝鍒欎細鍑虹幇涓?#8220;瑙e喅鐨勫閮ㄧ鍙?#8221;錛坲nresolved external symbol 錛夐敊璇傚彟澶栵紝褰撲竴涓嚱鏁拌皟鐢ㄤ簡澶栭儴鐨勪竴涓簱鏂囦歡涓殑鍑芥暟錛屼絾鏄湪褰撳墠project鐨刾roperties涓茍娌℃湁灝嗘墍渚濊禆鐨勶紙dependent錛夊簱鏂囦歡鍖呭惈榪涙潵鏃訛紝涔熶細鍑虹幇榪欑閿欒銆?/p>
緇間笂錛屽綋涓涓猻olution鍦╨inking鏃舵壘涓嶅埌鎵娑夊強鍒扮殑鍑芥暟鐨勫畾涔夋椂灝變細鍑虹幇“unresolved external symbol ”閿欒銆?/p>
渚嬪錛屼笅闈㈡槸璋冪敤rapi鐨勫簱鏂囦歡rapi.lib涓殑鍑芥暟鏃訛紝鐢變簬娌℃湁灝唕api.lib鍖呭惈榪涙潵鑰屽鑷寸殑閾炬帴閿欒銆?/p>
1>Linking... 銆愯В鍐蟲柟妗堛?/span> 1. Project -> ** Properties... -> Configuration Properties -> Linker -> Input -> Additional Dependencies -> rapi.lib 鍙﹀錛屽湪姝や箣鍓嶏紝榪橀渶娣誨姞rapi搴撶殑鐩稿簲鐩綍錛歍ools -> Options -> Projects and Solutions -> VC++ Directories -> Show Directories for -> 鍦↖nclude files涓坊鍔燙:\Program Files\Matrox Imaging\rapi\Include 浠ュ強 Tools -> Options -> Projects and Solutions -> VC++ Directories -> Show Directories for -> 鍦↙ibrary files涓坊鍔燙:\Program Files\Matrox Imaging\rapi\LIB銆傛坊鍔犵洰褰曠殑鐩殑鏄負浜嗕嬌VC鍦ㄨ皟鐢ㄧ浉搴斿簱鏂囦歡鏃朵笉蹇呮繪槸浣跨敤緇濆鍦板潃錛孷C鍙互閫氳繃鏂囦歡鍚嶅湪鎵鍖呭惈鐨勭洰褰曚腑榪涜鎼滅儲銆傝繖鏍鳳紝鍓嶉潰鐨剅api.lib灝變笉蹇呬嬌鐢ㄧ粷瀵瑰湴鍧浜嗐?/p>
銆愮己鐐廣戝彲縐繪鎬у樊錛屽鏋滃皢鍘熷伐紼嬩腑鐨勬簮鏂囦歡鍜屽ご鏂囦歡涓殑鍐呭copy涓嬫潵閲嶆柊寤虹珛璇ュ伐紼嬫椂錛堜緥濡傦細鍦ㄧ數瀛愪功鎴栫綉緇滀笂鎵懼埌鐨勭▼搴忥級錛屼粛闇鑷繁鍦ㄥ伐紼嬩腑娣誨姞鐩綍鍙婃墍闇鐨勫簱鏂囦歡銆?/p>
2. 鍦ㄧ▼搴忓墠鍔犲叆#pragma commet(lib, "rapi.lib")涔熷彲浠ヨ揪鍒扮浉鍚岀殑鏁堟灉銆?/span>
]]>
WMFileSync.obj : error LNK2019: unresolved external symbol _CeFindClose@4 referenced in function "public: virtual long __stdcall CWMFileSync::IsFileExists(wchar_t *)" (?IsFileExists@CWMFileSync@@UAGJPA_W@Z)
]]>
PreTranslateMessage鍙兘澶勭悊娑堟伅闃熷垪涓殑娑堟伅,涔熷氨鏄敱PostMessage鍙戝嚭鐨勬秷鎭?榧犳爣閿洏娑堟伅絳?
SendMessage鍙戦佺殑娑堟伅騫朵笉鏀懼湪娑堟伅闃熷垪涓?鑰屾槸鐩存帴璋冪敤澶勭悊鍑芥暟榪涜澶勭悊,鎵浠ヨ繖縐嶆秷鎭敤PreTranslateMessage鐨勬崟鑾蜂笉鍒扮殑,濡俉M_KIllFOCUS鍜學M_SETFOCUS.
SendMessage鐨勬秷鎭槸鐩存帴鎵ц澶勭悊鍑芥暟鐨?瀹冭絳夋秷鎭墽琛屽畬鎵嶈繑鍥?鎵ц瀹孲endMessage鍑芥暟);鑰孭ostMessage鍒欐妸娑堟伅鍙戦佸悗绔嬪嵆榪斿洖,鎶婃秷鎭寕鍒版秷鎭槦鍒椾腑絳夊緟鎵ц,鎵浠ヤ互涓嬬殑紼嬪簭鏄敊鐨?!
#include <windows.h>
int main()
{
PostMessage(HWND_BROADCAST,WM_QUIT,0,0);
return 0;
}
PostMessage灝嗘秷鎭疻M_QUIT鍙戦佸埌娑堟伅闃熷垪涓?鐢變簬PostMessage鐨勭珛鍗寵繑鍥?鍗崇粨鏉?灝辨墽琛屼笅涓鍙ヨ鍙ョ粨鏉熸暣涓▼搴?娑堟伅榪樻寕鍦ㄦ秷鎭槦鍒椾腑鏈鐞嗘晠鍑洪敊!!
鍦ㄦ錛屾垜涓漢璁や負錛欳String灝佽寰楃‘瀹炲緢瀹岀編錛屽畠鏈夎澶氫紭鐐癸紝濡?#8220;瀹規槗浣跨敤 錛屽姛鑳藉己錛屽姩鎬佸垎閰嶅唴瀛橈紝澶ч噺榪涜鎷瘋礉鏃跺畠寰堣兘鑺傜渷鍐呭瓨璧勬簮騫朵笖鎵ц鏁堢巼楂橈紝涓庢爣鍑嗭跡瀹屽叏鍏煎錛屽悓鏃舵敮鎸佸瀛楄妭涓庡瀛楄妭錛岀敱浜庢湁寮傚父鏈哄埗鎵浠ヤ嬌鐢ㄥ畠瀹夊叏鏂逛究” 鍏跺疄錛屼嬌鐢ㄨ繃紼嬩腑涔嬫墍浠ュ鏄撳嚭閿欙紝閭f槸鍥犱負鎴戜滑瀵瑰畠浜嗚В寰楄繕涓嶅錛岀壒鍒槸瀹冪殑瀹炵幇鏈哄埗銆傚洜涓烘垜浠腑鐨勫ぇ澶氭暟浜猴紝鍦ㄥ伐浣滀腑騫朵笉閭d箞鐖辨繁鍏ュ湴鍘葷湅鍏充簬瀹冪殑鏂囨。錛屼綍鍐靛畠榪樻槸鑻辨枃鐨勩?
鐢變簬鍓嶅嚑澶╂垜鍦ㄥ伐浣滀腑閬囧埌浜嗕竴涓湰涓嶆槸闂浣嗗嵈鐗瑰埆媯樻墜銆佺壒鍒毦瑙e喅鑰屼笖鑾悕鎯婅鐨勯棶棰樸傚ソ鏉ユ渶鍚庡彂鐜版槸鐢變簬CString寮曞彂鐨勩傛墍浠ユ病鍔炴硶錛屾垜鎶婃暣涓狢String鐨勫疄鐜板叏閮ㄧ湅浜嗕竴閬嶏紝鎵嶆厡鐒跺ぇ鎮燂紝騫跺交搴曞紕娓呬簡闂鐨勫師鍥?榪欎釜闂錛屾垜宸插湪csdn涓婂紑璐?銆傚湪姝わ紝鎴戞兂鎶婃垜鐨勪竴浜涘叧浜嶤String鐨勭煡璇嗘葷粨涓鐣紝浠ヤ緵浠栵紙濂癸級浜哄熼壌錛屼篃璁稿叾涓湁鎴戠悊瑙d笂鐨勯敊璇紝鏈涘彂鐜拌呰兘閫氱煡鎴戯紝涓嶈儨鎰熻阿銆?/p>
1錛?CString瀹炵幇鐨勬満鍒?
CString鏄氳繃“寮曠敤”鏉ョ鐞嗕覆鐨勶紝“寮曠敤”榪欎釜璇嶆垜鐩鎬俊澶у騫朵笉闄岀敓錛岃薄Window鍐呮牳瀵硅薄銆丆OM瀵硅薄絳夐兘鏄氳繃寮曠敤鏉ュ疄鐜扮殑銆傝孋String涔熸槸閫氳繃榪欐牱鐨勬満鍒舵潵綆$悊鍒嗛厤鐨勫唴瀛樺潡銆傚疄闄呬笂CString瀵硅薄鍙湁涓涓寚閽堟垚鍛樺彉閲?鎵浠ヤ換浣旵String瀹炰緥鐨勯暱搴﹀彧鏈?瀛楄妭.
鍗? int len = sizeof(CString);//len絳変簬4
榪欎釜鎸囬拡鎸囧悜涓涓浉鍏崇殑寮曠敤鍐呭瓨鍧楋紝濡傚浘: CString str("abcd");
‘A’
‘B’
‘C’
‘D’
0
0x04040404 head閮紝涓哄紩鐢ㄥ唴瀛樺潡鐩稿叧淇℃伅
str 0x40404040
姝e洜涓哄姝わ紝涓涓繖鏍風殑鍐呭瓨鍧楀彲琚涓狢String鎵寮曠敤錛屼緥濡備笅鍒椾唬鐮侊細
CString str("abcd");
CString a = str;
CString b(str);
CString c;
c = b;
涓婇潰浠g爜鐨勭粨鏋滄槸錛氫笂闈㈠洓涓璞?str,a,b,c)涓殑鎴愬憳鍙橀噺鎸囬拡鏈夌浉鍚岀殑鍊鹼紝閮戒負0x40404040.鑰岃繖鍧楀唴瀛樺潡鎬庝箞鐭ラ亾鏈夊灝戜釜CString寮曠敤瀹冨憿錛熷悓鏍鳳紝瀹冧篃浼氳褰曚竴浜涗俊鎭傚琚紩鐢ㄦ暟錛屼覆闀垮害錛屽垎閰嶅唴瀛橀暱搴︺?/p>
榪欏潡寮曠敤鍐呭瓨鍧楃殑緇撴瀯瀹氫箟濡備笅錛?/p>
struct CStringData
{
long nRefs; //琛ㄧず鏈夊灝戜釜CString 寮曠敤瀹? 4
int nDataLength; //涓插疄闄呴暱搴? 4
int nAllocLength; //鎬誨叡鍒嗛厤鐨勫唴瀛橀暱搴︼紙涓嶈榪欏ご閮ㄧ殑12瀛楄妭錛? 4
};
鐢變簬鏈変簡榪欎簺淇℃伅錛孋String灝辮兘姝g‘鍦板垎閰嶃佺鐞嗐侀噴鏀懼紩鐢ㄥ唴瀛樺潡銆?/p>
濡傛灉浣犳兂鍦ㄨ皟璇曠▼搴忕殑鏃跺欒幏寰楄繖浜涗俊鎭傚彲浠ュ湪Watch紿楀彛閿叆涓嬪垪琛ㄨ揪寮忥細
(CStringData*)((CStringData*)(this->m_pchData)-1)鎴?/p>
(CStringData*)((CStringData*)(str.m_pchData)-1)//str涓烘寚CString瀹炰緥
姝e洜涓洪噰鐢ㄤ簡榪欐牱鐨勫ソ鏈哄埗錛屼嬌寰桟String鍦ㄥぇ閲忔嫹璐濇椂錛屼笉浠呮晥鐜囬珮錛岃屼笖鍒嗛厤鍐呭瓨灝戙?/p>
2錛嶭PCTSTR 涓?GetBuffer(int nMinBufLength)
榪欎袱涓嚱鏁版彁渚涗簡涓庢爣鍑咰鐨勫吋瀹硅漿鎹€傚湪瀹為檯涓嬌鐢ㄩ鐜囧緢楂橈紝浣嗗嵈鏄渶瀹規槗鍑洪敊鐨勫湴鏂廣傝繖涓や釜鍑芥暟瀹為檯涓婅繑鍥炵殑閮芥槸鎸囬拡錛屼絾瀹冧滑鏈変綍鍖哄埆鍛紵浠ュ強璋冪敤瀹冧滑鍚庯紝騫曞悗鏄仛浜嗘庢牱鐨勫鐞嗚繃紼嬪憿錛?/p>
(1) LPCTSTR 瀹冪殑鎵ц榪囩▼鍏跺疄寰堢畝鍗曪紝鍙槸榪斿洖寮曠敤鍐呭瓨鍧楃殑涓插湴鍧銆?瀹冩槸浣滀負鎿嶄綔絎﹂噸杞芥彁渚涚殑錛屾墍浠ュ湪浠g爜涓湁鏃跺彲浠ラ殣寮忚漿鎹紝鑰屾湁鏃跺嵈闇寮哄埗杞埗銆傚錛?/span>
CString str;
const char* p = (LPCTSTR)str;
//鍋囪鏈夎繖鏍風殑涓涓嚱鏁幫紝Test(const char* p)錛?浣犲氨鍙互榪欐牱璋冪敤
Test(str);//榪欓噷浼氶殣寮忚漿鎹負LPCTSTR
(2) GetBuffer(int nMinBufLength) 瀹冪被浼鹼紝涔熶細榪斿洖涓涓寚閽堬紝涓嶈繃瀹冩湁鐐瑰樊鍒?榪斿洖鐨勬槸LPTSTR
(3) 榪欎袱鑰呭埌搴曟湁浣曚笉鍚屽憿錛熸垜鎯沖憡璇夊ぇ瀹訛紝鍏舵湰璐ㄤ笂瀹屽叏涓嶄竴鏍鳳紝涓鑸LPCTSTR杞崲鍚庡彧搴旇褰撳父閲忎嬌鐢紝鎴栬呭仛鍑芥暟鐨勫叆鍙傦紱鑰孏etBuffer(...)鍙栧嚭鎸囬拡鍚庯紝鍙互閫氳繃榪欎釜鎸囬拡鏉ヤ慨鏀歸噷闈㈢殑鍐呭錛屾垨鑰呭仛鍑芥暟鐨勫嚭鍙傘備負浠涔堝憿錛熶篃璁哥粡甯告湁榪欐牱鐨勪唬鐮侊細
CString str("abcd");
char* p = (char*)(const char*)str;
p[2] = 'z';
鍏跺疄錛屼篃璁告湁榪欐牱鐨勪唬鐮佸悗錛屼綘鐨勭▼搴忓茍娌℃湁閿欙紝鑰屼笖紼嬪簭涔熻繍琛屽緱鎸哄ソ銆備絾瀹冨嵈鏄潪甯稿嵄闄╃殑銆傚啀鐪?/p>
CString str("abcd");
CString test = str;
....
char* p = (char*)(const char*)str;
p[2] = 'z';
strcpy(p, "akfjaksjfakfakfakj");//榪欎笅瀹岃泲浜?
浣犵煡閬撴鏃訛紝test涓殑鍊兼槸澶氬皯鍚楋紵絳旀鏄?abzd"銆傚畠涔熻窡鐫鏀瑰彉浜嗭紝榪欎笉鏄綘鎵鏈熸湜鍙戠敓鐨勩備絾涓轟粈涔堜細榪欐牱鍛紵浣犵◢寰兂鎯沖氨浼氭槑鐧斤紝鍓嶉潰璇磋繃錛屽洜涓篊String鏄寚鍚戝紩鐢ㄥ潡鐨勶紝str涓巘est鎸囧悜鍚屼竴鍧楀湴鏂?褰撲綘p[2]='z'鍚庯紝褰撶劧test涔熶細闅忕潃鏀瑰彉銆傛墍浠ョ敤瀹冨仛LPCTSTR鍋氳漿鎹㈠悗錛屼綘鍙兘鍘昏榪欏潡鏁版嵁錛屽崈涓囧埆鍘繪敼鍙樺畠鐨勫唴瀹廣?/p>
鍋囧鎴戞兂鐩存帴閫氳繃鎸囬拡鍘諱慨鏀規暟鎹殑璇濓紝閭f庢牱鍔炲憿錛熷氨鏄敤GetBuffer(...).鐪嬩笅榪頒唬鐮侊細
CString str("abcd");
CString test = str;
....
char* p = str.GetBuffer(20);
p[2] = 'z'; // 鎵ц鍒版錛岀幇鍦╰est涓煎嵈浠嶆槸"abcd"
strcpy(p, "akfjaksjfakfakfakj"); // 鎵ц鍒版錛岀幇鍦╰est涓艱繕鏄?abcd"
涓轟粈涔堜細榪欐牱錛熷叾瀹濭etBuffer(20)璋冪敤鏃訛紝瀹冨疄闄呬笂鍙﹀寤虹珛浜嗕竴鍧楁柊鍐呭潡瀛橈紝騫跺垎閰?0瀛楄妭闀垮害鐨刡uffer錛岃屽師鏉ョ殑鍐呭瓨鍧楀紩鐢ㄨ鏁頒篃鐩稿簲鍑?. 鎵浠ユ墽琛屼唬鐮佸悗str涓巘est鏄寚鍚戜簡涓ゅ潡涓嶅悓鐨勫湴鏂癸紝鎵浠ョ浉瀹夋棤浜嬨?/p>
(4) 涓嶈繃榪欓噷榪樻湁涓鐐規敞鎰忎簨欏癸細灝辨槸str.GetBuffer(20)鍚庯紝str鐨勫垎閰嶉暱搴︿負20錛屽嵆鎸囬拡p瀹冩墍鎸囧悜鐨刡uffer鍙湁20瀛楄妭闀匡紝緇欏畠璧嬪兼椂錛屽垏涓嶅彲瓚呰繃錛屽惁鍒欑伨闅劇浣犱笉榪滀簡錛涘鏋滄寚瀹氶暱搴﹀皬浜庡師鏉ヤ覆闀垮害錛屽GetBuffer(1),瀹為檯涓婂畠浼氬垎閰?涓瓧鑺傞暱搴︼紙鍗沖師鏉ヤ覆闀垮害錛夛紱鍙﹀錛屽綋璋冪敤GetBuffer(...)鍚庡茍鏀瑰彉鍏跺唴瀹癸紝涓瀹氳璁板緱璋冪敤ReleaseBuffer(),榪欎釜鍑芥暟浼氭牴鎹覆鍐呭鏉ユ洿鏂板紩鐢ㄥ唴瀛樺潡鐨勫ご閮ㄤ俊鎭?/span>
(5) 鏈鍚庤繕鏈変竴娉ㄦ剰浜嬮」錛岀湅涓嬭堪浠g爜錛?/p>
char* p = NULL;
const char* q = NULL;
{
CString str = "abcd";
q = (LPCTSTR)str;
p = str.GetBuffer(20);
AfxMessageBox(q);// 鍚堟硶鐨?/p>
strcpy(p, "this is test");//鍚堟硶鐨勶紝
}
AfxMessageBox(q);// 闈炴硶鐨勶紝鍙兘瀹岃泲
strcpy(p, "this is test");//闈炴硶鐨勶紝鍙兘瀹岃泲
榪欓噷瑕佽鐨勫氨鏄紝褰撹繑鍥炶繖浜涙寚閽堝悗錛?濡傛灉CString瀵硅薄鐢熷懡緇撴潫錛岃繖浜涙寚閽堜篃鐩稿簲鏃犳晥銆?/p>
3錛庢嫹璐?& 璧嬪?& "寮曠敤鍐呭瓨鍧? 浠涔堟椂鍊欓噴鏀撅紵
涓嬮潰婕旂ず涓孌典唬鐮佹墽琛岃繃紼?/span>
void Test()
{
CString str("abcd");
//str鎸囧悜涓寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
CString a;
//a鎸囧悜涓鍒濆鏁版嵁鐘舵侊紝
a = str;
//a涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
CString b(a);
//a銆乥涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
{
LPCTSTR temp = (LPCTSTR)a;
//temp鎸囧悜寮曠敤鍐呭瓨鍧楃殑涓查鍦板潃銆傦紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
CString d = a;
//a銆乥銆乨涓巗tr鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?, 闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
b = "testa";
//榪欐潯璇彞瀹為檯鏄皟鐢–String::operator=(CString&)鍑芥暟銆?b鎸囧悜涓鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧椼傦紙鏂板垎閰嶇殑寮曠敤鍐呭瓨鍧楃殑 寮曠敤璁℃暟涓?, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?/span>
//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. a銆乨涓巗tr浠嶆寚鍚戝師 寮曠敤鍐呭瓨鍧楋紙寮曠敤鍐呭瓨鍧楃殑寮曠敤璁℃暟涓?,闀垮害涓?,鍒嗛厤闀垮害涓?錛?
}
//鐢變簬d鐢熷懡緇撴潫錛岃皟鐢ㄦ瀽鏋勫嚱鏁幫紝瀵艱嚦寮曠敤璁℃暟鍑?錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負2,闀垮害涓?,鍒嗛厤闀垮害涓?錛?/span>
LPTSTR temp = a.GetBuffer(10);
//姝よ鍙ヤ篃浼氬鑷撮噸鏂板垎閰嶆柊鍐呭瓨鍧椼倀emp鎸囧悜鏂板垎閰嶅紩鐢ㄥ唴瀛樺潡鐨勪覆棣栧湴鍧錛堟柊 鍒嗛厤鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0錛?/span>
//鍚屾椂鍘熷紩鐢ㄥ唴瀛樺潡寮曠敤璁℃暟鍑?. 鍙湁str浠?鎸囧悜鍘熷紩鐢ㄥ唴瀛樺潡 錛堝紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1, 闀垮害涓?, 鍒嗛厤闀垮害涓?錛?
strcpy(temp, "temp");
//a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0 a.ReleaseBuffer();//娉ㄦ剰:a鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勫紩鐢ㄨ鏁頒負1,闀垮害涓?,鍒嗛厤闀垮害涓?0
}
//鎵ц鍒版錛屾墍鏈夌殑灞閮ㄥ彉閲忕敓鍛藉懆鏈熼兘宸茬粨鏉熴傚璞tr a b 鍚勮嚜璋冪敤鑷繁鐨勬瀽鏋勬瀯
//鍑芥暟錛屾墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡涔熺浉搴斿噺1
//娉ㄦ剰錛宻tr a b 鎵鍒嗗埆鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鐨勮鏁板潎涓?,榪欏鑷存墍鍒嗛厤鐨勫唴瀛樺潡閲婃斁
//CString鍒嗛厤鐨勫唴瀛樺湪鍫嗛噷錛屽彧鏈夎繖鍧?nbsp;寮曠敤鍐呭瓨鍧楃殑璁℃暟鍧囦負0錛屾墠閲婃斁鍐呭瓨
閫氳繃瑙傚療涓婇潰鎵ц榪囩▼錛屾垜浠細鍙戠幇CString铏界劧鍙互澶氫釜瀵硅薄鎸囧悜鍚屼竴寮曠敤鍐呭潡瀛橈紝浣嗘槸瀹冧滑鍦ㄨ繘琛屽悇縐嶆嫹璐濄佽祴鍊煎強鏀瑰彉涓插唴瀹規椂錛屽畠鐨勫鐞嗘槸寰堟櫤鑳藉茍涓旈潪甯稿畨鍏ㄧ殑錛屽畬鍏ㄥ仛鍒頒簡浜掍笉騫叉秹銆佷簰涓嶅獎鍝嶃傚綋鐒跺繀欏昏姹備綘鐨勪唬鐮佷嬌鐢ㄦ紜伆褰擄紝鐗瑰埆鏄疄闄呬嬌鐢ㄤ腑浼氭湁鏇村鏉傜殑鎯呭喌錛屽鍋氬嚱鏁板弬鏁般佸紩鐢ㄣ佸強鏈夋椂闇淇濆瓨鍒癈StringList褰撲腑錛屽鏋滃摢鎬曟湁涓灝忓潡鍦版柟浣跨敤涓嶅綋錛屽叾緇撴灉涔熶細瀵艱嚧鍙戠敓涓嶅彲棰勭煡鐨勯敊璇?/p>
5 FreeExtra()鐨勪綔鐢?/strong>
鐪嬭繖孌典唬鐮?/p>
(1) CString str("test");
(2) LPTSTR temp = str.GetBuffer(50);
(3) strcpy(temp, "there are 22 character");
(4) str.ReleaseBuffer();
(5) str.FreeExtra();
涓婇潰浠g爜鎵ц鍒扮(4)琛屾椂錛屽ぇ瀹墮兘鐭ラ亾str鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟涓?,闀垮害涓?2,鍒嗛厤闀垮害涓?0. 閭d箞鎵цstr.FreeExtra()鏃訛紝瀹冧細閲婃斁鎵鍒嗛厤鐨勫浣欑殑鍐呭瓨銆?寮曠敤鍐呭瓨鍧楄鏁頒負1,闀垮害涓?2,鍒嗛厤闀垮害涓?2)
6 Format(...) 涓?FormatV(...)
榪欐潯璇彞鍦ㄤ嬌鐢ㄤ腑鏄渶瀹規槗鍑洪敊鐨勩傚洜涓哄畠鏈瀵屾湁鎶宸фэ紝涔熺浉褰撶伒媧匯傚湪榪欓噷錛屾垜娌℃墦綆楀瀹冪粏緇嗗垎鏋愶紝瀹為檯涓妔printf(...)鎬庝箞鐢紝瀹冨氨鎬庝箞鐢ㄣ傛垜鍙彁閱掍嬌鐢ㄦ椂闇娉ㄦ剰涓鐐癸細灝辨槸瀹冪殑鍙傛暟鐨勭壒孌婃э紝鐢變簬緙栬瘧鍣ㄥ湪緙栬瘧鏃跺茍涓嶈兘鍘繪牎楠屾牸寮忎覆鍙傛暟涓庡搴旂殑鍙樺厓鐨勭被鍨嬪強闀垮害銆傛墍浠ヤ綘蹇呴』瑕佹敞鎰忥紝涓よ呬竴瀹氳瀵瑰簲涓婏紝
鍚﹀垯灝變細鍑洪敊銆傚錛?/p>
CString str;
int a = 12;
str.Format("first:%l, second: %s", a, "error");//result?璇曡瘯
7 LockBuffer() 涓?UnlockBuffer()
欏懼悕鎬濊錛岃繖涓や釜鍑芥暟鐨勪綔鐢ㄥ氨鏄寮曠敤鍐呭瓨鍧楄繘琛屽姞閿佸強瑙i攣銆備絾浣跨敤瀹冩湁浠涔堜綔鐢ㄥ強鎵ц榪囧畠鍚庡CString涓叉湁浠涔堝疄璐ㄤ笂鐨勫獎鍝嶃傚叾瀹炴尯綆鍗曪紝鐪嬩笅闈唬鐮?
(1) CString str("test");
(2) str.LockBuffer();
(3) CString temp = str;
(4) str.UnlockBuffer();
(5) str.LockBuffer();
(6) str = "error";
(7) str.ReleaseBuffer();
鎵ц瀹?3)鍚庯紝涓庨氬父鎯呭喌涓嬩笉鍚岋紝temp涓巗tr騫朵笉鎸囧悜鍚屼竴寮曠敤鍐呭瓨鍧椼備綘鍙互鍦╳atch紿楀彛鐢ㄨ繖涓〃杈懼紡(CStringData*)((CStringData*)(str.m_pchData)-1)鐪嬬湅銆?/p>
鍏跺疄鍦╩sdn涓湁璇存槑錛?/p>
While in a locked state, the string is protected in two ways:
No other string can get a reference to the data in the locked string, even if that string is assigned to the locked string.
The locked string will never reference another string, even if that other string is copied to the locked string.
8 CString 鍙槸澶勭悊涓插悧錛?/strong>
涓嶅錛孋String涓嶅彧鏄兘鎿嶄綔涓詫紝鑰屼笖榪樿兘澶勭悊鍐呭瓨鍧楁暟鎹傚姛鑳藉畬鍠勫惂錛佺湅榪欐浠g爜
char p[20];
for(int loop=0; loop<sizeof(p); loop++)
{
p[loop] = 10-loop;
}
CString str((LPCTSTR)p, 20);
char temp[20];
memcpy(temp, str, str.GetLength());
str瀹屽叏鑳藉杞澆鍐呭瓨鍧梡鍒板唴瀛樺潡temp涓傛墍浠ヨ兘鐢–String鏉ュ鐞嗕簩榪涘埗鏁版嵁
8 AllocSysString()涓嶴etSysString(BSTR*)
榪欎袱涓嚱鏁版彁渚涗簡涓蹭笌BSTR鐨勮漿鎹€備嬌鐢ㄦ椂欏繪敞鎰忎竴鐐癸細褰撹皟鐢ˋllocSysString()鍚庯紝欏昏皟鐢ㄥ畠SysFreeString(...)
9 鍙傛暟鐨勫畨鍏ㄦ楠?/strong>
鍦∕FC涓彁渚涗簡澶氫釜瀹忔潵榪涜鍙傛暟鐨勫畨鍏ㄦ鏌ワ紝濡傦細ASSERT. 鍏朵腑鍦–String涓篃涓嶄緥澶栵紝鏈夎澶氳繖鏍風殑鍙傛暟媯楠岋紝鍏跺疄榪欎篃璇存槑浜嗕唬鐮佺殑瀹夊叏鎬ч珮錛屽彲鏈夋椂鎴戜滑浼氬彂鐜拌繖寰堢儲錛屼篃瀵艱嚧Debug涓嶳elease鐗堟湰涓嶄竴鏍鳳紝濡傛湁鏃剁▼搴廌ebug閫氭甯革紝鑰孯elease鍒欑▼搴忓穿婧冿紱鑰屾湁鏃舵伆鐩稿弽錛孌ebug涓嶈錛孯elease琛屻傚叾瀹炴垜涓漢璁や負錛屾垜浠CString鐨勪嬌鐢ㄨ繃紼嬩腑錛屽簲鍔涙眰浠g爜璐ㄩ噺楂橈紝涓嶈兘鍦―ebug鐗堟湰涓嚭鐜頒換浣曟柇璦妗嗭紝鍝時elease榪愯浼間箮鐪嬭搗鏉ヤ竴鍒囨甯搞備絾寰堜笉瀹夊叏銆傚涓嬩唬鐮侊細
(1) CString str("test");
(2) str.LockBuffer();
(3) LPTSTR temp = str.GetBuffer(10);
(4) strcpy(temp, "error");
(5) str.ReleaseBuffer();
(6) str.ReleaseBuffer();//鎵ц鍒版鏃訛紝Debug鐗堟湰浼氬脊鍑洪敊妗?/p>
10 CString鐨勫紓甯稿鐞?/p>
鎴戝彧鎯沖己璋冧竴鐐癸細鍙湁鍒嗛厤鍐呭瓨鏃訛紝鎵嶆湁鍙兘瀵艱嚧鎶涘嚭CMemoryException.
鍚屾牱錛屽湪msdn涓殑鍑芥暟澹版槑涓紝娉ㄦ湁throw( CMemoryException)鐨勫嚱鏁伴兘鏈夐噸鏂板垎閰嶆垨璋冩暣鍐呭瓨鐨勫彲鑳姐?/p>
11 璺ㄦā鍧楁椂鐨凜string銆傚嵆涓涓狣LL鐨勬帴鍙e嚱鏁頒腑鐨勫弬鏁頒負CString&鏃訛紝瀹冧細鍙戠敓鎬庢牱鐨勭幇璞°傝В絳旀垜閬囧埌鐨勯棶棰樸傛垜鐨勯棶棰樺師鏉ュ凡緇忓彂璐達紝鍦板潃涓猴細
http://www.csdn.net/expert/topic/741/741921.xml?temp=.2283136
鏋勯犱竴涓繖鏍稢String瀵硅薄鏃訛紝濡侰String str錛屼綘鍙煡閬撴鏃剁殑str鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鍚楋紵涔熻浣犱細璁や負瀹冩寚鍚慛ULL銆傚叾瀹炰笉瀵癸紝濡傛灉榪欐牱鐨勮瘽錛孋String鎵閲囩敤鐨勫紩鐢ㄦ満鍒剁鐞嗗唴瀛樺潡灝變細鏈夐夯鐑︿簡錛屾墍浠String鍦ㄦ瀯閫犱竴涓┖涓茬殑瀵硅薄鏃訛紝瀹冧細鎸囧悜涓涓浐瀹氱殑鍒濆鍖栧湴鍧錛岃繖鍧楁暟鎹殑澹版槑濡備笅錛?/p>
AFX_STATIC_DATA int _afxInitData[] = {-1,0,0,0};
綆瑕佹弿榪版鎷竴涓嬶細褰撴煇涓狢String瀵硅薄涓茬疆絀虹殑璇濓紝濡侲mpty(),CString a絳夛紝瀹冪殑鎴愬憳鍙橀噺m_pchData灝變細鎸囧悜_afxInitData榪欎釜鍙橀噺鐨勫湴鍧銆傚綋榪欎釜CString瀵硅薄鐢熷懡鍛ㄦ湡緇撴潫鏃訛紝姝e父鎯呭喌涓嬪畠浼氬幓瀵規墍鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡璁℃暟鍑?錛屽鏋滃紩鐢ㄨ鏁頒負0(鍗蟲病鏈変換浣旵String寮曠敤瀹冩椂)錛屽垯閲婃斁榪欏潡寮曠敤鍐呭瓨銆傝岀幇鍦ㄧ殑鎯呭喌鏄鏋淐String鎵鎸囧悜鐨勫紩鐢ㄥ唴瀛樺潡鏄垵濮嬪寲鍐呭瓨鍧楁椂錛屽垯涓嶄細閲婃斁浠諱綍鍐呭瓨銆?/p>
璇翠簡榪欎箞澶氾紝榪欎笌鎴戦亣鍒扮殑闂鏈変粈涔堝叧緋誨憿錛熷叾瀹炲叧緋誨ぇ鐫鍛紵鍏剁湡姝e師鍥犲氨鏄鏋渆xe妯″潡涓巇ll妯″潡鏈変竴涓槸static緙栬瘧榪炴帴鐨勮瘽銆傞偅涔堣繖涓狢String鍒濆鍖栨暟鎹湪exe妯″潡涓巇ll妯″潡涓湁涓嶅悓鐨勫湴鍧錛屽洜涓簊tatic榪炴帴鍒欎細鍦ㄦ湰妯″潡涓湁涓浠芥簮浠g爜鐨勬嫹璐濄傚彟澶栦竴縐嶆儏鍐碉紝濡傛灉涓や釜妯″潡閮芥槸share榪炴帴鐨勶紝CString鐨勫疄鐜頒唬鐮佸垯鍦ㄥ彟涓涓崟鐙殑dll涓疄鐜幫紝鑰孉FX_STATIC_DATA鎸囧畾鍙橀噺鍙涓嬈★紝鎵浠ヤ袱涓ā鍧椾腑_afxInitData鏈夌浉鍚岀殑鍦板潃銆?/p>
鐜板湪闂瀹屽叏鏄庣櫧浜嗗惂錛佷綘鍙互鑷繁鍘繪紨紺轟竴涓嬨?/p>
__declspec (dllexport) void test(CString& str)
{
str = "abdefakdfj";//濡傛灉鏄痵tatic榪炴帴錛屽茍涓斾紶鍏ョ殑str涓虹┖涓茬殑璇濓紝榪欓噷鍑洪敊銆?/p>
}
鏈鍚庝竴鐐規兂娉曪細鍐欏緱榪欓噷錛屽叾瀹濩String涓繕鏈夎澶氭妧宸фх殑濂戒笢涓滐紝鎴戝茍娌″幓瑙i噴銆傚寰堝閲嶈澆鐨勬搷浣滅銆佹煡鎵劇瓑銆傛垜璁や負榪樻槸璇︾粏鐪嬬湅msdn錛岃繖鏍蜂篃璁鎬細姣旀垜璁茬殑濂藉浜嗐傛垜鍙晶閲嶉偅浜涘彲鑳戒細鍑洪敊鐨勬儏鍐點傚綋鐒訛紝濡傛垜涓婇潰鍙欒堪涓湁閿欒錛屾暚璇烽珮鎵嬫寚鐐癸紝涓嶈儨鎰熻阿錛?br />
msdn錛?a >http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring_class_members.asp
1.AfxGetStaticModuleState()鎸囧悜褰撳墠妯″潡鐘舵?
2.褰撳墠鍑芥暟璋冪敤緇撴潫鍚庡師妯″潡鐨勭姸鎬佽嚜鍔ㄨ鎭㈠錛?
3.鐢ㄤ簬DLL涓墍璋冪敤MFC鍑芥暟銆佺被銆佽祫婧愭椂鐨勬ā鍧楃姸鎬佸垏鎹?
絀跺叾鍘熷洜錛屽氨debug鐗堜腑鐨勫爢鏍堜腑鐨勫眬閮ㄥ彉閲忥紙鍖呮嫭鎸囬拡錛夊湪鏄庣‘鍒濆鍖栦箣鍓嶉兘鐢?x0cc榪涜鍒濆鍖栵紝鍥犳錛屾湭鍒濆鍖栨椂鍊欑殑鎸囬拡鏄寚鍚戝湴鍧0x0cccccccc鐨勶紝鑰岃繖孌靛湴鍧涓鏉ユ槸澶勪簬鍐呮牳鍦板潃絀洪棿錛屼竴鑸殑搴旂敤紼嬪簭鏄棤鏉冭闂殑錛屼笂闈㈢殑鎶ラ敊灝辨槸榪欐牱浜х敓鐨勩傚洜姝わ紝涓鏃﹂亣鍒頒笂榪版姤閿欙紝鍩烘湰鍙互璁ゅ畾紼嬪簭涓嚭鐜頒簡閲庢寚閽堛?/p>
鍙﹀涓鏂歸潰cc瀵瑰簲鐫int 3璋冭瘯涓柇錛屽爢鏍堜腑鐨勫瓨鏀劇殑灞閮ㄦ暟鎹竴鑸儏鍐典笅鏄彧璇葷殑錛屽綋鍙戠敓鎰忓鎵ц鍫嗘爤閲岄潰鐨勬暟鎹氨浼氬紩鍙戣璋冭瘯涓柇銆?/p>
鍙互璁や負0x0cc灝辨槸鏈夌壒孌婂惈涔夌殑鍗犱綅絎︼紝瀵逛簬鎸囬拡鑰岃█錛屽畠璺烴ULL鏄竴涓剰鎬濓紝鍏跺畠鍏鋒湁鐗規畩鎰忎箟鐨勫崰浣嶇榪樻湁錛?/p>
0xcdcdcdcd - Created but not initialized
0xdddddddd - Deleted
0xfeeefeee - Freed memory set by NT's heap manager
0xcccccccc - Uninitialized locals in VC6 when you compile w/ /GZ
0xabababab - Memory following a block allocated by LocalAlloc()
鍦╒C緙栬瘧鍣ㄤ笅錛屽鏋滄偍鐢ㄦ渶楂樼駭鍒繘琛岀紪璇戯紝緙栬瘧鍣ㄥ氨浼氬緢鑻涘埢鍦版寚鍑烘偍鐨勯潪甯哥粏灝忕殑璀﹀憡銆傚綋浣犵敓鍛戒簡涓涓彉閲忥紝鑰屾病鏈変嬌鐢ㄦ椂錛岀紪璇戝櫒灝變細鎶ヨ鍛婏細
“warning C4100: ''錛革幾錛革幾'' : unreferenced formal parameter.”
鎵浠ワ紝涓轟簡璁╃紪璇戝櫒涓嶅繀媯嫻嬩綘鐨勮鍛婏紝灝變嬌鐢║NREFERENCED_PARAMETER璇彞銆傛瘮濡傦細
int SomeFunction(int arg1, int arg2)
{
UNREFERENCED_PARAMETER(arg2)
...
}
===============================================================================
[ 緲昏瘧鏂囨。 鏈枃閫傚悎涓駭璇昏?宸查槄璇?439嬈?] 鏂囨。 浠g爜 宸ュ叿
C++ At Work 涓撴爮...
鏈紩鐢ㄥ弬鏁幫紝娣誨姞浠誨姟鏍忓懡浠ゅ強鍏跺畠...
鍘熻憲錛歅aul DiLascia
緲昏瘧錛歂orthTibet
涓嬭澆婧愪唬鐮侊細CAtWork0505.exe (171KB)
鍘熸枃鍑哄錛歎nreferenced Parameters, Adding Task Bar Commands, and More
鏈紩鐢ㄥ弬鏁?br>娣誨姞浠誨姟鏍忓懡浠?/p>
鎴戠湅鍒拌繃涓浜?C++ 浠g爜閽堝娌℃湁浣跨敤榪囩殑鍙傛暟鐢?UNREFERENCED_PARAMETER錛屼緥濡傦細
int SomeFunction(int arg1, int arg2)
{
UNREFERENCED_PARAMETER(arg2)
...
}
鎴戣繕鐪嬪埌榪囪繖鏍風殑浠g爜錛?
int SomeFunction(int arg1, int /* arg2 */)
{
...
}
浣犺兘瑙i噴瀹冧滑鐨勫樊鍒悧錛熷摢涓縐嶇敤娉曟洿濂斤紵
Judy McGeough
鏄晩錛佷負浠涔堝憿錛熻鎴戜滑浠?UNREFERENCED_PARAMETER 寮濮嬪惂銆傝繖涓畯鍦?winnt.h 涓畾涔夊涓嬶細
#define UNREFERENCED_PARAMETER(P) (P)銆銆鎹㈠彞璇濊 UNREFERENCED_PARAMETER 灞曞紑浼犻掔殑鍙傛暟鎴栬〃杈懼紡銆傚叾鐩殑鏄伩鍏嶇紪璇戝櫒鍏充簬鏈紩鐢ㄥ弬鏁扮殑璀﹀憡銆傝澶氱▼搴忓憳錛屽寘鎷垜鍦ㄥ唴錛屽枩嬈㈢敤鏈楂樼駭鍒殑璀﹀憡 Level 4錛?W4錛夎繘琛岀紪璇戙侺evel 4 灞炰簬“鑳借瀹夊叏蹇界暐鐨勪簨浠?#8221;鐨勮寖鐣淬傝櫧鐒跺畠浠彲鑳戒嬌浣犻毦鍫紝浣嗗緢灝戠牬鍧忎綘鐨勪唬鐮併備緥濡傦紝鍦ㄤ綘鐨勭▼搴忎腑鍙兘浼氭湁榪欐牱涓浜涗唬鐮佽錛?/p>
int x=1;銆銆浣嗕綘浠庢病鐢ㄥ埌榪?x銆備篃璁歌繖涓琛屾槸浣犱互鍓嶄嬌鐢?x 鏃剁暀涓嬫潵鐨勶紝鍙垹闄や簡浣跨敤瀹冪殑浠g爜錛岃屽繕浜嗗垹闄よ繖涓彉閲忋俉arning Level 4 鑳芥壘鍒拌繖浜涘皬楹葷儲銆傛墍浠ワ紝涓轟粈涔堜笉璁╃紪璇戝櫒甯姪浣犲畬鎴愬彲鑳芥槸鏈楂樼駭鍒殑涓撲笟鍖栧憿錛熺敤Level 4 緙栬瘧鏄睍紺轟綘宸ヤ綔鎬佸害鐨勪竴縐嶆柟寮忋傚鏋滀綘涓哄叕浼椾嬌鐢ㄨ呯紪鍐欏簱錛孡evel 4 鍒欐槸紺句氦紺艱妭涓婇渶瑕佺殑銆備綘涓嶆兂寮鴻揩浣犵殑寮鍙戜漢鍛樹嬌鐢ㄤ綆綰ч夐」娓呮磥鍦扮紪璇戜粬浠殑浠g爜銆?br>銆銆闂鏄紝Level 4 瀹炲湪鏄お榪囦簬娉ㄦ剰緇嗚妭錛屽湪 Level 4 涓婏紝緙栬瘧鍣ㄨ繛鏈紩鐢ㄥ弬鏁拌繖鏍鋒棤浼ゅぇ闆呯殑浜嬫儏涔熻鎶辨紙褰撶劧錛岄櫎闈炰綘鐪熺殑鏈夋剰浣跨敤榪欎釜鍙傛暟錛岃繖鏃朵究鐩稿畨鏃犱簨錛夈傚亣璁句綘鏈変竴涓嚱鏁板甫鏉ヤ袱涓弬鏁幫紝浣嗕綘鍙嬌鐢ㄥ叾涓竴涓細
int SomeFunction(int arg1, int arg2)
{
return arg1+5;
}浣跨敤 /W4錛岀紪璇戝櫒鎶辨細
“warning C4100: ''arg2'' : unreferenced formal parameter.”涓轟簡楠楄繃緙栬瘧鍣紝浣犲彲浠ュ姞涓?UNREFERENCED_PARAMETER(arg2)銆傜幇鍦ㄧ紪璇戝櫒鍦ㄧ紪璇戜綘鐨勫紩鐢?arg2 鐨勫嚱鏁版椂渚夸細浣忓彛銆傚茍涓旂敱浜庤鍙ワ細
arg2;瀹為檯涓婁笉鍋氫換浣曚簨鎯咃紝緙栬瘧鍣ㄤ笉浼氫負涔嬩駭鐢熶換浣曚唬鐮侊紝鎵浠ュ湪絀洪棿鍜屾ц兘涓婁笉浼氭湁浠諱綍鎹熷け銆?/p>
銆銆緇嗗績鐨勪漢鍙兘浼氶棶錛氭棦鐒朵綘涓嶄嬌鐢?arg2錛岄偅褰撳垵涓轟綍瑕佸0鏄庡畠鍛紵閫氬父鏄洜涓轟綘瀹炵幇鏌愪釜鍑芥暟浠ユ弧瓚蟲煇浜汚PI鍥烘湁鐨勭講鍚嶉渶瑕侊紝渚嬪錛孧FC鐨?OnSize 澶勭悊渚嬬▼鐨勭講鍚嶅繀欏昏鍍忎笅闈㈣繖鏍鳳細
void OnSize(UINT nType, int cx, int cy);銆銆榪欓噷 cx/cy 鏄獥鍙f柊鐨勫/楂橈紝nType 鏄竴涓被浼?SIZE_MAXIMIZED 鎴?SIZE_RESTORED 榪欐牱鐨勭紪鐮侊紝琛ㄧず紿楀彛鏄惁鏈澶у寲鎴栨槸甯歌澶у皬銆備竴鑸綘涓嶄細鍦ㄦ剰 nType錛屽彧浼氬叧娉?cx 鍜?xy銆傛墍浠ュ鏋滀綘鎯崇敤 /W4錛屽垯蹇呴』浣跨敤 UNREFERENCED_PARAMETER(nType)銆侽nSize 鍙槸涓婂崈涓?MFC 鍜?Windows 鍑芥暟涔嬩竴銆傜紪鍐欎竴涓熀浜?Windows 鐨勭▼搴忥紝鍑犱箮涓嶅彲鑳戒笉紕板埌鏈紩鐢ㄥ弬鏁般?br>銆銆璇翠簡榪欎箞澶氬叧浜?UNREFERENCED_PARAMETER 鍐呭銆侸udy 鍦ㄥス鐨勯棶棰樹腑榪樻彁鍒頒簡鍙︿竴涓?C++ 紼嬪簭鍛樺父鐢ㄧ殑騫朵笖鍏朵綔鐢ㄤ笌 UNREFERENCED_PARAMETER 鐩稿悓鐨勮瘈紿嶏紝閭e氨鏄敞閲婂嚱鏁扮講鍚嶄腑鐨勫弬鏁板悕錛?/p>
void CMyWnd::OnSize(UINT /* nType */,
int cx, int cy)
{
}銆銆鐜板湪 nType 鏄湭鍛藉悕鍙傛暟錛屽叾鏁堟灉灝卞儚浣犳暡鍏?OnSize(UINT, int cx, int cy)涓鏍楓傞偅涔堢幇鍦ㄧ殑鍏抽敭闂鏄細浣犲簲璇ヤ嬌鐢ㄥ摢縐嶆柟娉曗斺旀湭鍛藉悕鍙傛暟錛岃繕鏄?UNREFERENCED_PARAMETER錛?br>銆銆澶у鏁版儏鍐典笅錛屼袱鑰呮病浠涔堝尯鍒紝浣跨敤鍝竴涓函綺規槸椋庢牸闂銆傦紙浣犲枩嬈綘鐨?java 鍜栧暋鏄粦鑹茶繕鏄ザ娌圭殑棰滆壊錛燂級浣嗘垜璁や負鑷沖皯鏈変竴縐嶆儏鍐靛繀欏諱嬌鐢?UNREFERENCED_PARAMETER銆傚亣璁句綘鍐沖畾紿楀彛涓嶅厑璁告渶澶у寲銆傞偅涔堜綘渚跨鐢?Maximize 鎸夐挳錛屼粠緋葷粺鑿滃崟涓垹闄わ紝鍚屾椂闃繪姣忎竴涓敤鎴瘋兘澶熸渶澶у寲紿楀彛鐨勬搷浣溿傚洜涓轟綘鏄亸鎵х媯錛堝ぇ澶氭暟濂界殑紼嬪簭鍛橀兘鏄亸鎵х媯錛夛紝浣犳坊鍔犱竴涓?ASSERT 錛堟柇璦錛変互紜繚浠g爜鎸夌収浣犵殑鎰忓浘榪愯錛?/p>
void CMyWnd::OnSize(UINT nType, int cx, int cy)
{
ASSERT(nType != SIZE_MAXIMIZE);
... // use cx, cy
}銆銆璐ㄦ鍥㈤槦绔敖鎵鑳戒互鍚勭鏂瑰紡榪愯浣犵殑紼嬪簭錛孉SSERT 浠庢病鏈夊脊鍑鴻繃錛屼簬鏄綘璁や負緙栬瘧鐢熸垚 Release 鐗堟湰鏄畨鍏ㄧ殑銆備絾鏄鏃?_DEBUG 瀹氫箟娌℃湁浜嗭紝ASSERT(nType != SIZE_MAXIMIZE)灞曞紑涓?((void)0)錛屽茍涓?nType 涓涓嬪瓙鎴愪簡涓涓湭寮曠敤鍙傛暟錛佽繖鏍瘋繘鍏ヤ綘騫插噣鐨勭紪璇戙備綘鏃犳硶娉ㄩ噴鎺夊弬鏁拌〃涓殑 nType錛屽洜涓轟綘瑕佸湪 ASSERT 涓嬌鐢ㄥ畠銆備簬鏄湪榪欑鎯呭喌涓嬧斺斾綘鍞竴浣跨敤鍙傛暟鐨勫湴鏂規槸鍦?ASSERT 涓垨鍏跺畠 _DEBUG 鏉′歡浠g爜涓斺斿彧鏈?UNREFERENCED_PARAMETER 浼氫繚鎸佺紪璇戝櫒鍦?Debug 鍜?Release 鐢熸垚妯″紡涓嬮兘娌℃湁闂銆傜煡閬撲簡鍚楋紵
銆銆緇撴潫璁ㄨ涔嬪墠錛屾垜鎯寵繕鏈変竴涓棶棰樻垜娌℃湁鎻愬強錛屽氨鏄綘鍙互璞′笅闈㈣繖鏍風敤 pragma 鎸囦護鎶戝埗鍗曚竴鐨勭紪璇戝櫒璀﹀憡錛?/p>
#pragma warning( disable : 4100 )4100 鏄湭寮曠敤鍙傛暟鐨勫嚭閿欎唬鐮併俻ragma 鎶戝埗鍏朵綑鏂囦歡/妯″潡鐨勮璀﹀憡銆傜敤涓嬮潰鏂規硶鍙互閲嶆柊鍚敤榪欎釜璀﹀憡錛?/p>
#pragma warning( default : 4100 )銆銆涓嶇鎬庢牱錛岃緝濂界殑鏂規硶鏄湪紱佺敤鐗瑰畾鐨勮鍛婁箣鍓嶄繚瀛樻墍鏈夌殑璀﹀憡鐘舵侊紝鐒跺悗錛岀瓑浣犲仛瀹屼箣鍚庡啀鍥炲埌浠ュ墠鐨勯厤緗傞偅鏍鳳紝浣犱究鍥炲埌鐨勪互鍓嶇殑鐘舵侊紝榪欎釜鐘舵佷笉涓瀹氭槸緙栬瘧鍣ㄧ殑榛樿鐘舵併?br>銆銆鎵浠ヤ綘鑳借薄涓嬮潰榪欐牱鍦ㄤ唬鐮佺殑鍓嶅悗鐢?pragma 鎸囦護鎶戝埗鍗曚釜鍑芥暟鐨勬湭寮曠敤鍙傛暟璀﹀憡錛?/p>
#pragma warning( push )
#pragma warning( disable : 4100 )
void SomeFunction(...)
{
}
#pragma warning( pop )銆銆褰撶劧錛屽浜庢湭寮曠敤鍙傛暟鑰岃█錛岃繖縐嶆柟娉曟湭鍏嶅啑闀匡紝浣嗗浜庡叾瀹冪被鍨嬬殑璀﹀憡鏉ヨ鍙兘灝變笉鏄繖鏍蜂簡銆傚簱鐢熸垚鑰呴兘鏄敤 #pragma warning 鏉ラ樆濉炶鍛婏紝榪欐牱浠栦滑鐨勪唬鐮佸彲浠ョ敤 /W4 榪涜娓呮磥緙栬瘧銆侻FC 涓厖婊′簡榪欐牱鐨?pragmas 鎸囦護銆傝繕鏈夊ソ澶氱殑 #pragma warning 閫夐」鎴戞病鏈夊湪鏈枃璁ㄨ銆傛湁鍏沖畠浠殑淇℃伅璇峰弬鑰冪浉鍏蟲枃妗c?/p>
鎴戞敞鎰忓埌涓浜涘簲鐢ㄧ▼搴忥紝褰撳彸閿崟鍑誨叾浠誨姟鏍忔渶灝忓寲鎸夐挳鏃訛紝鍦ㄥ脊鍑虹殑涓婁笅鏂囪彍鍗曚腑鍏峰鐗規畩鐨勫懡浠ゃ備緥濡傦紝WinAmp錛堜竴涓祦琛岀殑濯掍綋鎾斁鍣級鏈変竴涓檮鍔犵殑 “WinAmp”鑿滃崟欏癸紝鍏朵腑鏄?WinAmp 鐗規湁鐨勫懡浠ゃ傛垜濡備綍鍦ㄧ▼搴忕殑浠誨姟鏍忔寜閽腑娣誨姞鎴戣嚜宸辯殑鑿滃崟欏癸紵
Jirair Osygian
鎴戝垱寤轟簡涓涓畝鍗曠殑 MFC SDI 紼嬪簭錛岃紼嬪簭鐢ㄨ〃鍗曡鍥撅紙Form View錛夋樉紺轟竴涓鏁板櫒銆傛垜鎯抽氳繃鍙抽敭鍗曞嚮浠誨姟鏍忎笂紼嬪簭鐨勬渶灝忓寲鎸夐挳鏉ユ帶鍒跺惎鍔?鍋滄榪欎釜璁℃暟鍣ㄣ傚湪琛ㄥ崟瑙嗗浘涓婇氳繃鎸夐挳鎺у埗鐨勫惎鍔?鍋滄鍔熻兘榪愯姝e父錛屾垜涔熻兘灝嗗惎鍔?鍋滄鍛戒護鍔犲埌緋葷粺鑿滃崟銆備絾鎴戝崟鍑誨姞鍏ョ殑緋葷粺鑿滃崟鏃舵病鍙嶅簲銆傛垜濡備綍澶勭悊榪欎簺瀹氬埗鐨勭郴緇熻彍鍗曟秷鎭紵
Monicque Sharman
鎴戜袱涓棶棰樹竴璧峰洖絳旓紝Jirair 闂鐨勭瓟妗堝緢綆鍗曪細褰撲綘鍙抽敭鍗曞嚮浠誨姟鏍忎笂搴旂敤紼嬪簭鐨勬渶灝忓寲鎸夐挳鏃訛紝鐢ㄦ埛鐪嬪埌鐨勮彍鍗曚笌鐢ㄦ埛鍗曞嚮宸︿笂瑙掑簲鐢ㄧ▼搴忔爣棰樻爮鍥炬爣鎴栨寜 Alt+Space 鎵鐪嬪埌鐨勮彍鍗曚竴鏍楓傚 Figure 1 鎵紺恒傝繖涓彍鍗曡縐頒負緋葷粺鑿滃崟錛屽叾涓寘鎷懡浠ゅ錛氳繕鍘熴佹渶灝忓寲銆佹渶澶у寲鍜屽叧闂瓑銆?/p>
Figure 1 緋葷粺鑿滃崟
銆銆浣犲彲浠ヨ皟鐢?::GetSystemMenu 鏉ヨ幏寰楁緋葷粺鑿滃崟錛岀劧鍚庡彲浠ユ坊鍔犮佸垹闄ゆ垨淇敼鑿滃崟欏廣備綘鐢氳嚦鍙互閫氳繃鍏蟲帀 WS_SYSMENU 紿楀彛鍒涘緩寮忔牱鏍囧織鎴?PreCreateWindow 铏氬嚱鏁版潵瀹屽叏灞忚斀鎺夎繖涓郴緇熻彍鍗曘備絾涓嶈浣犲仛浠涔堬紝褰撶敤鎴峰彸閿崟鍑諱換鍔℃爮涓婂簲鐢ㄧ▼搴忕殑鏈灝忓寲鎸夐挳鏃訛紝榪欎釜緋葷粺鑿滃崟榪樻槸浼氭樉紺哄嚭鏉ョ殑銆?br>銆銆鍒頒簡 Monicque 鐨勯棶棰橈細濡傛灉鍦ㄧ郴緇熻彍鍗曚腑娣誨姞鑷繁鐨勫懡浠わ紝MFC 鏄浣曞鐞嗗畠浠殑鍛紵濡傛灉鎸夊父瑙勬潵鍋?鈥斺斿湪鏌愪釜鍦版柟鍐欎竴涓?ON_COMMAND 澶勭悊鍣ㄥ茍灝嗗畠鍔犲埌娑堟伅鏄犲皠涓紝浣犱細鍙戠幇浣犵殑澶勭悊鍣ㄤ笉璧蜂綔鐢紝鎬庝箞浼氳繖鏍峰憿錛?br>銆銆閭f槸鍥犱負 Windows 鍜?MFC 澶勭悊緋葷粺鍛戒護鐨勬柟寮忎笌澶勭悊鏅氳彍鍗曞懡浠ょ殑鏂瑰紡涓嶄竴鏍楓傚綋鐢ㄦ埛璋冪敤紿椾綋涓殑甯歌鑿滃崟鍛戒護鎴栨寜閽椂錛學indows 鍚戜富紿楀彛鍙戦佷竴涓?WM_COMMAND 娑堟伅銆傚鏋滀綘浣跨敤 MFC錛岄偅涔堝叾鍛戒護璺敱鏈哄埗灝嗘崟鑾鋒娑堟伅騫墮氳繃鎿嶄綔緋葷粺灝嗗畠璺敱鍒拌鍛戒護鐨?ON_COMMAND 鍛戒護澶勭悊鍣ㄥ璞°傦紙鏈夊叧 MFC 鍛戒護澶勭悊鏈哄埗鐨勮緇嗗唴瀹癸紝鍙傝鎴戝湪 MSJ 1995騫?鏈堝彂琛ㄧ殑鏂囩珷錛?#8220;Meandering Through the Maze of MFC Message and Command Routing”錛夈?br>銆銆鐒惰岀郴緇熷懡浠や笉灞炰簬 WM_COMMAND 娑堟伅鑼冨洿銆傝屽睘浜庡彟澶栦竴涓彨鍋氣斺擶M_SYSCOMMAND 鐨勬秷鎭備笉璁哄懡浠D鏄湡姝g殑緋葷粺鍛戒護濡?SC_MINIMIZE 鍜?SC_CLOSE錛岃繕鏄綘鑷繁娣誨姞鐨勫叾瀹冨懡浠D閮芥槸濡傛銆備負浜嗗鐞嗙郴緇熻彍鍗曞懡浠わ紝浣犲繀欏誨鐞嗘樉寮忓鐞?WM_SYSCOMMAND 騫朵笖瑕侀夋嫨浣犺嚜宸辯殑鍛戒護 IDs銆傝繖灝遍渶瑕佷綘鍦ㄤ富紿楀彛娑堟伅鏄犲皠涓坊鍔燨N_WM_SYSCOMMAND錛屽畠鏈変竴涓鐞嗗嚱鏁板涓嬶細
CMainFrame::OnSysCommand(UINT nID, LPARAM lp)
{
if (nID==ID_MY_COMMAND) {
... // 澶勭悊瀹?br> return 0;
}
// 浼犻掑埌鍩虹被錛氳繖涓姝ュ緢閲嶈!
return CFrameWnd::OnSysCommand(nID, lp);
}銆銆濡傛灉璇ュ懡浠や笉鏄綘鐨勶紝涓嶈蹇樹簡灝嗗畠浼犻掑埌浣犵殑鍩虹被澶勭悊鈥斺斿吀鍨嬪湴錛岄偅灝辨槸 CFrameWnd 鎴?CMDIFrameWnd銆傚惁鍒欙紝Windows 灝嗘棤娉曞緱鍒版娑堟伅錛屽茍涓斾細鐮村潖鍐呭緩鐨勫懡浠ゃ?br>銆銆鍦ㄤ富妗嗘灦涓鐞?WM_SYSCOMMAND 鍥虹劧鍙互錛屼絾榪欐牱鍋氭劅瑙夊お涓氫綑銆備負浠涔堣鐢ㄧ壒孌婄殑鏈哄埗鏉ュ鐞嗗憿錛熷氨鍥犱負瀹冧滑鏄郴緇熻彍鍗曞悧錛熷鏋滀綘鎯沖湪瑙嗗浘鎴栨枃妗e璞′腑澶勭悊緋葷粺鍛戒護浼氭庢牱鍛紵鏈変竴涓父瑙佺殑鍛戒護鏀懼埌浜嗙郴緇熻彍鍗曚腑錛屽畠灝辨槸“鍏充簬”錛圛D_APP_ABOUT錛夛紝澶у鏁?MFC 紼嬪簭閮芥槸鍦ㄥ簲鐢ㄧ▼搴忓璞′腑澶勭悊 ID_APP_ABOUT錛?/p>
void CMyApp::OnAppAbout()
{
static CAboutDialog dlg;
dlg.DoModal();
}銆銆MFC 涓涓湡姝e緢閰風殑鐗規ф槸瀹冪殑鍛戒護璺敱緋葷粺錛屽畠浣垮緱璞?CMyApp 榪欐牱鐨勯潪紿楀彛瀵硅薄涔熻兘澶勭悊鑿滃崟鍛戒護銆傝澶氱▼搴忓憳鐢氳嚦閮戒笉浜嗚В鎬庝箞浼氭湁榪欐牱鐨勪緥澶栥傚鏋滀綘宸茬粡鍦ㄥ簲鐢ㄧ▼搴忓璞′腑澶勭悊 ID_APP_ABOUT錛岄偅鎶奍D_APP_ABOUT 娣誨姞鍒扮郴緇熻彍鍗曞悗錛屼負浠涔堣繕瑕佸幓瀹炵幇涓濂楀崟鐙殑鏈哄埗錛?br>銆銆澶勭悊澶栧姞緋葷粺鍛戒護鐨勬瘮杈冨ソ鐨勶紝鎴栬呰鏇?MFC 鐨勬柟娉曞簲璇ユ槸閫氳繃甯歌鐨勫懡浠よ礬鐢辨満鍒朵紶閫掑畠浠傜劧鍚庢寜 MFC 甯歌鏂規硶緙栧啓 ON_COMMAND 澶勭悊渚嬬▼鏉ュ鐞嗙郴緇熷懡浠ゃ備綘鐢氳嚦鍙互鐢?ON_UPDATE_COMMAND_UI 鏉ユ洿鏂頒綘鐨勭郴緇熻彍鍗曢」錛屼緥濡傜鐢ㄦ煇涓彍鍗曢」鎴栧湪鑿滃崟欏規梺杈規樉紺轟竴涓璁爣蹇椼?br>銆銆Figure 2 鏄垜鍐欑殑涓涓被錛孋SysCmdRouter錛岃繖涓被灝嗙郴緇熷懡浠よ漿鎴愬父瑙勫懡浠ゃ備負浜嗕嬌鐢ㄨ繖涓被錛屼綘瑕佸仛鐨勫彧鏄湪涓繪鏋朵腑瀹炰緥鍖?CSysCmdRouter錛屽茍浠?OnCreate 涓皟鐢ㄥ叾 Init 鏂規硶鍗沖彲錛?/p>
int CMainFrame::OnCreate(...)
{
// 灝嗘垜鐨勮彍鍗曢」娣誨姞鍒扮郴緇熻彍鍗?br> CMenu* pMenu = GetSystemMenu(FALSE);
pMenu->AppendMenu(..ID_MYCMD1..);
pMenu->AppendMenu(..ID_MYCMD2..);
// 閫氳繃 MFC 璺敱緋葷粺鍛戒護
m_sysCmdHook.Init(this);
return 0;
}銆銆涓鏃︿綘璋冪敤 CSysCmdRouter::Init錛屼綘渚垮彲浠ユ寜甯歌鏂瑰紡澶勭悊 ID_MYCMD1 鍜?ID_MYCMD2錛屼負 MFC 鍛戒護璺敱鏈哄埗涓殑浠諱綍瀵硅薄緙栧啓 ON_COMMAND 澶勭悊渚嬬▼鈥斺旇鍥撅紝鏂囨。錛屾鏋訛紝搴旂敤紼嬪簭鎴栭氳繃鏀瑰啓 OnCmdMsg 娣誨姞鐨勪換浣曞叾瀹冨懡浠ゅ璞°侰SysCmdRouter 榪樿浣犵敤 ON_UPDATE_COMMAND_UI 澶勭悊鍣ㄦ洿鏂扮郴緇熻彍鍗曘傚敮涓瑕佹敞鎰忕殑鏄‘淇濆懡浠Ds涓嶈涓庡叾瀹冭彍鍗曞懡浠わ紙闄ら潪浠栦滑紜疄浠h〃鐩稿悓鐨勫懡浠わ級鎴栧唴寤虹郴緇熷懡浠ゅ彂鐢熷啿紿侊紝鍐呭緩緋葷粺鍛戒護浠?SC_SIZE = 0xF000 寮濮嬨俈isual Studio .NET 鎸囧畾鐨勫懡浠?IDs 浠?0x8000 = 32768 寮濮嬶紝鎵浠ュ鏋滀綘璁?Visual Studio 鏉ユ寚瀹?IDs錛屽彧瑕佷笉瓚呰繃 0xF000-0x8000 = 0x7000 涓懡浠ゅ嵆鍙備篃灝辨槸鍗佽繘鍒剁殑 28,762銆傚鏋滀綘鐨勫簲鐢ㄧ▼搴忔湁瓚呰繃 28000 涓懡浠わ紝閭d箞浣犻渶瑕佸挩璇㈢紪紼嬬簿紲炵梾涓撳銆?br>銆銆CSysCmdRouter 鏄浣曞疄鐜板叾欖旀硶鐨勫憿錛熺畝鍗曪細瀹冧嬌鐢ㄦ垜閭d釜浠ュ墠涓撴爮涓棤澶勪笉鍦ㄧ殑 CSubclassWnd銆侰SubclassWnd 浣夸綘涓嶇敤浠庡叾媧劇敓渚胯兘瀛愮被鍖?MFC 紿楀彛瀵硅薄銆侰SysCmdRouter 媧劇敓鑷?CSubclassWnd 騫朵嬌鐢ㄥ畠瀛愮被鍖栦富妗嗘灦銆傚挨鍏舵槸瀹冩埅鑾峰彂閫佸埌妗嗘灦鐨?WM_SYSCOMMAND 娑堟伅銆傚鏋滃懡浠?ID 灞炰簬緋葷粺鍛戒護錛堝ぇ浜?SC_SIZE = 0xF000錛夛紝鍒?CSysCmdRouter 娌跨潃 Windows 涓璺紶閫掕娑堟伅錛涘惁鍒欎究鍚冩帀 WM_SYSCOMMAND 騫墮噸鏂板皢瀹冧綔涓?WM_COMMAND 鍙戦侊紝浜庢槸 MFC 鎸夌収鍏跺父瑙勮礬鐢辮繃紼嬶紝璋冪敤浣犵殑 ON_COMMAND 澶勭悊鍣ㄣ傚緢鑱槑錛屾槸涓嶆槸錛?br>銆銆閭d箞 ON_UPDATE_COMMAND_UI 澶勭悊鍣ㄥ憿錛烠SysCmdRouter 鏄浣曡瀹冨鐞嗙郴緇熻彍鍗曞懡浠ょ殑鍛紵寰堢畝鍗曘傚氨鍦?Windows 鏄劇ず鑿滃崟鍓嶏紝浠栧悜浣犵殑涓葷獥鍙e彂閫佷竴涓?WM_INITMENUPOPUP 娑堟伅銆傝繖鏄綘鏇存柊鑿滃崟欏圭殑鏈浣蟲椂鏈衡斺斿惎鐢ㄦ垨紱佺敤瀹冧滑錛屾坊鍔犳璁爣蹇楃瓑絳夈侻FC 涓烘瘡涓彍鍗曢」鍒涘緩涓涓?CCmdUI 瀵硅薄騫跺皢瀹冧紶閫掑埌浣犵殑娑堟伅鏄犲皠涓浉搴旂殑 ON_UPDATE_COMMAND_UI 澶勭悊鍣ㄣ備互瀹冧負鍙傛暟鐨?MFC 鍑芥暟鏄?CFrameWnd::OnInitMenuPopup錛岃繖涓嚱鏁版槸榪欐牱鐨勶細
void CFrameWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu)
{
if (bSysMenu)
return; // don''t support system menu
...
}銆銆MFC 鍒濆鍖栫郴緇熻彍鍗曟椂涓嶅仛浠諱綍浜嬫儏銆備負浠涔堣鍘誨叧蹇冭繖縐嶄簨鍛紵涓囦竴浣犺璁?bSysMenu 涓?FALSE錛屽嵆浣挎槸緋葷粺鑿滃崟錛岄偅璇ユ庝箞鍔烇紵榪欐伆鎭版槸 CSysCmdRouter 鍋氱殑浜嬫儏銆傚畠鎴彇 WM_INITMENUPOPUP 騫舵竻闄?bSysMenu 鏍囧織錛屼篃灝辨槸 LPARAM 鐨?HIWORD錛?/p>
if (msg==WM_INITMENUPOPUP) {
lp = LOWORD(lp); // (set HIWORD = 0)
}銆銆鐜板湪錛屽綋 MFC 鑾峰緱 WM_INITMENUPOPUP錛屽畠璁や負璇ヨ彍鍗曟槸甯歌鑿滃崟銆傚彧瑕佷綘鐨勫懡浠?IDs 涓庣湡姝g殑緋葷粺鑿滃崟涓嶅啿紿侊紝涓鍒囬兘榪愯寰楀緢濂姐傚鏋滀綘鏀瑰啓 OnInitMenuPopup錛屽敮涓涓㈠け鐨勪笢瑗挎槸涓嶈兘浠庝富紿楀彛鑿滃崟涓尯鍒嗙郴緇熻彍鍗曘傚樋錛屼綘涓嶈兘浠涔堥兘鎯寵錛侀氳繃鏀瑰啓 CWnd::WindowProc錛屼綘鎬繪槸鑳藉鐞?WM_INITMENUPOPUP 鐨勶紝鎴栦綘鎯寵鍖哄垎錛屽氨姣旇緝 HMENUs銆備絾浣犵‘瀹炰笉鐢ㄥ叧蹇冨懡浠ゆ潵鑷綍澶勩?/p>
Figure 3 浠誨姟鏍忚彍鍗?/p>
銆銆涓轟簡灞曠ず鎵鏈夌殑瀹炶返錛屾垜鍐欎簡涓涓皬嫻嬭瘯紼嬪簭錛?TBMenu銆傚鍥?Figure 3 鎵紺猴紝褰撲綘鍙抽敭鍗曞嚮浠誨姟鏍忎笂 TBMenu 鐨勬渶灝忓寲鎸夐挳錛屼究浼氭樉紺哄嚭鑿滃崟銆備綘鍙互鐪嬪埌鍦ㄨ彍鍗曞簳閮ㄦ湁涓や釜棰濆鐨勫懡浠ゃ俆BMenu 鐨?CMainFrame浠g爜濡?Figure 4 鎵紺恒備究鐭ラ亾鍦?OnCreate 鐨勪粈涔堝湴鏂規坊鍔犲懡浠ゅ茍鍦?CMainFrame 鐨勬秷鎭槧灝勪腑鐢?ON_COMMAND 浠ュ強 ON_UPDATE_COMMAND_UI 澶勭悊鍣ㄥ鐞嗗畠浠俆BMenu 鍦ㄥ叾搴旂敤紼嬪簭綾諱腑澶勭悊 ID_APP_ABOUT錛堜唬鐮佹湭鍒楀嚭錛夈侰SysCmdRouter 浣跨郴緇熷懡浠ょ殑宸ヤ綔鏈哄埗綾諱技鍏跺畠鍛戒護銆?/p>
璇村埌鍛戒護錛屾垜浠潵鐪嬬湅涓涓皬璧勬枡錛?/p>
銆銆鍦ㄦ垜涓鏈堜喚鐨勪笓鏍忎腑錛屾垜闂槸鍚︽湁浜虹煡閬?Ctrl+Alt+Del 鐨勭敱鏉ャ傛樉鐒訛紝鏈夊嚑涓鑰呯煡閬撳浣曚嬌鐢?Google錛屽洜涓轟粬浠彂緇欐垜鐨勬槸鐩稿悓鐨勯摼鎺ワ細銆婁粖鏃ョ編鍥姐嬩笂鐨勪竴綃囨枃绔狅細“Thank this guy for 'control-alt-delete'”錛屾垜鍦ㄤ竴鏈堝彂闂箣鍓嶅氨鍙戠幇浜嗚繖綃囨枃绔犮侰trl+Alt+Del 鏄敱涓涓悕鍙?David J. Bradley 鐨勪漢鍙戠幇鐨勶紝浠栧湪 IBM 宸ヤ綔榪囥?br>IBM 瑙夊緱搴旇鏈変竴縐嶆柟娉曚笉鐢ㄥ叧闂數婧愬氨鑳介噸緗紙reset錛夊叾鏂扮殑 PC 鏈恒備負浠涔堣涓撻棬鐢?Ctrl+Alt+Del 榪欎笁涓敭鍛紵浠庢妧鏈笂鏉ヨ錛孌avid 闇瑕佷嬌鐢ㄤ袱涓慨楗伴敭銆備粬鎯寵涓縐嶆病鏈変漢鍙兘鎰忓鏁插叆鐨勯敭緇勫悎銆傛墍浠ヤ粬閫夋嫨浜?
Ctrl+Alt 浣滀負淇グ閿紙姣?Shift 鐢ㄥ緱灝戯級鍜?Delete錛屾閿綅浜庨敭鐩樼殑鍙︿竴绔紝鎵浠ユ暡鍑?Ctrl+Alt+Del 闇瑕佷袱鍙墜錛岃嚦灝戝湪榪囧幓鏄繖鏍峰仛鐨勩?br>褰撲粖鐜頒唬閿洏鍦ㄥ彸杈逛篃鏈?Ctrl 鍜?Alt 閿傞噸鍚壒鎬х殑鍒濊》鏄負 IBM 鐨勪漢璁捐鐨勭瀵嗗畨鍏ㄥ嚭鍙o紝浣嗕笉鍙伩鍏嶅湴錛屽畠宸茬粡鎴愪負涓涓笉鏄瀵嗙殑縐樺瘑銆備竴鏃﹀紑鍙戜漢鍛樼煡閬撲簡瀹冿紝浠栦滑渚垮紑濮嬪憡璇夊鎴蜂嬌鐢ㄨ繖涓壒鎬ф潵瑙e喅鏈哄櫒鎸傝搗闂銆傞殢鐫鍘嗗彶鐨勫彂灞曪紝Ctrl+Alt+Del 琚漢浠翰鍒囧湴鎴愪負“涓夋寚鏁ぜ”錛屽嵆渚挎槸鍦ㄥ綋浠婄殑 Windows 涓粛鐒跺叿鏈夌敓鍛藉姏錛岀敤瀹冭皟鍑轟換鍔$鐞嗗櫒錛屼互渚夸綘鑳芥潃姝繪寕璧風殑浠誨姟鎴栫粓姝㈢郴緇燂紙鏇村鏈夊叧綾諱技 Ctrl+Alt+Del 瀹夊叏閿簭鍒楃殑鍐呭錛屽弬瑙佹湰鏈堢殑 Security Briefs 涓撴爮錛夈傞偅涔堬紝濡傛灉 Ctrl+Alt+Del 澶辮觸浜嗘庝箞鍔烇紵涓轟粈涔堜細澶辮觸錛岃鎸変綇瀹冧繚鎸?5 縐掗挓銆?br>銆銆David Bradley 鏄綋鍒濆緩绔?IBM 涓漢璁$畻鏈虹殑 12 涓伐紼嬪笀涔嬩竴銆備粬緙栧啓浜?ROM BIOS錛屾湁鍏?David 鐨勭畝浠嬶紝鍙傝 David J. Bradley銆?/p>
紲濈紪紼嬫剦蹇紒
鎮ㄧ殑鎻愰棶鍜岃瘎璁哄彲鍙戦佸埌 Paul 鐨勪俊綆憋細cppqa@microsoft.com
銆
浣滆呯畝浠?br>銆銆Paul DiLascia 鏄竴鍚嶈嚜鐢變綔瀹訛紝欏鵑棶鍜?Web/UI 璁捐鑰呫備粬鏄奧riting Reusable Windows Code in C++銆嬩功錛圓ddison-Wesley, 1992錛夌殑浣滆呫傞氳繃 http://www.dilascia.com 鍙互鑾峰緱鏇村浜嗚В銆?銆
鏈枃鍑鴻嚜 MSDN Magazine 鐨?May 2005 鏈熷垔錛屽彲閫氳繃褰撳湴鎶ユ憡鑾峰緱錛屾垨鑰呮渶濂芥槸 璁㈤槄
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/liuchanghe/archive/2006/12/31/1471302.aspx
浠ュ墠鍙槸綆鍗曟槸浣跨敤sscanf,鍗存病鍙戠幇鍏惰繕鏈夊姝ゅ己澶х殑鍔熻兘
char str0[100],str1[100],str2[100],str3[100];
sscanf("abcde abc 123 aaa","%s %s %s %s",str0,str1,str2,str3);
緇撴灉:str0="abcde" str1="abc" str2 = "123" str3="aaa"
sscanf("abcde abc 123 aaa","abc%s %s %*d %s",str0,str1,str3);
緇撴灉:str0="abcde" str1="abc" str3="aaa"
sscanf("abc123 efg456","%4s",str0);
緇撴灉:str0="abc1"
sscanf("abc123 efg456a4","%[a-z 1-5]",str0);
緇撴灉:str0="abc123 efg45"
sscanf("abc123 efg456a4","%[a-z1-5]",str0);
緇撴灉:str0="abc123"
sscanf("ABCTabcZ123 efg456","%[A-P]",str0);
緇撴灉:str0="ABC"
sscanf("abc 12345","%[^ ]",str0);
緇撴灉:str0="abc"
sscanf("abc 12345","%[^4]",str0);
緇撴灉:str0="abc 123"
sscanf("fdaBs 52aB1asdf","%[^4-0]",str0);
緇撴灉:str0="fdaBs 5"
sscanf("abc 12345","%[^ ]%[^3]",str0,str1);
緇撴灉:str0="abc" str1="12"
sscanf("abc301abc2345","%*[^9-0]%s",str0);
緇撴灉:str0="301abc2345"
sscanf("bca@123efg4@5abc","%*[^@]@%[^@]",str0);
緇撴灉:str0="123efg4"
| Precedence | Operator | Description | Example | Associativity |
|---|---|---|---|---|
| 1 | () [] -> . :: ++ -- |
Grouping operator Array access Member access from a pointer Member access from an object Scoping operator Post-increment Post-decrement |
(a + b) / 4; array[4] = 2; ptr->age = 34; obj.age = 34; Class::age = 2; for( i = 0; i < 10; i++ ) ... for( i = 10; i > 0; i-- ) ... |
left to right |
| 2 | ! ~ ++ -- - + * & (type) sizeof |
Logical negation Bitwise complement Pre-increment Pre-decrement Unary minus Unary plus Dereference Address of Cast to a given type Return size in bytes |
if( !done ) ... flags = ~flags; for( i = 0; i < 10; ++i ) ... for( i = 10; i > 0; --i ) ... int i = -1; int i = +1; data = *ptr; address = &obj; int i = (int) floatNum; int size = sizeof(floatNum); |
right to left |
| 3 | ->* .* |
Member pointer selector Member pointer selector |
ptr->*var = 24; obj.*var = 24; |
left to right |
| 4 | * / % |
Multiplication Division Modulus |
int i = 2 * 4; float f = 10 / 3; int rem = 4 % 3; |
left to right |
| 5 | + - |
Addition Subtraction |
int i = 2 + 3; int i = 5 - 1; |
left to right |
| 6 | << >> |
Bitwise shift left Bitwise shift right |
int flags = 33 << 1; int flags = 33 >> 1; |
left to right |
| 7 | < <= > >= |
Comparison less-than Comparison less-than-or-equal-to Comparison greater-than Comparison geater-than-or-equal-to |
if( i < 42 ) ... if( i <= 42 ) ... if( i > 42 ) ... if( i >= 42 ) ... |
left to right |
| 8 | == != |
Comparison equal-to Comparison not-equal-to |
if( i == 42 ) ... if( i != 42 ) ... |
left to right |
| 9 | & | Bitwise AND | flags = flags & 42; | left to right |
| 10 | ^ | Bitwise exclusive OR | flags = flags ^ 42; | left to right |
| 11 | | | Bitwise inclusive (normal) OR | flags = flags | 42; | left to right |
| 12 | && | Logical AND | if( conditionA && conditionB ) ... | left to right |
| 13 | || | Logical OR | if( conditionA || conditionB ) ... | left to right |
| 14 | ? : | Ternary conditional (if-then-else) | int i = (a > b) ? a : b; | right to left |
| 15 | = += -= *= /= %= &= ^= |= <<= >>= |
Assignment operator Increment and assign Decrement and assign Multiply and assign Divide and assign Modulo and assign Bitwise AND and assign Bitwise exclusive OR and assign Bitwise inclusive (normal) OR and assign Bitwise shift left and assign Bitwise shift right and assign |
int a = b; a += 3; b -= 4; a *= 5; a /= 2; a %= 3; flags &= new_flags; flags ^= new_flags; flags |= new_flags; flags <<= 2; flags >>= 2; |
right to left |
| 16 | , | Sequential evaluation operator | for( i = 0, j = 0; i < 10; i++, j++ ) ... | left to right |