锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧美国产日韩中文字幕,日韩亚洲一区二区,在线免费观看欧美http://m.shnenglu.com/zzh/Xiao.Zhu C++zh-cnSun, 16 Nov 2025 20:06:56 GMTSun, 16 Nov 2025 20:06:56 GMT60宓屽叆寮忕▼搴忓憳搴旇鐭ラ亾鐨?6涓棶棰?/title><link>http://m.shnenglu.com/zzh/archive/2008/11/28/68049.html</link><dc:creator>Xiao.Zhu</dc:creator><author>Xiao.Zhu</author><pubDate>Fri, 28 Nov 2008 00:41:00 GMT</pubDate><guid>http://m.shnenglu.com/zzh/archive/2008/11/28/68049.html</guid><wfw:comment>http://m.shnenglu.com/zzh/comments/68049.html</wfw:comment><comments>http://m.shnenglu.com/zzh/archive/2008/11/28/68049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zzh/comments/commentRss/68049.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zzh/services/trackbacks/68049.html</trackback:ping><description><![CDATA[<div class="hvzpftn" id="art" style="margin: 15px;"> <div>---Sailor_forever鍒嗘瀽鏁寸悊錛?a href="mailto:sailing_9806@163.com">sailing_9806@163.com</a><br>1銆侀澶勭悊鍣紙Preprocessor錛?.. 1<br>2銆佸浣曞畾涔夊畯... 2<br>3銆侀澶勭悊鍣ㄦ爣璇?error鐨勭洰鐨勬槸浠涔堬紵... 4<br>4銆佹寰幆錛圛nfinite loops錛?.. 4<br>5銆佹暟鎹0鏄庯紙Data declarations錛?.. 5<br>6銆佸叧閿瓧static鐨勪綔鐢ㄦ槸浠涔堬紵... 6<br>7銆佸叧閿瓧const鏈変粈涔堝惈鎰忥紵... 7<br>8銆乂olatile鐨勪嬌鐢?.. 9<br>9銆佷綅鎿嶄綔錛圔it manipulation錛?.. 12<br>10銆佽闂浐瀹氱殑鍐呭瓨浣嶇疆錛圓ccessing fixed memory locations錛?.. 13<br>11銆佷腑鏂紙Interrupts錛?.. 13<br>12銆佺鍙鋒墿灞曠殑浠g爜渚嬪瓙錛圕ode examples錛?.. 15<br>13銆佸鐞嗗櫒瀛楅暱瀵艱嚧鐨勬暟鎹墿灞曢棶棰?.. 16<br>14銆佸姩鎬佸唴瀛樺垎閰嶏紙Dynamic memory allocation錛?.. 16<br>15銆佺敤Typedef鏋勯犲鍚堢被鍨?.. 17<br>16銆佹櫐娑╃殑璇硶鍙婁唬鐮侀鏍?.. 18<br><br>C璇█嫻嬭瘯鏄嫑鑱樺祵鍏ュ紡緋葷粺紼嬪簭鍛樿繃紼嬩腑蹇呴』鑰屼笖鏈夋晥鐨勬柟娉曘傝繖浜涘勾錛屾垜鏃㈠弬鍔犱篃緇勭粐浜嗚澶氳繖縐嶆祴璇曪紝鍦ㄨ繖榪囩▼涓垜鎰忚瘑鍒拌繖浜涙祴璇曡兘涓洪潰璇曡呭拰琚潰璇曡呮彁渚涜澶氭湁鐢ㄤ俊鎭紝姝ゅ錛屾拠寮闈㈣瘯鐨勫帇鍔涗笉璋堬紝榪欑嫻嬭瘯涔熸槸鐩稿綋鏈夎叮鐨勩?<br><br>浠? 琚潰璇曡呯殑瑙掑害鏉ヨ錛屼綘鑳戒簡瑙h澶氬叧浜庡嚭棰樿呮垨鐩戣冭呯殑鎯呭喌銆傝繖涓祴璇曞彧鏄嚭棰樿呬負鏄劇ず鍏跺ANSI鏍囧噯緇嗚妭鐨勭煡璇嗚屼笉鏄妧鏈妧宸ц岃璁″悧錛熻繖鏄釜鎰氳牏鐨? 闂鍚楋紵濡傝浣犵瓟鍑烘煇涓瓧絎︾殑ASCII鍊箋傝繖浜涢棶棰樼潃閲嶈冨療浣犵殑緋葷粺璋冪敤鍜屽唴瀛樺垎閰嶇瓥鐣ユ柟闈㈢殑鑳藉姏鍚楋紵榪欐爣蹇楃潃鍑洪鑰呬篃璁歌姳鏃墮棿鍦ㄥ井鏈轟笂鑰屼笉鏄湪宓屽叆寮? 緋葷粺涓娿傚鏋滀笂榪頒換浣曢棶棰樼殑絳旀鏄?鏄?鐨勮瘽錛岄偅涔堟垜鐭ラ亾鎴戝緱璁ょ湡鑰冭檻鎴戞槸鍚﹀簲璇ュ幓鍋氳繖浠藉伐浣溿?<br><br>浠庨潰璇曡呯殑瑙掑害鏉ヨ錛屼竴涓祴璇曚篃璁歌兘 浠庡鏂歸潰鎻ず搴旇瘯鑰呯殑绱犺川錛氭渶鍩烘湰鐨勶紝浣犺兘浜嗚В搴旇瘯鑰匔璇█鐨勬按騫熾備笉綆℃庝箞鏍鳳紝鐪嬩竴涓嬭繖浜哄浣曞洖絳斾粬涓嶄細鐨勯棶棰樹篃鏄弧鏈夎叮銆傚簲璇曡呮槸浠ュソ鐨勭洿瑙夊仛鍑烘槑鏅? 鐨勯夋嫨錛岃繕鏄彧鏄瀻钂欏憿錛熷綋搴旇瘯鑰呭湪鏌愪釜闂涓婂崱浣忔椂鏄壘鍊熷彛鍛紝榪樻槸琛ㄧ幇鍑哄闂鐨勭湡姝g殑濂藉蹇冿紝鎶婅繖鐪嬫垚瀛︿範鐨勬満浼氬憿錛熸垜鍙戠幇榪欎簺淇℃伅涓庝粬浠殑嫻嬭瘯鎴? 緇╀竴鏍鋒湁鐢ㄣ?<br><br>鏈変簡榪欎簺鎯蟲硶錛屾垜鍐沖畾鍑轟竴浜涚湡姝i拡瀵瑰祵鍏ュ紡緋葷粺鐨勮冮錛屽笇鏈涜繖浜涗護浜哄ご鐥涚殑鑰冮鑳界粰姝e湪鎵懼伐浣滅殑浜轟竴鐐瑰府鍔┿傝繖浜涢棶棰橀兘鏄垜榪欎簺騫村疄闄呯鍒扮殑銆傚叾涓湁浜涢寰堥毦錛屼絾瀹冧滑搴旇閮借兘緇欎綘涓鐐瑰惎榪?<br><br>榪欎釜嫻嬭瘯閫備簬涓嶅悓姘村鉤鐨勫簲璇曡咃紝澶у鏁板垵綰ф按騫崇殑搴旇瘯鑰呯殑鎴愮嘩浼氬緢宸紝緇忛獙涓板瘜鐨勭▼搴忓憳搴旇鏈夊緢濂界殑鎴愮嘩銆備負浜嗚浣犺兘鑷繁鍐沖畾鏌愪簺闂鐨勫亸濂斤紝姣忎釜闂娌℃湁鍒嗛厤鍒嗘暟錛屽鏋滈夋嫨榪欎簺鑰冮涓轟綘鎵鐢紝璇瘋嚜琛屾寜浣犵殑鎰忔濆垎閰嶅垎鏁般?<br><br><br><br>1銆侀澶勭悊鍣紙Preprocessor錛?<br>鐢ㄩ澶勭悊鎸囦護#define 澹版槑涓涓父鏁幫紝鐢ㄤ互琛ㄦ槑1騫翠腑鏈夊灝戠錛堝拷鐣ラ棸騫撮棶棰橈級 <br><br>#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL錛堝ぇ灝忓啓閮借錛屽父閲忓悗闈㈠彲浠ュ姞姝ゆ爣蹇楋紝瀹忕殑鍛藉悕椋庢牸瑕佸ぇ鍐欙紝澶氫釜涔嬮棿鐢ㄤ笅鍒掔嚎錛?<br><br>鎴戝湪榪欐兂鐪嬪埌鍑犱歡浜嬫儏錛?<br><br>1) #define 璇硶鐨勫熀鏈煡璇嗭紙渚嬪錛氫笉鑳戒互鍒嗗彿緇撴潫錛屾嫭鍙風殑浣跨敤錛堣〃杈懼紡銆佸弬鏁扮瓑瑕佹嫭璧鋒潵錛夛紝絳夌瓑錛?<br><br>2)鎳傚緱棰勫鐞嗗櫒灝嗕負浣犺綆楀父鏁拌〃杈懼紡鐨勫鹼紙闅鵑亾涓嶆槸鏇挎崲涔堬紝鍏堢畻鍐嶆浛錛熶細灝嗗父鏁板悎騫訛級錛屽洜姝わ紝鐩存帴鍐欏嚭浣犳槸濡備綍璁$畻涓騫翠腑鏈夊灝戠鑰屼笉鏄綆楀嚭瀹為檯鐨勫鹼紝鏄洿娓呮櫚鑰屾病鏈変唬浠風殑銆?<br><br>3) 鎰忚瘑鍒拌繖涓〃杈懼紡灝嗕嬌涓涓?6浣嶆満鐨勬暣鍨嬫暟婧㈠嚭-鍥犳瑕佺敤鍒伴暱鏁村瀷絎﹀彿L,鍛婅瘔緙栬瘧鍣ㄨ繖涓父鏁版槸鐨勯暱鏁村瀷鏁般?<br><br>4) 濡傛灉浣犲湪浣犵殑琛ㄨ揪寮忎腑鐢ㄥ埌UL錛堣〃紺烘棤絎﹀彿闀挎暣鍨嬶級錛岄偅涔堜綘鏈変簡涓涓ソ鐨勮搗鐐廣傝浣忥紝絎竴鍗拌薄寰堥噸瑕併?br><br>2銆佸浣曞畾涔夊畯<br>鍐欎竴涓?鏍囧噯"瀹廙IN 錛岃繖涓畯杈撳叆涓や釜鍙傛暟騫惰繑鍥炶緝灝忕殑涓涓?br><br>鑰冪偣錛氾紙琛ㄨ揪寮忋佸弬鏁扮瓑瑕佹嫭璧鋒潵錛?<br><br>#define MIN(A,B) 錛堬紙A錛?<= (B) ? (A) : (B)) <br><br>榪欎釜嫻嬭瘯鏄負涓嬮潰鐨勭洰鐨勮岃鐨勶細 <br><br>1) 鏍囪瘑#define鍦ㄥ畯涓簲鐢ㄧ殑鍩烘湰鐭ヨ瘑銆傝繖鏄緢閲嶈鐨勩傚洜涓哄湪宓屽叆(inline)鎿嶄綔絎﹀彉涓烘爣鍑咰鐨勪竴閮ㄥ垎涔嬪墠錛屽畯鏄柟渚夸駭鐢熷祵鍏ヤ唬鐮佺殑鍞竴鏂規硶錛屽 浜庡祵鍏ュ紡緋葷粺鏉ヨ錛屼負浜嗚兘杈懼埌瑕佹眰鐨勬ц兘錛堝綋鐒朵富瑕佹槸瀹炴椂鎬у摝錛岀壓鐗蹭唬鐮佺┖闂存崲鍙栨椂闂存晥鐜囷級錛屽祵鍏ヤ唬鐮佺粡甯告槸蹇呴』鐨勬柟娉曘?<br><br>2)涓夐噸鏉′歡鎿嶄綔絎︾殑鐭ヨ瘑銆傝繖涓搷浣滅瀛樺湪C璇█涓殑鍘熷洜鏄畠浣垮緱緙栬瘧鍣ㄨ兘浜х敓姣攊f-then-else錛堝瓨鍦ㄦ潯浠惰漿縐諱細涓柇鎸囦護嫻佹按綰匡級鏇翠紭鍖栫殑浠g爜錛屼簡瑙h繖涓敤娉曟槸寰堥噸瑕佺殑銆?<br><br>3) 鎳傚緱鍦ㄥ畯涓皬蹇冨湴鎶婂弬鏁扮敤鎷彿鎷搗鏉?<br><br>4) 鎴戜篃鐢ㄨ繖涓棶棰樺紑濮嬭璁哄畯鐨勫壇浣滅敤錛屼緥濡傦細褰撲綘鍐欎笅闈㈢殑浠g爜鏃朵細鍙戠敓浠涔堜簨錛?<br><br>least = MIN(*p++, b); <br><br><br><br>姝ゅ鑰冪偣錛歩nline鍑芥暟鍜屽畯鐨勫尯鍒?br><br>瀹? 鍙槸灝嗗弬鏁板畬鍏ㄦ浛鎹紝鍗矼IN(*p++, b)榪涜瀹忓睍寮鍚庝負錛堬紙*p++錛?<= (b) ? (*p++) : (b))錛屽鏋滐紙*p++錛?<= (b)鎴愮珛錛屽垯琛ㄨ揪寮忕殑鍊間負(*p++)錛屼絾鐢變簬鍦紙*p++錛?lt;= (b)鍒ゆ柇榪囩▼涓敼鍙樹簡p鐨勫鹼紝浣垮緱姝ゆ椂鐨? (*p++)闈烇紙*p++錛?lt;= (b)涓殑鍊間簡錛岃繚鑳屼簡錛熷彿琛ㄨ揪寮忕殑鍘熸剰銆?br><br>浣嗘槸鍐呰仈inline鍑芥暟灝嗚繘琛屽弬鏁版鏌ワ紝姹傚嚭鍙傛暟鐨勫煎悗鍐嶅皢姝ゅ煎甫鍏ュ嚱鏁頒腑錛屽洜姝わ紙錛圓錛?<= (B) ? (A) : (B))涓殑A鏄竴鑷寸殑銆?br><br><br><br>絎竴閮ㄥ垎錛氬畯<br>涓轟粈涔堣浣跨敤瀹忓憿錛?br>鍥? 涓哄嚱鏁扮殑璋冪敤蹇呴』瑕佸皢紼嬪簭鎵ц鐨勯『搴忚漿縐誨埌鍑芥暟鎵瀛樻斁鍦ㄥ唴瀛樹腑鐨勬煇涓湴鍧錛屽皢鍑芥暟鐨勭▼搴忓唴瀹規墽琛屽畬鍚庯紝鍐嶈繑鍥炲埌杞幓鎵ц璇ュ嚱鏁板墠鐨勫湴鏂廣傝繖縐嶈漿縐繪搷浣滆姹? 鍦ㄨ漿鍘繪墽琛屽墠瑕佷繚瀛樼幇鍦哄茍璁板繂鎵ц鐨勫湴鍧錛岃漿鍥炲悗瑕佹仮澶嶇幇鍦猴紝騫舵寜鍘熸潵淇濆瓨鍦板潃緇х畫鎵ц銆傚洜姝わ紝鍑芥暟璋冪敤瑕佹湁涓瀹氱殑鏃墮棿鍜岀┖闂存柟闈㈢殑寮閿錛屼簬鏄皢褰卞搷鍏舵晥 鐜囥?br>鑰屽畯鍙槸鍦ㄩ澶勭悊鐨勫湴鏂規妸浠g爜灞曞紑錛屼笉闇瑕侀澶栫殑絀洪棿鍜屾椂闂存柟闈㈢殑寮閿錛屾墍浠ヨ皟鐢ㄤ竴涓畯姣旇皟鐢ㄤ竴涓嚱鏁版洿鏈夋晥鐜囥?br>浣嗘槸瀹忎篃鏈夊緢澶氱殑涓嶅敖浜烘剰鐨勫湴鏂廣?br>1銆佸畯涓嶈兘璁塊棶瀵硅薄鐨勭鏈夋垚鍛樸?br>2銆佸畯鐨勫畾涔夊緢瀹規槗浜х敓浜屾剰鎬с?br><br>3銆佸畯瀹氫箟鐨勫父閲忓湪浠g爜鍖猴紝寰堝璋冭瘯鍣ㄤ笉鑳藉瀵瑰叾璋冭瘯<br>鎴戜滑涓句釜渚嬪瓙錛?br>#define square(x) (x*x)<br><br>閬垮厤榪欎簺閿欒鐨勬柟娉曪紝涓鏄粰瀹忕殑鍙傛暟閮藉姞涓婃嫭鍙楓?br>#define square(x) ((x)*(x))<br><br>絎簩閮ㄥ垎錛氬唴鑱斿嚱鏁?br>浠庝笂闈㈢殑闃愯堪錛屽彲浠ョ湅鍒板畯鏈変竴浜涢毦浠ラ伩鍏嶇殑闂錛屾庝箞瑙e喅鍛紵<br>鍐呰仈鍑芥暟鏄唬鐮佽鎻掑叆鍒拌皟鐢ㄨ呬唬鐮佸鐨勫嚱鏁般傚鍚?#define 瀹忥紝鍐呰仈鍑芥暟閫氳繃閬垮厤琚皟鐢ㄧ殑寮閿鏉ユ彁楂樻墽琛屾晥鐜囷紝灝ゅ叾鏄畠鑳藉閫氳繃璋冪敤錛?#8220;榪囩▼鍖栭泦鎴?#8221;錛夎緙栬瘧鍣ㄤ紭鍖栥?br><br><br>鍐? 鑱斿嚱鏁板拰瀹忓緢綾諱技錛岃屾湰璐ㄥ尯鍒湪浜庯紝瀹忔槸鐢遍澶勭悊鍣ㄥ瀹忚繘琛屾浛浠o紝鑰屽唴鑱斿嚱鏁版槸閫氳繃緙栬瘧鍣ㄦ帶鍒舵潵瀹炵幇鐨勩傝屼笖鍐呰仈鍑芥暟鏄湡姝g殑鍑芥暟錛屽彧鏄湪闇瑕佺敤鍒扮殑鏃? 鍊欙紝鍐呰仈鍑芥暟鍍忓畯涓鏍風殑灞曞紑錛屾墍浠ュ彇娑堜簡鍑芥暟鐨勫弬鏁板帇鏍堬紝鍑忓皯浜嗚皟鐢ㄧ殑寮閿銆備綘鍙互璞¤皟鐢ㄥ嚱鏁頒竴鏍鋒潵璋冪敤鍐呰仈鍑芥暟錛岃屼笉蹇呮媴蹇冧細浜х敓浜庡鐞嗗畯鐨勪竴浜涢棶棰樸?br>澹版槑鍐呰仈鍑芥暟鐪嬩笂鍘誨拰鏅氬嚱鏁伴潪甯哥浉浼鹼細<br>void f(int i, char c);<br>褰撲綘瀹氫箟涓涓唴鑱斿嚱鏁版椂錛屽湪鍑芥暟瀹氫箟鍓嶅姞涓?inline 鍏抽敭瀛楋紝騫朵笖灝嗗畾涔夋斁鍏ュご鏂囦歡錛?br>inline void f(int i, char c)<br>{<br>// ...<br>}<br>鍐呰仈鍑芥暟蹇呴』鏄拰鍑芥暟浣撶殑瀹氫箟鐢蟲槑鍦ㄤ竴璧鳳紝鎵嶆湁鏁堛?br>鍍忚繖鏍風殑鐢蟲槑inline function(int i)鏄病鏈夋晥鏋滅殑錛岀紪璇戝櫒鍙槸鎶婂嚱鏁頒綔涓烘櫘閫氱殑鍑芥暟鐢蟲槑錛屾垜浠繀欏誨畾涔夊嚱鏁頒綋銆?br>inline int function(int i) {return i*i;}<br>榪欐牱鎴戜滑鎵嶇畻瀹氫箟浜嗕竴涓唴鑱斿嚱鏁般傛垜浠彲浠ユ妸瀹冧綔涓轟竴鑸殑鍑芥暟涓鏍瘋皟鐢ㄣ備絾鏄墽琛岄熷害紜瘮涓鑸嚱鏁扮殑鎵ц閫熷害瑕佸揩銆?br><br><br>褰撶劧錛屽唴鑱斿嚱鏁頒篃鏈変竴瀹氱殑灞闄愭с傚氨鏄嚱鏁頒腑鐨勬墽琛屼唬鐮佷笉鑳藉お澶氫簡錛屽鏋滐紝鍐呰仈鍑芥暟鐨勫嚱鏁頒綋榪囧ぇ錛屼竴鑸殑緙栬瘧鍣ㄤ細鏀懼純鍐呰仈鏂瑰紡錛岃岄噰鐢ㄦ櫘閫氱殑鏂瑰紡璋冪敤鍑芥暟銆傝繖鏍鳳紝鍐呰仈鍑芥暟灝卞拰鏅氬嚱鏁版墽琛屾晥鐜囦竴鏍蜂簡銆?br>鏈変笂闈㈢殑涓よ呯殑鐗規э紝鎴戜滑鍙互鐢ㄥ唴鑱斿嚱鏁板畬鍏ㄥ彇浠i澶勭悊瀹忋?br><br><br><br>3銆侀澶勭悊鍣ㄦ爣璇?error鐨勭洰鐨勬槸浠涔堬紵 <br>濡傛灉浣犱笉鐭ラ亾絳旀錛岃鐪嬪弬鑰冩枃鐚?銆傝繖闂瀵瑰尯鍒嗕竴涓甯哥殑浼欒鍜屼竴涓功鍛嗗瓙鏄緢鏈夌敤鐨勩傚彧鏈変功鍛嗗瓙鎵嶄細璇籆璇█璇炬湰鐨勯檮褰曞幓鎵懼嚭璞¤繖縐嶉棶棰樼殑絳旀銆傚綋鐒跺鏋滀綘涓嶆槸鍦ㄦ壘涓涓功鍛嗗瓙錛岄偅涔堝簲璇曡呮渶濂藉笇鏈涜嚜宸變笉瑕佺煡閬撶瓟妗堛?br><br><br><br>4銆佹寰幆錛圛nfinite loops錛?<br>宓屽叆寮忕郴緇熶腑緇忓父瑕佺敤鍒版棤闄愬驚鐜紝浣犳庝箞鏍風敤C緙栧啓姝誨驚鐜憿錛?榪欎釜闂鐢ㄥ嚑涓В鍐蟲柟妗堛?<br><br>鎴戦閫夌殑鏂規鏄細 <br><br>while(1) <br><br>{ <br><br><br><br>} <br><br>涓浜涚▼搴忓憳鏇村枩嬈㈠涓嬫柟妗堬細 <br><br>for(;;) 錛堟澶勭殑鍒ゆ柇鏁堢巼瑕佷綆鐨勫錛屽湪姹囩紪浠g爜涓湅鐪嬶紵錛燂紵錛?br><br>{ <br><br><br><br>} <br><br>榪? 涓疄鐜版柟寮忚鎴戜負闅撅紝鍥犱負榪欎釜璇硶娌℃湁紜垏琛ㄨ揪鍒板簳鎬庝箞鍥炰簨銆傚鏋滀竴涓簲璇曡呯粰鍑鴻繖涓綔涓烘柟妗堬紝鎴戝皢鐢ㄨ繖涓綔涓轟竴涓満浼氬幓鎺㈢┒浠栦滑榪欐牱鍋氱殑鍩烘湰鍘熺悊銆傚鏋? 浠栦滑鐨勫熀鏈瓟妗堟槸錛?鎴戣鏁欑潃榪欐牱鍋氾紝浣嗕粠娌℃湁鎯沖埌榪囦負浠涔堛?榪欎細緇欐垜鐣欎笅涓涓潖鍗拌薄銆? 錛堝緢澶氭椂鍊欓潰璇曞畼鍏蟲敞浣犳濊冮棶棰樼殑鏂瑰紡錛屾槸鍚︾暀鎰忔煇浜涗笢瑗垮杽浜庢濊冿紝鍙兘騫舵病鏈夊閿欙紝鍙槸鍋忓ソ鑰屽凡錛屾瘮濡俶emset鍜宮emcopy浠ュ強strcpy閮? 鑳芥嫹璐濆瓧絎︿覆錛屽埌搴曟湁浠涔堝尯鍒憿錛熺湅浣犳槸鍚﹀杽浜庢瘮杈冩槸鍚﹀叧娉ㄧ粏鑺傦級<br><br><br><br>絎笁涓柟妗堟槸鐢?goto 錛坓oto璇彞鍦–涓槸搴旇灝介噺閬垮厤鐨勶紝鍙湪澶勭悊閿欒浠g爜鏃剁敤錛?br><br>Loop: <br><br>... <br><br>goto Loop; <br><br>搴旇瘯鑰呭緇欏嚭涓婇潰鐨勬柟妗堬紝榪欒鏄庢垨鑰呬粬鏄竴涓眹緙栬璦紼嬪簭鍛橈紙榪欎篃璁告槸濂戒簨錛夋垨鑰呬粬鏄竴涓兂榪涘叆鏂伴鍩熺殑BASIC/FORTRAN紼嬪簭鍛樸?<br><br><br><br>5銆佹暟鎹0鏄庯紙Data declarations錛?<br>鐢ㄥ彉閲廰緇欏嚭涓嬮潰鐨勫畾涔?<br><br>a) 涓涓暣鍨嬫暟錛圓n integer錛?<br><br>b)涓涓寚鍚戞暣鍨嬫暟鐨勬寚閽堬紙 A pointer to an integer錛?<br><br>c)涓涓寚鍚戞寚閽堢殑鐨勬寚閽堬紝瀹冩寚鍚戠殑鎸囬拡鏄寚鍚戜竴涓暣鍨嬫暟錛?A pointer to a pointer to an integers錛?<br><br>d)涓涓湁10涓暣鍨嬫暟鐨勬暟緇勶紙 An array of 10 integers錛?<br><br>e) 涓涓湁10涓寚閽堢殑鏁扮粍錛岃鎸囬拡鏄寚鍚戜竴涓暣鍨嬫暟鐨勩傦紙An array of 10 pointers to integers錛?<br><br>f) 涓涓寚鍚戞湁10涓暣鍨嬫暟鏁扮粍鐨勬寚閽堬紙 A pointer to an array of 10 integers錛?<br><br>g) 涓涓寚鍚戝嚱鏁扮殑鎸囬拡錛岃鍑芥暟鏈変竴涓暣鍨嬪弬鏁板茍榪斿洖涓涓暣鍨嬫暟錛圓 pointer to a function that takes an integer as an argument and returns an integer錛?<br><br>h) 涓涓湁10涓寚閽堢殑鏁扮粍錛岃鎸囬拡鎸囧悜涓涓嚱鏁幫紝璇ュ嚱鏁版湁涓涓暣鍨嬪弬鏁板茍榪斿洖涓涓暣鍨嬫暟錛?An array of ten pointers to functions that take an integer argument and return an integer 錛?<br><br>絳旀鏄細 <br><br>a) int a; // An integer <br><br>b) int *a; // A pointer to an integer <br><br>c) int **a; // A pointer to a pointer to an integer <br><br>d) int a[10]; // An array of 10 integers <br><br>e) int *a[10]; // An array of 10 pointers to integers <br><br>f) int (*a)[10]; // A pointer to an array of 10 integers <br><br>g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer // 涓嶆槸錛坕nt x錛夛紝涓嶉渶瑕佸叿浣撶殑鍙傛暟<br><br>h) int (*a[10])(int)錛堝彲浠ヤ粠e銆乬綾繪瘮寰楀埌錛? // An array of 10 pointers to functions that take an integer argument and return an integer <br><br>浜? 浠粡甯稿0縐拌繖閲屾湁鍑犱釜闂鏄偅縐嶈緲諱竴涓嬩功鎵嶈兘鍥炵瓟鐨勯棶棰橈紝鎴戝悓鎰忚繖縐嶈娉曘傚綋鎴戝啓榪欑瘒鏂囩珷鏃訛紝涓轟簡紜畾璇硶鐨勬紜э紝鎴戠殑紜煡浜嗕竴涓嬩功銆備絾鏄綋鎴戣闈㈣瘯 鐨勬椂鍊欙紝鎴戞湡鏈涜闂埌榪欎釜闂錛堟垨鑰呯浉榪戠殑闂錛夈傚洜涓哄湪琚潰璇曠殑榪欐鏃墮棿閲岋紝鎴戠‘瀹氭垜鐭ラ亾榪欎釜闂鐨勭瓟妗堛傚簲璇曡呭鏋滀笉鐭ラ亾鎵鏈夌殑絳旀錛堟垨鑷沖皯澶ч儴鍒嗙瓟 妗堬級錛岄偅涔堜篃灝辨病鏈変負榪欐闈㈣瘯鍋氬噯澶囷紝濡傛灉璇ラ潰璇曡呮病鏈変負榪欐闈㈣瘯鍋氬噯澶囷紝閭d箞浠栧張鑳戒負浠涔堝仛鍑嗗鍛紵 <br><br><br><br>6銆佸叧閿瓧static鐨勪綔鐢ㄦ槸浠涔堬紵 <br>榪欎釜綆鍗曠殑闂寰堝皯鏈変漢鑳藉洖絳斿畬鍏ㄣ傚湪C璇█涓紝鍏抽敭瀛梥tatic鏈変笁涓槑鏄劇殑浣滅敤錛?<br><br>1)鍦ㄥ嚱鏁頒綋鍐咃紝涓涓澹版槑涓洪潤鎬佺殑鍙橀噺鍦ㄨ繖涓鍑芥暟琚皟鐢ㄨ繃紼嬩腑緇存寔鍏跺間笉鍙橈紙璇ュ彉閲忓瓨鏀懼湪闈欐佸彉閲忓尯錛夈?<br><br>2) 鍦ㄦā鍧楀唴錛堜絾鍦ㄥ嚱鏁頒綋澶栵級錛屼竴涓澹版槑涓洪潤鎬佺殑鍙橀噺鍙互琚ā鍧楀唴鎵鐢ㄥ嚱鏁拌闂紝浣嗕笉鑳借妯″潡澶栧叾瀹冨嚱鏁拌闂傚畠鏄竴涓湰鍦扮殑鍏ㄥ眬鍙橀噺銆?<br><br>3) 鍦ㄦā鍧楀唴錛屼竴涓澹版槑涓洪潤鎬佺殑鍑芥暟鍙彲琚繖涓妯″潡鍐呯殑鍏跺畠鍑芥暟璋冪敤銆傞偅灝辨槸錛岃繖涓嚱鏁拌闄愬埗鍦ㄥ0鏄庡畠鐨勬ā鍧楃殑鏈湴鑼冨洿鍐呬嬌鐢ㄣ?<br><br>澶у鏁板簲璇曡呰兘姝g‘鍥炵瓟絎竴閮ㄥ垎錛屼竴閮ㄥ垎鑳芥紜洖絳旂浜岄儴鍒嗭紝浣嗘槸寰堝皯鐨勪漢鑳芥噦寰楃涓夐儴鍒嗐傝繖鏄竴涓簲璇曡呯殑涓ラ噸鐨勭己鐐癸紝鍥犱負浠栨樉鐒朵笉鎳傚緱鏈湴鍖栨暟鎹拰浠g爜鑼冨洿鐨勫ソ澶勫拰閲嶈鎬с?<br><br><br><br>鑰冪偣錛氬湪宓屽叆寮忕郴緇熶腑錛岃鏃跺埢鎳傚緱縐繪鐨勯噸瑕佹э紝紼嬪簭鍙兘鏄緢澶氱▼搴忓憳鍏卞悓鍗忎綔鍚屾椂瀹屾垚錛屽湪瀹氫箟鍙橀噺鍙婂嚱鏁扮殑榪囩▼錛屽彲鑳戒細閲嶅悕錛岃繖緇欑郴緇熺殑闆嗘垚甯︽潵楹葷儲錛屽洜姝や繚璇佷笉鍐茬獊鐨勫姙娉曟槸鏄劇ず鐨勮〃紺烘鍙橀噺鎴栬呭嚱鏁版槸鏈湴鐨勶紝static鍗沖彲銆?br><br>鍦↙inux鐨勬ā鍧楃紪紼嬩腑錛岃繖涓鏉″緢鏄庢樉錛屾墍鏈夌殑鍑芥暟鍜屽叏灞鍙橀噺閮借鐢╯tatic鍏抽敭瀛楀0鏄庯紝灝嗗叾浣滅敤鍩熼檺鍒跺湪鏈ā鍧楀唴閮紝涓庡叾浠栨ā鍧楀叡浜殑鍑芥暟鎴栬呭彉閲忚EXPORT鍒板唴鏍鎬腑銆?br><br><br><br>static鍏抽敭瀛楄嚦灝戞湁涓嬪垪n涓綔鐢細<br>錛?錛夎緗彉閲忕殑瀛樺偍鍩燂紝鍑芥暟浣撳唴static鍙橀噺鐨勪綔鐢ㄨ寖鍥翠負璇ュ嚱鏁頒綋錛屼笉鍚屼簬auto鍙橀噺錛岃鍙橀噺鐨勫唴瀛樺彧琚垎閰嶄竴嬈★紝鍥犳鍏跺煎湪涓嬫璋冪敤鏃朵粛緇存寔涓婃鐨勫鹼紱<br><br>錛?錛夐檺鍒跺彉閲忕殑浣滅敤鍩燂紝鍦ㄦā鍧楀唴鐨剆tatic鍏ㄥ眬鍙橀噺鍙互琚ā鍧楀唴鎵鐢ㄥ嚱鏁拌闂紝浣嗕笉鑳借妯″潡澶栧叾瀹冨嚱鏁拌闂紱<br><br>錛?錛夐檺鍒跺嚱鏁扮殑浣滅敤鍩燂紝鍦ㄦā鍧楀唴鐨剆tatic鍑芥暟鍙彲琚繖涓妯″潡鍐呯殑鍏跺畠鍑芥暟璋冪敤錛岃繖涓嚱鏁扮殑浣跨敤鑼冨洿琚檺鍒跺湪澹版槑瀹冪殑妯″潡鍐咃紱<br>錛?錛夊湪綾諱腑鐨剆tatic鎴愬憳鍙橀噺鎰忓懗鐫瀹冧負璇ョ被鐨勬墍鏈夊疄渚嬫墍鍏變韓錛屼篃灝辨槸璇村綋鏌愪釜綾葷殑瀹炰緥淇敼浜嗚闈欐佹垚鍛樺彉閲忥紝鍏朵慨鏀瑰間負璇ョ被鐨勫叾瀹冩墍鏈夊疄渚嬫墍瑙侊紱<br>錛?錛夊湪綾諱腑鐨剆tatic鎴愬憳鍑芥暟灞炰簬鏁翠釜綾繪墍鎷ユ湁錛岃繖涓嚱鏁頒笉鎺ユ敹this鎸囬拡錛屽洜鑰屽彧鑳借闂被鐨剆tatic鎴愬憳鍙橀噺銆?br><br><br><br>7銆佸叧閿瓧const鏈変粈涔堝惈鎰忥紵 <br>鎴? 鍙涓鍚埌琚潰璇曡呰錛?const鎰忓懗鐫甯告暟"錛堜笉鏄父鏁幫紝鍙互鏄彉閲忥紝鍙槸浣犱笉鑳戒慨鏀瑰畠錛夛紝鎴戝氨鐭ラ亾鎴戞鍦ㄥ拰涓涓笟浣欒呮墦浜ら亾銆傚幓騫碊an Saks宸茬粡鍦ㄤ粬鐨勬枃绔犻噷瀹屽叏姒傛嫭浜哻onst鐨勬墍鏈夌敤娉曪紝鍥犳ESP(璇戣咃細Embedded Systems Programming)鐨勬瘡涓浣嶈鑰呭簲璇ラ潪甯哥啛鎮塩onst鑳藉仛浠涔堝拰涓嶈兘鍋氫粈涔?濡傛灉浣犱粠娌℃湁璇誨埌閭g瘒鏂囩珷錛屽彧瑕佽兘璇村嚭const鎰忓懗鐫"鍙"灝卞彲 浠ヤ簡銆傚敖綆¤繖涓瓟妗堜笉鏄畬鍏ㄧ殑絳旀錛屼絾鎴戞帴鍙楀畠浣滀負涓涓紜殑絳旀銆傦紙濡傛灉浣犳兂鐭ラ亾鏇磋緇嗙殑絳旀錛屼粩緇嗚涓涓婼aks鐨勬枃绔犲惂銆傦級 <br><br>濡傛灉搴旇瘯鑰呰兘姝g‘鍥炵瓟榪欎釜闂錛屾垜灝嗛棶浠栦竴涓檮鍔犵殑闂錛氫笅闈㈢殑澹版槑閮芥槸浠涔堟剰鎬濓紵 <br><br>Const鍙槸涓涓慨楗扮錛屼笉綆℃庝箞鏍穉浠嶇劧鏄竴涓猧nt鍨嬬殑鍙橀噺<br><br>const int a; <br><br>int const a; <br><br>const int *a; <br><br>int * const a; <br><br>int const * a const; <br><br>鏈川錛歝onst鍦ㄨ皝鍚庨潰璋佸氨涓嶅彲淇敼錛宑onst鍦ㄦ渶鍓嶉潰鍒欏皢鍏跺悗縐諱竴浣嶅嵆鍙紝浜岃呯瓑鏁?br><br><br><br>鍓嶄袱涓殑浣滅敤鏄竴鏍鳳紝a鏄竴涓父鏁村瀷鏁般傜涓変釜鎰忓懗鐫a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑鎸囬拡錛堜篃灝辨槸錛屾寚鍚戠殑鏁村瀷鏁版槸涓嶅彲淇敼鐨勶紝浣嗘寚閽堝彲浠ワ紝姝ゆ渶甯歌浜庡嚱鏁扮殑鍙傛暟錛屽綋浣犲彧寮曠敤浼犺繘鏉ユ寚閽堟墍鎸囧悜鐨勫兼椂搴旇鍔犱笂const淇グ絎︼紝紼嬪簭涓慨鏀圭紪璇戝氨涓嶉氳繃錛屽彲浠ュ噺灝戠▼搴忕殑bug錛夈?br><br><br><br>絎洓涓剰鎬漚鏄竴涓寚鍚戞暣鍨嬫暟鐨勫父鎸囬拡錛堜篃灝辨槸璇達紝鎸囬拡鎸囧悜鐨勬暣鍨嬫暟鏄彲浠ヤ慨鏀圭殑錛屼絾鎸囬拡鏄笉鍙慨鏀圭殑錛夈傛渶鍚庝竴涓剰鍛崇潃a鏄竴涓寚鍚戝父鏁村瀷鏁扮殑甯告寚閽堬紙涔熷氨鏄錛屾寚閽堟寚鍚戠殑鏁村瀷鏁版槸涓嶅彲淇敼鐨勶紝鍚屾椂鎸囬拡涔熸槸涓嶅彲淇敼鐨勶級銆?br><br><br><br>濡傛灉搴旇瘯鑰呰兘姝g‘鍥炵瓟榪欎簺闂錛岄偅涔堜粬灝辯粰鎴戠暀涓嬩簡涓涓ソ鍗拌薄銆傞『甯︽彁涓鍙ワ紝涔熻浣犲彲鑳戒細闂紝鍗充嬌涓嶇敤鍏抽敭瀛?錛屼篃榪樻槸鑳藉緢瀹規槗鍐欏嚭鍔熻兘姝g‘鐨勭▼搴忥紝閭d箞鎴戜負浠涔堣繕瑕佸姝ょ湅閲嶅叧閿瓧const鍛紵鎴戜篃濡備笅鐨勫嚑涓嬬悊鐢憋細 <br><br>1) 鍏抽敭瀛梒onst鐨勪綔鐢ㄦ槸涓虹粰璇諱綘浠g爜鐨勪漢浼犺揪闈炲父鏈夌敤鐨勪俊鎭紝瀹為檯涓婏紝澹版槑涓涓弬鏁頒負甯擱噺鏄負浜嗗憡璇変簡鐢ㄦ埛榪欎釜鍙傛暟鐨勫簲鐢ㄧ洰鐨勩傚鏋滀綘鏇捐姳寰堝鏃墮棿娓呯悊 鍏跺畠浜虹暀涓嬬殑鍨冨溇錛屼綘灝變細寰堝揩瀛︿細鎰熻阿榪欑偣澶氫綑鐨勪俊鎭傦紙褰撶劧錛屾噦寰楃敤const鐨勭▼搴忓憳寰堝皯浼氱暀涓嬬殑鍨冨溇璁╁埆浜烘潵娓呯悊鐨勩傦級 <br><br>2) 閫氳繃緇欎紭鍖栧櫒涓浜涢檮鍔犵殑淇℃伅錛屼嬌鐢ㄥ叧閿瓧const涔熻鑳戒駭鐢熸洿绱у噾鐨勪唬鐮併?<br><br>3) 鍚堢悊鍦頒嬌鐢ㄥ叧閿瓧const鍙互浣跨紪璇戝櫒寰堣嚜鐒跺湴淇濇姢閭d簺涓嶅笇鏈涜鏀瑰彉鐨勫弬鏁幫紝闃叉鍏惰鏃犳剰鐨勪唬鐮佷慨鏀廣傜畝鑰岃█涔嬶紝榪欐牱鍙互鍑忓皯bug鐨勫嚭鐜般?br><br><br><br>const鍏抽敭瀛楄嚦灝戞湁涓嬪垪n涓綔鐢細<br><br>錛?錛夋闃繪涓涓彉閲忚鏀瑰彉錛屽彲浠ヤ嬌鐢╟onst鍏抽敭瀛椼傚湪瀹氫箟璇onst鍙橀噺鏃訛紝閫氬父闇瑕佸瀹冭繘琛屽垵濮嬪寲錛屽洜涓轟互鍚庡氨娌℃湁鏈轟細鍐嶅幓鏀瑰彉瀹冧簡錛?br>錛?錛夊鎸囬拡鏉ヨ錛屽彲浠ユ寚瀹氭寚閽堟湰韜負const錛屼篃鍙互鎸囧畾鎸囬拡鎵鎸囩殑鏁版嵁涓篶onst錛屾垨浜岃呭悓鏃舵寚瀹氫負const錛?br>錛?錛夊湪涓涓嚱鏁板0鏄庝腑錛宑onst鍙互淇グ褰㈠弬錛岃〃鏄庡畠鏄竴涓緭鍏ュ弬鏁幫紝鍦ㄥ嚱鏁板唴閮ㄤ笉鑳芥敼鍙樺叾鍊鹼紱<br>錛?錛夊浜庣被鐨勬垚鍛樺嚱鏁幫紝鑻ユ寚瀹氬叾涓篶onst綾誨瀷錛屽垯琛ㄦ槑鍏舵槸涓涓父鍑芥暟錛屼笉鑳戒慨鏀圭被鐨勬垚鍛樺彉閲忥紱<br>錛?錛夊浜庣被鐨勬垚鍛樺嚱鏁幫紝鏈夋椂鍊欏繀欏繪寚瀹氬叾榪斿洖鍊間負const綾誨瀷錛屼互浣垮緱鍏惰繑鍥炲間笉涓?#8220;宸﹀?#8221;銆備緥濡傦細<br>const classA operator*(const classA& a1,const classA& a2); <br>銆銆operator*鐨勮繑鍥炵粨鏋滃繀欏繪槸涓涓猚onst瀵硅薄銆傚鏋滀笉鏄紝榪欐牱鐨勫彉鎬佷唬鐮佷篃涓嶄細緙栬瘧鍑洪敊錛?br>classA a, b, c;<br>(a * b) = c; // 瀵筧*b鐨勭粨鏋滆祴鍊?<br>銆銆鎿嶄綔(a * b) = c鏄劇劧涓嶇鍚堢紪紼嬭呯殑鍒濊》錛屼篃娌℃湁浠諱綍鎰忎箟銆?br><br><br><br>8銆乂olatile鐨勪嬌鐢?br>鍏抽敭瀛梫olatile鏈変粈涔堝惈鎰?騫剁粰鍑轟笁涓笉鍚岀殑渚嬪瓙銆?<br><br>涓 涓畾涔変負volatile鐨勫彉閲忔槸璇磋繖鍙橀噺鍙兘浼氳鎰忔兂涓嶅埌鍦版敼鍙橈紝榪欐牱錛岀紪璇戝櫒灝變笉浼氬幓鍋囪榪欎釜鍙橀噺鐨勫間簡銆傜簿紜湴璇村氨鏄紝浼樺寲鍣ㄥ湪鐢ㄥ埌榪欎釜鍙橀噺鏃跺繀欏? 姣忔閮藉皬蹇冨湴閲嶆柊璇誨彇榪欎釜鍙橀噺鐨勫鹼紝鑰屼笉鏄嬌鐢ㄤ繚瀛樺湪瀵勫瓨鍣ㄩ噷鐨勫浠斤紙鐢變簬璁塊棶瀵勫瓨鍣ㄧ殑閫熷害瑕佸揩榪嘡AM錛屾墍浠ョ紪璇戝櫒涓鑸兘浼氫綔鍑忓皯瀛樺彇澶栭儴RAM鐨勪紭 鍖栵級銆備笅闈㈡槸volatile鍙橀噺鐨勫嚑涓緥瀛愶細 <br><br>1) 騫惰璁懼鐨勭‖浠跺瘎瀛樺櫒錛堝錛氱姸鎬佸瘎瀛樺櫒錛岄氬父鍦ㄥご鏂囦歡涓皢紜歡瀵勫瓨鍣ㄥ湴鍧define涓烘煇涓剰涔夋槑紜殑琛ㄨ揪寮忥級 <br><br>2) 涓涓腑鏂湇鍔″瓙紼嬪簭涓細璁塊棶鍒扮殑闈炶嚜鍔ㄥ彉閲?Non-automatic variables錛屽嵆static鍙橀噺) 錛涘湪涓柇鏈嶅姟紼嬪簭涓慨鏀圭殑渚涘叾浠栫▼搴忔嫻嬬敤鐨勫彉閲忛渶瑕佸姞volatile澹版槑錛涘惁鍒欑紪璇戝櫒鍙兘瀵瑰彉閲忔洿鏂頒竴嬈″悗姣忔閮戒嬌鐢ㄧ紦瀛樺間笉鍐嶇珛鍗蟲洿鏂幫紱<br><br>3) 澶氱嚎紼嬪簲鐢ㄤ腑琚嚑涓換鍔″叡浜殑鍙橀噺錛堝彲鑳借澶氫釜綰跨▼闅忔椂淇敼錛?<br><br><br><br>鍥? 絳斾笉鍑鴻繖涓棶棰樼殑浜烘槸涓嶄細琚泧浣g殑銆傛垜璁や負榪欐槸鍖哄垎C紼嬪簭鍛樺拰宓屽叆寮忕郴緇熺▼搴忓憳鐨勬渶鍩烘湰鐨勯棶棰樸傛悶宓屽叆寮忕殑瀹朵紮浠粡甯稿悓紜歡銆佷腑鏂丷TOS絳夌瓑鎵撲氦閬擄紝 鎵鏈夎繖浜涢兘瑕佹眰鐢ㄥ埌volatile鍙橀噺銆備笉鎳傚緱volatile鐨勫唴瀹瑰皢浼氬甫鏉ョ伨闅俱傚亣璁捐闈㈣瘯鑰呮紜湴鍥炵瓟浜嗚繖鏄棶棰橈紙鍡紝鎬鐤戞槸鍚︿細鏄繖鏍鳳級錛屾垜灝? 紼嶅井娣辯┒涓涓嬶紝鐪嬩竴涓嬭繖瀹朵紮鏄笉鏄洿姝f噦寰梫olatile瀹屽叏鐨勯噸瑕佹с?<br><br>1)涓涓弬鏁版棦鍙互鏄痗onst榪樺彲浠ユ槸volatile鍚楋紵瑙i噴涓轟粈涔堛?<br><br>2); 涓涓寚閽堝彲浠ユ槸volatile 鍚楋紵瑙i噴涓轟粈涔堛?<br><br>3); 涓嬮潰鐨勫嚱鏁版湁浠涔堥敊璇細 <br><br>int square(volatile int *ptr) <br><br>{ <br><br>return *ptr * *ptr; <br><br>} <br><br>涓嬮潰鏄瓟妗堬細 <br><br>1)鏄殑銆備竴涓緥瀛愭槸鍙鐨勭姸鎬佸瘎瀛樺櫒銆傚畠鏄痸olatile鍥犱負瀹冨彲鑳借鎰忔兂涓嶅埌鍦版敼鍙樸傚畠鏄痗onst鍥犱負紼嬪簭涓嶅簲璇ヨ瘯鍥懼幓淇敼瀹冦?<br><br>2); 鏄殑銆傚敖綆¤繖騫朵笉寰堝父瑙併備竴涓緥瀛愭槸褰撲竴涓腑鏂湇鍔″瓙紼嬪簭淇敼涓涓寚鍚戜竴涓猙uffer鐨勬寚閽堟椂銆?<br><br>3) 榪欐浠g爜鏈夌偣鍙樻併傝繖孌典唬鐮佺殑鐩殑鏄敤鏉ヨ繑鍥炴寚閽?ptr鎸囧悜鍊肩殑騫蟲柟錛屼絾鏄紝鐢變簬*ptr鎸囧悜涓涓獀olatile鍨嬪弬鏁幫紝緙栬瘧鍣ㄥ皢浜х敓綾諱技涓嬮潰鐨勪唬鐮侊細 <br><br>int square(volatile int *ptr) <br><br>{ <br><br>int a,b; <br><br>a = *ptr; <br><br>b = *ptr; <br><br>return a * b; <br><br>} <br><br>鐢變簬*ptr鐨勫煎彲鑳借鎰忔兂涓嶅埌鍦拌鍙橈紝鍥犳a鍜宐鍙兘鏄笉鍚岀殑銆傜粨鏋滐紝榪欐浠g爜鍙兘榪斾笉鏄綘鎵鏈熸湜鐨勫鉤鏂瑰鹼紒姝g‘鐨勪唬鐮佸涓嬶細 <br><br>long square(volatile int *ptr) <br><br>{ <br><br>int a; <br><br>a = *ptr; <br><br>return a * a; <br><br>} <br><br><br><br>鍏充簬volatile鍏抽敭瀛楀湪涓柇鍑芥暟涓殑褰卞搷瀹炰緥<br><br><br><br>涓插彛鍙戦佹暟鎹紝涓柇涓鍏舵嫻嬶紝褰撲腑鏂駭鐢熷悗錛岀疆鎺ユ敹鏍囧織錛屼富寰幆涓嫻嬫涓繪爣蹇楋紝鏈敤valotile淇グ鏃訛紝緙栬瘧緇撴灉濡備笅錛?br><br><br><br>[0xe59f41bc] ldr r4錛?x30203378 ; = #0x302096f0<br><br>0x302031b8 [0xe5d40000] ldrb r0錛孾r4錛?0]<br><br>while(!uart1_rxFlag); //uart1_rxFlag涓哄叏灞鍙橀噺錛屽湪涓插彛鎺ユ敹涓柇涓疆1<br><br>0x302031bc [0xe3500000] cmp r0錛?0<br><br>0x302031c0 [0x0afffffd] beq 0x302031bc; (Can_Int_Test + 0x17c)<br><br>鍗? 緙栬瘧鍣ㄥ鍏惰繘琛屼簡浼樺寲錛岃鍙栦竴嬈art1_rxFlag鐨勫間箣鍚庯紝灝嗗叾瀛樻斁鍦ㄥ瘎瀛樺櫒r0涓紝姣旇緝鍚庯紝鏉′歡涓嶆弧瓚籌紝緇х畫絳夊緟錛屼絾鏈噸鏂板彇瀛樺偍鍣ㄤ腑 uart1_rxFlag鐨勫鹼紝姝ゆ椂鍗充嬌涓柇鏈嶅姟鍑芥暟涓慨鏀逛簡uart1_rxFlag鐨勫鹼紝姣旇緝澶勪粛鐒朵笉鑳藉彂鐜幫紝灝卞嚭鐜頒簡鏃犺濡備綍紼嬪簭灝卞仠鍦ㄦ澶勭殑闂? 棰樸?br><br><br><br>// 鍔犱簡volatile鍏抽敭瀛楀悗錛岀紪璇戠殑緇撴灉<br><br>302031b4 ldr r4錛?x30203378 ; = #0x302096f0<br><br>while(uart1_rxFlag == 0);<br><br>302031b8 [0xe5d40000] ldrb r0錛孾r4錛?0]<br><br>302031bc [0xe3500000] cmp r0錛?0<br><br>302031c0 [0x0afffffc] beq 0x302031b8 ; (Can_Int_Test + 0x288)<br><br>娣誨姞浜嗗叧閿瓧鍚庯紝姣旇緝涓嶇瓑錛岃煩杞埌閲嶆柊鍙栧瓨鍌ㄥ櫒涓殑uart1_rxFlag錛屽洜姝や換浣曟椂鍊檜art1_rxFlag鐨勫奸兘鏄渶鏂扮殑銆?br><br>涓瀹氱▼搴︾殑浼樺寲錛屽幓鎺変簡璇誨彇uart1_rxFlag鍦板潃鐨勮鍙ャ?br><br><br><br>瀹? 涔変竴涓槗澶辨у彉閲忥紝緙栬瘧鍣ㄦ湁涓縐嶆妧鏈彨鏁版嵁嫻佸垎鏋愶紝鍒嗘瀽紼嬪簭涓殑鍙橀噺鍦ㄥ摢閲岃璧嬪箋佸湪鍝噷浣跨敤銆佸湪鍝噷澶辨晥錛屽垎鏋愮粨鏋滃彲浠ョ敤浜庡父閲忓悎騫訛紝甯擱噺浼犳挱絳変紭鍖栥? 褰撶紪璇戝櫒媯鏌ュ埌浠g爜娌℃湁淇敼瀛楁鐨勫鹼紝灝辨湁鍙兘鍦ㄤ綘璁塊棶瀛楁鏃舵彁渚涗笂嬈¤闂殑緙撳瓨鍊鹼紝榪欒兘澶熸彁楂樼▼搴忕殑鏁堢巼錛屼絾鏈夋椂榪欎簺浼樺寲浼氬甫鏉ラ棶棰橈紝涓嶆槸鎴戜滑紼嬪簭鎵闇 瑕佺殑錛岀壒鐐規槸瀵圭‖浠跺瘎瀛樺櫒鎿嶄綔鐨勭▼搴忥紝榪欐椂鍙互鐢╲olatile鍏抽敭瀛楃姝㈠仛榪欎簺浼樺寲銆?br><br><br><br>澶氫換鍔$幆澧冧笅鍚勪換鍔¢棿鍏變韓鐨勬爣蹇楀簲璇ュ姞voatile鍏抽敭瀛楋細鍦ㄥ綰跨▼璁塊棶鏌愬瓧孌墊椂錛屼唬鐮佸笇鏈涜繖浜涜闂兘澶熸搷浣滐紙璇誨彇錛夊埌瀛楁鐨勬渶鏂板鹼紝鍚屾椂鍐欏埌鍙橀噺鐨勬搷浣滆兘绔嬪嵆鏇存柊錛涘瀛楁鍔犱笂volatile鍏抽敭瀛楋紝閭d箞瀵硅瀛楁鐨勪換浣曡姹傦紙璇?鍐欙級閮戒細绔嬪埢寰楀埌鎵ц銆?br><br><br><br>9銆佷綅鎿嶄綔錛圔it manipulation錛?<br>宓屽叆寮忕郴緇熸繪槸瑕佺敤鎴峰鍙橀噺鎴栧瘎瀛樺櫒榪涜浣嶆搷浣溿傜粰瀹氫竴涓暣鍨嬪彉閲廰錛屽啓涓ゆ浠g爜錛岀涓涓緗產鐨刡it 3錛岀浜屼釜娓呴櫎a 鐨刡it 3銆傚湪浠ヤ笂涓や釜鎿嶄綔涓紝瑕佷繚鎸佸叾瀹冧綅涓嶅彉銆?瀵硅繖涓棶棰樻湁涓夌鍩烘湰鐨勫弽搴?<br><br>1)涓嶇煡閬撳浣曚笅鎵嬨傝琚潰鑰呬粠娌″仛榪囦換浣曞祵鍏ュ紡緋葷粺鐨勫伐浣溿?<br><br>2) 鐢╞it fields銆侭it fields鏄鎵斿埌C璇█姝昏鐨勪笢瑗匡紝瀹冧繚璇佷綘鐨勪唬鐮佸湪涓嶅悓緙栬瘧鍣ㄤ箣闂存槸涓嶅彲縐繪鐨勶紝鍚屾椂涔熶繚璇佷簡鐨勪綘鐨勪唬鐮佹槸涓嶅彲閲嶇敤鐨勩?br><br>3) 鐢?#defines 鍜?bit masks 鎿嶄綔銆傝繖鏄竴涓湁鏋侀珮鍙Щ妞嶆х殑鏂規硶錛屾槸搴旇琚敤鍒扮殑鏂規硶銆傛渶浣崇殑瑙e喅鏂規濡備笅錛?<br><br>#define BIT3 (0x1 << 3) 錛堥噰鐢ㄥ畯灝嗘暟瀛楀畾涔変負鏈夋剰涔夌殑BIT3錛屾槑紜紝涓嶆槗鍑洪敊錛屾敼璧鋒潵鏂逛究錛?br><br>static int a; <br><br>void set_bit3(void) <br><br>{ <br><br>a |= BIT3; <br><br>} <br><br>void clear_bit3(void) <br><br>{ <br><br>a &= ~BIT3; <br><br>} <br><br><br><br>涓 浜涗漢鍠滄涓鴻緗拰娓呴櫎鍊艱屽畾涔変竴涓帺鐮侊紙寰呮搷浣滀綅鍏?錛屽叾浣欎綅鍏?鐨勬暟錛屽浜庢煇涓剰涔夐潬澶氫綅鍚屾椂琛ㄧず鐨勬渶濂藉甫涓婃帺鐮侊紝闅旂鍏朵粬浣嶇殑褰卞搷錛夊悓鏃跺畾涔変竴浜涜鏄? 甯告暟錛岃繖涔熸槸鍙互鎺ュ彈鐨勩傛垜甯屾湜鐪嬪埌鍑犱釜瑕佺偣錛氳鏄庡父鏁般亅=鍜?amp;=~鎿嶄綔錛屽厛鍙栧弽鍐?amp;鏄鏌愪綅娓?鐨勬渶濂芥搷浣溿?<br><br><br><br>鑰冪偣錛?br><br>鍦ㄥ祵鍏ュ紡緋葷粺涓紝鏃跺埢瑕佸叧娉ㄧЩ妞嶆э紝鍏蜂綋鐨勭▼搴忎腑涓嶈鍑虹幇鍏蜂綋鐨勬暟瀛楋紝榪欎簺鏁板瓧閮藉簲璇efine鎴愭煇涓湁鎰忎箟鐨勭鍙鳳紝鍙鎬у彲縐繪鎬ч兘寰堝己錛屾瘮濡?br><br>#define BIT(x) (0x1 << (x))<br><br>X浣滀負鍙傛暟鍙互寰堟柟渚跨殑瀵逛換鎰忎綅榪涜鎿嶄綔錛屾剰涔夋槑紜紝鏇存敼鏇挎崲鏂逛究<br><br><br><br>10銆佽闂浐瀹氱殑鍐呭瓨浣嶇疆錛圓ccessing fixed memory locations錛?<br>宓屽叆寮忕郴緇熺粡甯稿叿鏈夎姹傜▼搴忓憳鍘昏闂煇鐗瑰畾鐨勫唴瀛樹綅緗殑鐗圭偣銆?<br><br>鍦? 鏌愬伐紼嬩腑錛岃姹傝緗竴緇濆鍦板潃涓?x67a9鐨勬暣鍨嬪彉閲忕殑鍊間負0xaa66銆傜紪璇戝櫒鏄竴涓函綺圭殑ANSI緙栬瘧鍣ㄣ傚啓浠g爜鍘誨畬鎴愯繖涓浠誨姟銆傝繖涓闂嫻嬭瘯浣犳槸 鍚︾煡閬撲負浜嗚闂竴緇濆鍦板潃鎶婁竴涓暣鍨嬫暟寮哄埗杞崲錛坱ypecast錛変負涓鎸囬拡鏄悎娉曠殑銆傝繖涓闂鐨勫疄鐜版柟寮忛殢鐫涓漢椋庢牸涓嶅悓鑰屼笉鍚屻傚吀鍨嬬殑綾諱技浠g爜濡備笅錛? <br><br>int *ptr; <br><br>ptr = (int *)0x67a9; <br><br>*ptr = 0xaa55; <br><br>A more obscure approach is: ( 涓涓緝鏅︽訂鐨勬柟娉曟槸)錛?<br><br>*(int * const)(0x67a9) = 0xaa55; <br><br>鍗充嬌浣犵殑鍝佸懗鏇存帴榪戠浜岀鏂規錛屼絾鎴戝緩璁綘鍦ㄩ潰璇曟椂浣跨敤絎竴縐嶆柟妗堛?<br><br><br><br>鍦ㄥ祵鍏ュ紡緋葷粺涓紝瀵逛簬澶ч噺姝ょ被鍨嬫暟鎹紜歡瀵勫瓨鍣ㄥ簲璇ラ噰鐢ㄥ涓嬫柟寮?br><br>typedef volatile unsigned int HARD_REG;<br><br>#define REG_NAME (*(HARD_REG *)ADDR)<br><br>鍗沖皢ADDR寮哄埗杞崲涓轟竴涓寚鍚慔ARD_REG綾誨瀷鏁版嵁鐨勬寚閽堬紝*HARD_REG涓簐olatile鐨勬棤絎﹀彿鏁村瀷鏁?br><br><br><br>11銆佷腑鏂紙Interrupts錛?<br>涓? 鏂槸宓屽叆寮忕郴緇熶腑閲嶈鐨勭粍鎴愰儴鍒嗭紝榪欏鑷翠簡寰堝緙栬瘧寮鍙戝晢鎻愪緵涓縐嶆墿灞?璁╂爣鍑咰鏀寔涓柇銆傚叾浠h〃浜嬪疄鏄紝浜х敓浜嗕竴涓柊鐨勫叧閿瓧 __interrupt錛?1鍗沖姝わ級銆備笅闈㈢殑浠g爜灝變嬌鐢ㄤ簡__interrupt鍏抽敭瀛楀幓瀹氫箟浜嗕竴涓腑鏂湇鍔″瓙紼嬪簭(ISR)錛岃璇勮涓涓嬭繖孌典唬鐮佺殑銆? <br><br>__interrupt double compute_area (double radius) <br><br>{ <br><br>double area = PI * radius * radius; <br><br>printf("\nArea = %f", area); <br><br>return area; <br><br>} <br><br>榪欎釜鍑芥暟鏈夊お澶氱殑閿欒浜嗭紝浠ヨ嚦璁╀漢涓嶇煡浠庝綍璇磋搗浜嗭紙鍓嶆彁鏄潪鎿嶄綔緋葷粺涓嬬殑涓柇鏈嶅姟鍑芥暟錛夛細 <br><br>1)ISR 涓嶈兘榪斿洖涓涓鹼紙閮藉簲璇ヤ負void綾誨瀷錛夈傚鏋滀綘涓嶆噦榪欎釜錛岄偅涔堜綘涓嶄細琚泧鐢ㄧ殑銆?<br><br>2)ISR 涓嶈兘浼犻掑弬鏁般傚鏋滀綘娌℃湁鐪嬪埌榪欎竴鐐癸紝浣犺闆囩敤鐨勬満浼氱瓑鍚岀涓欏廣?<br><br>3)鍦ㄨ澶氱殑澶勭悊鍣?緙栬瘧鍣ㄤ腑錛屾誕鐐逛竴鑸兘鏄笉鍙噸鍏ョ殑銆傛湁浜涘鐞嗗櫒/緙栬瘧鍣ㄩ渶瑕佽棰濆鐨勫瘎瀛樺櫒鍏ユ爤錛屾湁浜涘鐞嗗櫒/緙栬瘧鍣ㄥ氨鏄笉鍏佽鍦↖SR涓仛嫻偣榪愮畻銆傛澶栵紝ISR搴旇鏄煭鑰屾湁鏁堢巼鐨勶紝鍦↖SR涓仛嫻偣榪愮畻鏄笉鏄庢櫤鐨勩?<br><br>///////////////////////////////<br><br>鍙﹀涓柇鏈嶅姟紼嬪簭鏄繍琛屽湪鍐呮牳鎬佺殑錛坙inux錛夛紝鍐呮牳閫氬父鏄笉鏀寔嫻偣榪愮畻鐨勩?br><br><a target="_blank"><font color="#0000ff">http://access911.net/n/doc1.asp?mode=a&aid=4750647</font></a><br><br>鍐呮牳涓殑printk鍜屾爣鍑嗗簱鐨刾rintf涓嶄竴鏍鳳紝鍓嶈呭洜涓虹敱鍐呮牳鐩存帴瀹炵幇錛屼笉鑳芥敮鎸佹誕鐐廣?br><br>鍦紲linux鍐呮牳璁捐涓庡疄鐜幫紴鐨勭涓绔犱腑鍐呮牳寮鍙戠殑鐗圭偣涓灝忚妭閲屽氨鏈夋瘮杈冧簡鍐呮牳寮鍙戜笌搴旂敤寮鍙戠殑宸紓銆傚叾涓竴鐐瑰氨鏄唴鏍哥紪紼嬫椂嫻偣鏁扮殑闂錛屼功涓湁涓鍙ヨ瘽鏄細鍐呮牳緙栫▼鏃舵誕鐐規暟寰堥毦浣跨敤<br><br>鍥犱負娌℃湁嫻偣鍗曞厓,鍐呮牳瑕佹敮鎸佹誕鐐瑰繀欏繪妸鍐呮牳浠oft-float 鏂瑰紡閲嶆柊緙栬瘧,鍏惰繛鎺ユ墍鏈夌殑搴撲篃閮借鐢╯oft-float 鏂瑰紡緙栬瘧.<br><br>鍚﹀垯鍙﹀涓縐嶆柟寮忎嬌鐢ㄦ暣鏁板畾涔夋誕鐐圭被鍨嬪姞嫻偣棰勭畻搴撳畬鎴愪綘鐨勫伐浣?<br><br><br><br><a target="_blank"><font color="#0000ff">http://topic.csdn.net/u/20070417/16/a4b56569-228c-4b70-b5ab-30ee61c99a3d.html</font></a><br><br>濡傛灉浣犵殑鍐呮牳閲岀紪璇戣繘浜嗘誕鐐規敮鎸侊紝閭d箞鏄彲浠ョ殑銆傝涓嶅唴鏍告垨鏄ā鍧椾笉鑳界敤float鎴栨槸double鍐呭瀷鐨勫彉閲忔垨鍑芥暟<br><br><br><br>鍦ㄩ厤緗唴鏍哥殑鏃跺欐妸嫻偣妯℃嫙鍣ㄩ変笂錛屽簲璇ユ槸鍙互鏀寔鐨勶紝浣嗘槸閫熷害闈炲父鎱€?<br>鎴戞浘緇忛亣鍒拌繃錛岀‖浠舵槑鏄庢敮鎸佹誕鐐硅繍綆楃殑FPU錛屼絾鏄紪璇戝唴鏍哥殑鏃跺欓変笂浜嗘誕鐐規ā鎷熷櫒錛岀粨鏋滄墍鏈夌殑搴旂敤紼嬪簭鐨勬誕鐐硅繍綆楅熷害閮介潪甯告參銆傛墍浠ユ垜鎬鐤戣鏀寔嫻偣鍙緙栬瘧鍐呮牳鐨勬椂鍊欓変笂錛屽浜庡簲鐢ㄧ▼搴忎笉闇瑕佹庝箞鍏沖績銆?br><br>///////////////////////////////<br><br><br><br>4) 涓庣涓夌偣涓鑴夌浉鎵匡紝printf()緇忓父鏈夐噸鍏ュ拰鎬ц兘涓婄殑闂銆傚鏋滀綘涓㈡帀浜嗙涓夊拰絎洓鐐癸紝鎴戜笉浼氬お涓洪毦浣犵殑銆備笉鐢ㄨ錛屽鏋滀綘鑳藉緱鍒板悗涓ょ偣錛岄偅涔堜綘鐨勮闆囩敤鍓嶆櫙瓚婃潵瓚婂厜鏄庝簡銆?<br><br><br><br>12銆佺鍙鋒墿灞曠殑浠g爜渚嬪瓙錛圕ode examples錛?<br>涓嬮潰鐨勪唬鐮佽緭鍑烘槸浠涔堬紝涓轟粈涔堬紵 <br><br>void foo(void) <br><br>{ <br><br>unsigned int a = 6; <br><br>int b = -20; <br><br>(a+b > 6) ? puts("> 6") : puts("<= 6"); <br><br>} <br><br>Vc6.0嫻嬭瘯鎯呭喌<br><br>void main(void)<br><br>{<br><br>unsigned int a = 6; <br><br>int b = -20; <br><br>printf("unsigned int a + int b = %x\n", (a + b));<br><br><br><br>}<br><br>/*unsigned int a + int b = fffffff2*/<br><br>榪? 涓棶棰樻祴璇曚綘鏄惁鎳傚緱C璇█涓殑鏁存暟鑷姩杞崲鍘熷垯錛屾垜鍙戠幇鏈変簺寮鍙戣呮噦寰楁瀬灝戣繖浜涗笢瑗褲備笉綆″浣曪紝榪欐棤絎﹀彿鏁村瀷闂鐨勭瓟妗堟槸杈撳嚭鏄? ">6"銆傚師鍥犳槸褰撹〃杈懼紡涓瓨鍦ㄦ湁絎﹀彿綾誨瀷鍜屾棤絎﹀彿綾誨瀷鏃舵墍鏈夌殑鎿嶄綔鏁伴兘鑷姩杞崲涓烘棤絎﹀彿綾誨瀷銆傚洜姝?20鍙樻垚浜嗕竴涓潪甯稿ぇ鐨勬鏁存暟錛屾墍浠ヨ琛ㄨ揪寮? 璁$畻鍑虹殑緇撴灉澶т簬6銆傝繖涓鐐瑰浜庨綣佺敤鍒版棤絎﹀彿鏁版嵁綾誨瀷鐨勫祵鍏ュ紡緋葷粺錛堢‖浠跺瘎瀛樺櫒鐨勫煎叏閮ㄦ槸鏃犵鍙風殑錛夋潵璇存槸涓板父閲嶈鐨勩傚鏋滀綘絳旈敊浜嗚繖涓棶棰橈紝浣犱篃灝卞埌 浜嗗緱涓嶅埌榪欎喚宸ヤ綔鐨勮竟緙樸?<br><br><br><br>13銆佸鐞嗗櫒瀛楅暱瀵艱嚧鐨勬暟鎹墿灞曢棶棰?br>璇勪環涓嬮潰鐨勪唬鐮佺墖鏂細 <br><br>unsigned int zero = 0; <br><br>unsigned int compzero = 0xFFFF; <br><br>/*1's complement of zero */ 0鐨勮ˉ鐮佷負鍏?鐨勬暟<br><br>瀵逛簬涓涓猧nt鍨嬩笉鏄?6浣嶇殑澶勭悊鍣ㄤ負璇達紝涓婇潰鐨勪唬鐮佹槸涓嶆紜殑銆傚簲緙栧啓濡備笅錛?<br><br>unsigned int compzero = ~0; <br><br>榪欎竴闂鐪熸鑳芥彮闇插嚭搴旇瘯鑰呮槸鍚︽噦寰楀鐞嗗櫒瀛楅暱鐨勯噸瑕佹э紙宓屽叆寮忓鉤鍙板彲鑳芥槸8銆?6銆?2鐨勶紝縐繪鐨勮搴︽潵璇村啓鍑哄浐瀹氱殑0xFFFF鏄笉瀵圭殑錛夈傚湪鎴戠殑緇忛獙閲岋紝濂界殑宓屽叆寮忕▼搴忓憳闈炲父鍑嗙‘鍦版槑鐧界‖浠剁殑緇嗚妭鍜屽畠鐨勫眬闄愶紝鐒惰孭C鏈虹▼搴忓線寰鎶婄‖浠朵綔涓轟竴涓棤娉曢伩鍏嶇殑鐑︽伡銆?<br><br><br><br>鍒? 浜嗚繖涓樁孌碉紝搴旇瘯鑰呮垨鑰呭畬鍏ㄥ瀭澶翠撫姘斾簡鎴栬呬俊蹇冩弧婊″織鍦ㄥ繀寰椼傚鏋滄樉鐒跺簲璇曡呬笉鏄緢濂斤紝閭d箞榪欎釜嫻嬭瘯灝卞湪榪欓噷緇撴潫浜嗐備絾濡傛灉鏄劇劧搴旇瘯鑰呭仛寰椾笉閿欙紝閭d箞鎴戝氨 鎵斿嚭涓嬮潰鐨勮拷鍔犻棶棰橈紝榪欎簺闂鏄瘮杈冮毦鐨勶紝鎴戞兂浠呬粎闈炲父浼樼鐨勫簲璇曡呰兘鍋氬緱涓嶉敊銆傛彁鍑鴻繖浜涢棶棰橈紝鎴戝笇鏈涙洿澶氱湅鍒板簲璇曡呭簲浠橀棶棰樼殑鏂規硶錛堝緢閲嶈鍝︼紝闈㈣瘯鑰呭叧 娉ㄧ殑鏄綘鎬濊冮棶棰樿В鍐抽棶棰樼殑榪囩▼錛屽綋浣犱笉鐭ラ亾絳旀鏃跺崈涓囧崈涓囦笉瑕佺寽涓涓瓟妗堢粰浠栵紝鍥犱負鐜板湪涓嶆槸閫夋嫨棰橈紝闈㈣瘯瀹樿鐨勬槸榪囩▼錛屼綘鍙渶瑕佸皢浣犺冭檻闂鐨勮繃紼嬭鏄? 鐧藉氨OK浜嗭級錛岃屼笉鏄瓟妗堛備笉綆″浣曪紝浣犲氨褰撴槸榪欎釜濞變箰鍚?.. <br><br><br><br>14銆佸姩鎬佸唴瀛樺垎閰嶏紙Dynamic memory allocation錛?<br>灝? 綆′笉鍍忛潪宓屽叆寮忚綆楁満閭d箞甯歌錛屽祵鍏ュ紡緋葷粺榪樻槸鏈変粠鍫嗭紙heap錛変腑鍔ㄦ佸垎閰嶅唴瀛樼殑榪囩▼鐨勩傞偅涔堝祵鍏ュ紡緋葷粺涓紝鍔ㄦ佸垎閰嶅唴瀛樺彲鑳藉彂鐢熺殑闂鏄粈涔堬紵榪欓噷錛? 鎴戞湡鏈涘簲璇曡呰兘鎻愬埌鍐呭瓨紕庣墖錛岀鐗囨敹闆嗙殑闂錛屽彉閲忕殑鎸佽鏃墮棿絳夌瓑銆傝繖涓富棰樺凡緇忓湪ESP鏉傚織涓騫挎硾鍦拌璁鴻繃浜嗭紙涓昏鏄?P.J. Plauger, 浠栫殑瑙i噴榪滆繙瓚呰繃鎴戣繖閲岃兘鎻愬埌鐨勪換浣曡В閲婏級錛屾墍鏈夊洖榪囧ご鐪嬩竴涓嬭繖浜涙潅蹇楀惂錛佽搴旇瘯鑰呰繘鍏ヤ竴縐嶈櫄鍋囩殑瀹夊叏鎰熻鍚庯紝鎴戞嬁鍑鴻繖涔堜竴涓皬鑺傜洰錛氫笅闈㈢殑浠g爜鐗囨鐨勮緭 鍑烘槸浠涔堬紝涓轟粈涔堬紵 <br><br>char *ptr; <br><br>if ((ptr = (char *)malloc(0)) == NULL) <br><br>puts("Got a null pointer"); <br><br>else <br><br>puts("Got a valid pointer"); <br><br>榪? 鏄竴涓湁瓚g殑闂銆傛渶榪戝湪鎴戠殑涓涓悓浜嬩笉緇忔剰鎶?鍊間紶緇欎簡鍑芥暟malloc錛屽緱鍒頒簡涓涓悎娉曠殑鎸囬拡涔嬪悗錛屾垜鎵嶆兂鍒拌繖涓棶棰樸傝繖灝辨槸涓婇潰鐨勪唬鐮侊紝璇ヤ唬鐮佺殑杈? 鍑烘槸"Got a valid pointer"銆傛垜鐢ㄨ繖涓潵寮濮嬭璁鴻繖鏍風殑涓闂錛岀湅鐪嬭闈㈣瘯鑰呮槸鍚︽兂鍒板簱渚嬬▼榪欐牱鍋氭槸姝g‘錛堝洜涓哄鏋滅敵璇峰け璐ワ紝鍒欑▼搴忓鐞嗚涓哄唴瀛樹笉瓚充簡錛屼竴鑸細緇堟 紼嬪簭錛屾槸寰堜弗閲嶇殑闂錛燂級銆傚緱鍒版紜殑絳旀鍥虹劧閲嶈錛屼絾瑙e喅闂鐨勬柟娉曞拰浣犲仛鍐沖畾鐨勫熀鏈師鐞嗘洿閲嶈浜涖?<br><br>榪斿洖涓鍊嬫帶鎸囬嚌閭勬槸鎸囧悜 0 瀛楃瘈鐨勬寚閲濈敋鑷蟲寚鍚戜竴涓彲浠ユ搷浣滅殑鎸囬拡錛?br><br>錛堝彇鍐充簬緋葷粺騫沖彴鐨勫疄鐜幫紝C99鍙婂叾浠栨爣鍑嗚瀹氬彲浠ヤ笉鍚岀殑錛?br><br>malloc(0) in glibc returns a valid pointer to something(!?!?) while in uClibc calling malloc(0) returns a NULL. The behavior of malloc(0) is listed as implementation-defined by SuSv3, so both libraries are equally correct. This difference also applies to realloc(NULL, 0). I personally feel glibc's behavior is not particularly safe. To enable glibc behavior, one has to explicitly enable the MALLOC_GLIBC_COMPAT option.<br><br><br><br>15銆佺敤Typedef鏋勯犲鍚堢被鍨?<br>鍦–璇█涓綣佺敤浠ュ0鏄庝竴涓凡緇忓瓨鍦ㄧ殑鏁版嵁綾誨瀷鐨勫悓涔夊瓧銆備篃鍙互鐢ㄩ澶勭悊鍣ㄥ仛綾諱技鐨勪簨銆備緥濡傦紝鎬濊冧竴涓嬩笅闈㈢殑渚嬪瓙錛?<br><br>#define dPS struct s * <br><br>typedef struct s * tPS; <br><br>浠ヤ笂涓ょ鎯呭喌鐨勬剰鍥鵑兘鏄瀹氫箟dPS 鍜?tPS 浣滀負涓涓寚鍚戠粨鏋剆鎸囬拡銆傚摢縐嶆柟娉曟洿濂藉憿錛燂紙濡傛灉鏈夌殑璇濓級涓轟粈涔堬紵 <br><br>榪欐槸涓涓潪甯稿井濡欑殑闂錛屼換浣曚漢絳斿榪欎釜闂錛堟褰撶殑鍘熷洜鍝︼紝鑰屼笉鏄寽錛屽鏋滀綘娌℃湁鍘熷洜錛岃涓嶄細姣旂寽涓涓瓟妗堣濂界殑澶氾紝璁頒綇鍟婏紝璇磋瘽鏄璁叉牴鎹殑錛夋槸搴斿綋琚伃鍠滅殑銆傜瓟妗堟槸錛歵ypedef鏇村ソ銆傛濊冧笅闈㈢殑渚嬪瓙錛?<br><br>dPS p1,p2; <br><br>tPS p3,p4; <br><br>絎竴涓墿灞曚負 <br><br>struct s * p1, p2; <br><br>涓婇潰鐨勪唬鐮佸畾涔塸1涓轟竴涓寚鍚戠粨鏋勭殑鎸囷紝p2涓轟竴涓疄闄呯殑緇撴瀯錛岃繖涔熻涓嶆槸浣犳兂瑕佺殑銆傜浜屼釜渚嬪瓙姝g‘鍦板畾涔変簡p3 鍜宲4 涓や釜鎸囬拡銆?<br><br><br><br>16銆佹櫐娑╃殑璇硶鍙婁唬鐮侀鏍?<br>C璇█鍚屾剰涓浜涗護浜洪渿鎯婄殑緇撴瀯,涓嬮潰鐨勭粨鏋勬槸鍚堟硶鐨勫悧錛屽鏋滄槸瀹冨仛浜涗粈涔堬紵 <br><br>int a = 5, b = 7, c; <br><br>c = a+++b; <br><br>榪欎釜闂灝嗗仛涓鴻繖涓祴楠岀殑涓涓剦蹇殑緇撳熬銆備笉綆′綘鐩鎬笉鐩鎬俊錛屼笂闈㈢殑渚嬪瓙鏄畬鍏ㄥ悎涔庤娉曠殑銆傞棶棰樻槸緙栬瘧鍣ㄥ浣曞鐞嗗畠錛熸按騫充笉楂樼殑緙栬瘧浣滆呭疄闄呬笂浼氫簤璁鴻繖涓棶棰橈紝緙栬瘧鍣ㄥ簲灝藉彲鑳藉鐨勪粠宸﹁嚦鍙沖皢鑻ュ共涓瓧絎︾粍鎴愪竴涓繍綆楃銆傚洜姝わ紝涓婇潰鐨勪唬鐮佽澶勭悊鎴愶細c = a++ + b; <br><br>閫楀彿琛ㄨ揪寮忎緷嬈″姣忎釜琛ㄨ揪寮忚綆楋紝鏈鍚庣殑緇撴灉涓烘渶鍚庝竴涓〃杈懼紡鐨勫?br><br>鍥犳, 榪欐浠g爜鎵ц鍚巃 = 6, b = 7, c = 12銆?<br><br>濡傛灉浣犵煡閬撶瓟妗堬紝鎴栫寽鍑烘紜瓟妗堬紝鍋氬緱濂姐傚鏋滀綘涓嶇煡閬撶瓟妗堬紝鎴戜篃涓嶆妸榪欎釜褰撲綔闂銆傛垜鍙戠幇榪欎釜闂鐨勬渶澶уソ澶勬槸榪欐槸涓涓叧浜庝唬鐮佺紪鍐欓鏍鹼紙瑕佹槑紜殑鍔犱笂鎷彿錛岄伩鍏嶆涔夋垨鑰呯紪璇戝櫒涓嶅悓甯︽潵鐨勫樊寮傦級錛屼唬鐮佺殑鍙鎬э紝浠g爜鐨勫彲淇敼鎬х殑濂界殑璇濋銆?<br><br><br><br>娉細寮曞嚭浠g爜椋庢牸鐨勯棶棰樻鏄綔鑰呴棶姝ら棶棰樼殑鐩殑錛岃繖鍛婅瘔鎴戜滑瑕佹彛鎽╅潰璇曠姣忎釜闂鑳屽悗闅愯棌鐨勮冩煡鐐癸紝鑳藉瓚佹満鍙戞尌涓嬪氨澶у姛鍛婃垚浜嗭紒<br><br><br><br>濂戒簡錛屼紮璁′滑錛屼綘鐜板湪宸茬粡鍋氬畬鎵鏈夌殑嫻嬭瘯浜嗐傝繖灝辨槸鎴戝嚭鐨凜璇█嫻嬭瘯棰橈紝鎴戞鐫鎰夊揩鐨勫績鎯呭啓瀹屽畠錛屽笇鏈涗綘浠ュ悓鏍風殑蹇冩儏璇誨畬瀹冦傚鏋滄槸璁や負榪欐槸涓涓ソ鐨勬祴璇曪紝閭d箞灝介噺閮界敤鍒頒綘鐨勬壘宸ヤ綔鐨勮繃紼嬩腑鍘誨惂銆傚ぉ鐭ラ亾涔熻榪囦釜涓涓ゅ勾錛屾垜灝變笉鍋氱幇鍦ㄧ殑宸ヤ綔錛屼篃闇瑕佹壘涓涓?<br><br><br><br>浠ヤ笅涓轟笂榪?6涓棶棰樼殑鑻辨枃琛ㄨ堪錛岀啛鎮変笅鐩稿叧鐨勪笓涓氳瘝姹囧浜庤嫳鏂囬潰璇曠殑綆鍗曡〃榪板緢閲嶈銆?br><br><a target="_blank"><font color="#0000ff">http://www.yuanma.org/data/2007/0509/article_2585.htm</font></a><br><br>An obligatory and significant part of the recruitment process for embedded systems programmers seems to be the "C test." Over the years, I have had to both take and prepare such tests and, in doing so, have realized that these tests can be informative for both the interviewer and interviewee. Furthermore, when given outside the pressure of an interview situation, these tests can also be quite entertaining. <br><br>From the interviewee's perspective, you can learn a lot about the person who has written or administered the test. Is the test designed to show off the writer's knowledge of the minutiae of the ANSI standard rather than to test practical know-how? Does it test ludicrous knowledge, such as the ASCII values of certain characters? Are the questions heavily slanted towards your knowledge of system calls and memory allocation strategies, indicating that the writer may spend his time programming computers instead of embedded systems? If any of these are true, then I know I would seriously doubt whether I want the job in question. <br><br>From the interviewer's perspective, a test can reveal several things about the candidate. Primarily, you can determine the level of the candidate's knowledge of C. However, it's also interesting to see how the person responds to questions to which they don't know the answers. Do they make intelligent choices backed up with good intuition, or do they just guess? Are they defensive when they are stumped, or do they exhibit a real curiosity about the problem and see it as an opportunity to learn something? I find this information as useful as their raw performance on the test. <br><br>With these ideas in mind, I have attempted to construct a test that is heavily slanted towards the requirements of embedded systems. This is a lousy test to give to someone seeking a job writing compilers! The questions are almost all drawn from situations I have encountered over the years. Some of them are tough; however, they should all be informative. <br><br>This test may be given to a wide range of candidates. Most entry-level applicants will do poorly on this test, while seasoned veterans should do very well. Points are not assigned to each question, as this tends to arbitrarily weight certain questions. However, if you choose to adapt this test for your own uses, feel free to assign scores. <br><br><br><br>Preprocessor <br>1. Using the #define statement, how would you declare a manifest constant that returns the number of seconds in a year? Disregard leap years in your answer. <br><br>#define SECONDS_PER_YEAR <br><br>(60 * 60 * 24 * 365)UL<br><br><br><br>I'm looking for several things here: <br><br>Basic knowledge of the #define syntax (for example, no semi-colon at the end, the need to parenthesize, and so on) <br><br>An understanding that the pre-processor will evaluate constant expressions for you. Thus, it is clearer, and penalty-free, to spell out how you are calculating the number of seconds in a year, rather than actually doing the calculation yourself <br><br>A realization that the expression will overflow an integer argument on a 16-bit machine-hence the need for the L, telling the compiler to treat the variable as a Long <br><br>As a bonus, if you modified the expression with a UL (indicating unsigned long), then you are off to a great start. And remember, first impressions count! <br><br><br><br>2. Write the "standard" MIN macro-that is, a macro that takes two arguments and returns the smaller of the two arguments. <br><br>#define MIN(A,B) <br><br>((A) <br><br>< <br><br>= (B) ? (A) : (B))<br><br><br><br>The purpose of this question is to test the following: <br><br>Basic knowledge of the #define directive as used in macros. This is important because until the inline operator becomes part of standard C, macros are the only portable way of generating inline code. Inline code is often necessary in embedded systems in order to achieve the required performance level <br><br>Knowledge of the ternary conditional operator. This operator exists in C because it allows the compiler to produce more optimal code than an if-then-else sequence. Given that performance is normally an issue in embedded systems, knowledge and use of this construct is important <br><br>Understanding of the need to very carefully parenthesize arguments to macros <br><br>I also use this question to start a discussion on the side effects of macros, for example, what happens when you write code such as: <br><br>least = MIN(*p++, b);<br><br><br><br>3. What is the purpose of the preprocessor directive #error? <br><br>Either you know the answer to this, or you don't. If you don't, see Reference 1. This question is useful for differentiating between normal folks and the nerds. Only the nerds actually read the appendices of C textbooks to find out about such things. Of course, if you aren't looking for a nerd, the candidate better hope she doesn't know the answer. <br><br><br><br>Infinite loops <br>4. Infinite loops often arise in embedded systems. How does you code an infinite loop in C? <br><br>There are several solutions to this question. My preferred solution is: <br><br>while(1)<br><br>{<br><br>?<br><br>}<br><br><br><br>Many programmers seem to prefer: <br><br>for(;;)<br><br>{<br><br>?<br><br>}<br><br><br><br>This construct puzzles me because the syntax doesn't exactly spell out what's going on. Thus, if a candidate gives this as a solution, I'll use it as an opportunity to explore their rationale for doing so. If their answer is basically, "I was taught to do it this way and I haven't thought about it since," it tells me something (bad) about them. <br><br>A third solution is to use a goto : <br><br><br><br>Loop:<br><br>...<br><br>goto Loop;<br><br><br><br><br><br><br><br>Candidates who propose this are either assembly language programmers (which is probably good), or else they are closet BASIC/FORTRAN programmers looking to get into a new field. <br><br><br><br>Data declarations <br>5. Using the variable a, give definitions for the following: <br>a) An integer <br>b) A pointer to an integer <br>c) A pointer to a pointer to an integer <br>d) An array of 10 integers <br>e) An array of 10 pointers to integers <br>f) A pointer to an array of 10 integers <br>g) A pointer to a function that takes an integer as an argument and returns an integer <br>h) An array of ten pointers to functions that take an integer argument and return an integer <br><br>The answers are: <br>a) int a; // An integer <br>b) int *a; // A pointer to an integer <br>c) int **a; // A pointer to a pointer to an integer <br>d) int a[10]; // An array of 10 integers <br>e) int *a[10]; // An array of 10 pointers to integers <br>f) int (*a)[10]; // A pointer to an array of 10 integers <br>g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer <br>h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer <br><br>People often claim that a couple of these are the sorts of thing that one looks up in textbooks-and I agree. While writing this article, I consulted textbooks to ensure the syntax was correct. However, I expect to be asked this question (or something close to it) when I'm being interviewed. Consequently, I make sure I know the answers, at least for the few hours of the interview. Candidates who don't know all the answers (or at least most of them) are simply unprepared for the interview. If they can't be prepared for the interview, what will they be prepared for? <br><br><br><br>Static <br>6. What are the uses of the keyword static? <br><br>This simple question is rarely answered completely. Static has three distinct uses in C: <br><br>A variable declared static within the body of a function maintains its value between function invocations <br><br>A variable declared static within a module, (but outside the body of a function) is accessible by all functions within that module. It is not accessible by functions within any other module. That is, it is a localized global <br><br>Functions declared static within a module may only be called by other functions within that module. That is, the scope of the function is localized to the module within which it is declared <br><br>Most candidates get the first part correct. A reasonable number get the second part correct, while a pitiful number understand the third answer. This is a serious weakness in a candidate, since he obviously doesn't understand the importance and benefits of localizing the scope of both data and code. <br><br>Const <br><br><br>7. What does the keyword const mean? <br><br>As soon as the interviewee says "const means constant," I know I'm dealing with an amateur. Dan Saks has exhaustively covered const in the last year, such that every reader of ESP should be extremely familiar with what const can and cannot do for you. If you haven't been reading that column, suffice it to say that const means "read-only." Although this answer doesn't really do the subject justice, I'd accept it as a correct answer. (If you want the detailed answer, read Saks' columns-carefully!) <br><br>If the candidate gets the answer correct, I'll ask him these supplemental questions: <br><br>What do the following declarations mean? <br><br><br><br>const int a;<br><br>int const a;<br><br>const int *a;<br><br>int * const a;<br><br>int const * a const;<br><br><br><br>The first two mean the same thing, namely a is a const (read-only) integer. The third means a is a pointer to a const integer (that is, the integer isn't modifiable, but the pointer is). The fourth declares a to be a const pointer to an integer (that is, the integer pointed to by a is modifiable, but the pointer is not). The final declaration declares a to be a const pointer to a const integer (that is, neither the integer pointed to by a, nor the pointer itself may be modified). If the candidate correctly answers these questions, I'll be impressed. Incidentally, you might wonder why I put so much emphasis on const, since it is easy to write a correctly functioning program without ever using it. I have several reasons: <br><br>The use of const conveys some very useful information to someone reading your code. In effect, declaring a parameter const tells the user about its intended usage. If you spend a lot of time cleaning up the mess left by other people, you'll quickly learn to appreciate this extra piece of information. (Of course, programmers who use const , rarely leave a mess for others to clean up.) <br><br>const has the potential for generating tighter code by giving the optimizer some additional information <br><br>Code that uses const liberally is inherently protected by the compiler against inadvertent coding constructs that result in parameters being changed that should not be. In short, they tend to have fewer bugs <br><br><br><br>Volatile <br>8. What does the keyword volatile mean? Give three different examples of its use. <br><br>A volatile variable is one that can change unexpectedly. Consequently, the compiler can make no assumptions about the value of the variable. In particular, the optimizer must be careful to reload the variable every time it is used instead of holding a copy in a register. Examples of volatile variables are: <br><br>Hardware registers in peripherals (for example, status registers) <br><br>Non-automatic variables referenced within an interrupt service routine <br><br>Variables shared by multiple tasks in a multi-threaded application <br><br>Candidates who don't know the answer to this question aren't hired. I consider this the most fundamental question that distinguishes between a C programmer and an embedded systems programmer. Embedded folks deal with hardware, interrupts, RTOSes, and the like. All of these require volatile variables. Failure to understand the concept of volatile will lead to disaster. <br><br>On the (dubious) assumption that the interviewee gets this question correct, I like to probe a little deeper to see if they really understand the full significance of volatile . In particular, I'll ask them the following additional questions: <br><br>Can a parameter be both const and volatile ? Explain. <br><br>Can a pointer be volatile ? Explain. <br><br>What's wrong with the following function?: <br><br><br><br>int square(volatile int *ptr)<br><br>{<br><br>return *ptr * *ptr;<br><br>}<br><br><br><br>The answers are as follows: <br><br>Yes. An example is a read-only status register. It is volatile because it can change unexpectedly. It is const because the program should not attempt to modify it <br><br>Yes, although this is not very common. An example is when an interrupt service routine modifies a pointer to a buffer <br><br>This one is wicked. The intent of the code is to return the square of the value pointed to by *ptr . However, since *ptr points to a volatile parameter, the compiler will generate code that looks something like this: <br><br><br><br>int square(volatile int *ptr) <br><br>{<br><br>int a,b;<br><br>a = *ptr;<br><br>b = *ptr;<br><br>return a * b;<br><br>}<br><br><br><br>Because it's possible for the value of *ptr to change unexpectedly, it is possible for a and b to be different. Consequently, this code could return a number that is not a square! The correct way to code this is: <br><br><br><br>long square(volatile int *ptr) <br><br>{<br><br>int a;<br><br>a = *ptr;<br><br>return a * a;<br><br>}<br><br><br><br>Bit manipulation <br>9. Embedded systems always require the user to manipulate bits in registers or variables. Given an integer variable a, write two code fragments. The first should set bit 3 of a. The second should clear bit 3 of a. In both cases, the remaining bits should be unmodified. <br><br>These are the three basic responses to this question: <br><br>No idea. The interviewee cannot have done any embedded systems work <br><br>Use bit fields. Bit fields are right up there with trigraphs as the most brain-dead portion of C. Bit fields are inherently non-portable across compilers, and as such guarantee that your code is not reusable. I recently had the misfortune to look at a driver written by Infineon for one of their more complex communications chips. It used bit fields and was completely useless because my compiler implemented the bit fields the other way around. The moral: never let a non-embedded person anywhere near a real piece of hardware! <br><br>Use #defines and bit masks. This is a highly portable method and is the one that should be used. My optimal solution to this problem would be: <br><br><br><br>#define BIT3 (0x1 << 3)<br><br>static int a;<br><br>void set_bit3(void) {<br><br>a |= BIT3;<br><br>}<br><br>void clear_bit3(void) {<br><br>a &= ~BIT3;<br><br>}<br><br><br><br>Some people prefer to define a mask together with manifest constants for the set and clear values. This is also acceptable. The element that I'm looking for is the use of manifest constants, together with the |= and &= ~ constructs <br><br><br><br>Accessing fixed memory locations <br>10. Embedded systems are often characterized by requiring the programmer to access a specific memory location. On a certain project it is required to set an integer variable at the absolute address 0x67a9 to the value 0xaa55. The compiler is a pure ANSI compiler. Write code to accomplish this task. <br><br>This problem tests whether you know that it is legal to typecast an integer to a pointer in order to access an absolute location. The exact syntax varies depending upon one's style. However, I would typically be looking for something like this: <br><br><br><br>int *ptr;<br><br>ptr = (int *)0x67a9;<br><br>*ptr = 0xaa55;<br><br><br><br>A more obscure approach is: <br><br><br><br>*(int * const)(0x67a9) = 0xaa55;<br><br><br><br>Even if your taste runs more to the second solution, I suggest the first solution when you are in an interview situation. <br><br><br><br>Interrupts <br>11. Interrupts are an important part of embedded systems. Consequently, many compiler vendors offer an extension to standard C to support interrupts. Typically, this new keyword is __interrupt. The following code uses __interrupt to define an interrupt service routine (ISR). Comment on the code. <br><br><br><br>__interrupt double compute_area<br><br>(double<br><br>radius) <br><br>{<br><br>double area = PI * radius * <br><br>radius;<br><br>printf("\nArea = %f", area);<br><br>return area;<br><br>}<br><br><br><br>This function has so much wrong with it, it's hard to know where to start: <br><br>ISRs cannot return a value. If you don't understand this, you aren't hired <br><br>ISRs cannot be passed parameters. See the first item for your employment prospects if you missed this <br><br>On many processors/compilers, floating-point operations are not necessarily re-entrant. In some cases one needs to stack additional registers. In other cases, one simply cannot do floating point in an ISR. Furthermore, given that a general rule of thumb is that ISRs should be short and sweet, one wonders about the wisdom of doing floating-point math here <br><br>In a vein similar to the third point, printf() often has problems with reentrancy and performance. If you missed points three and four, I wouldn't be too hard on you. Needless to say, if you got these last two points, your employment prospects are looking better and better <br><br><br><br>Code examples <br>12. What does the following code output and why? <br><br>void foo(void)<br><br>{<br><br>unsigned int a = 6;<br><br>int b = -20;<br><br>(a+b > 6) ? puts("> 6") : <br><br>puts("<br><br>< <br><br>= 6");<br><br>}<br><br><br><br>This question tests whether you understand the integer promotion rules in C-an area that I find is very poorly understood by many developers. Anyway, the answer is that this outputs "> 6." The reason for this is that expressions involving signed and unsigned types have all operands promoted to unsigned types. Thus ?20 becomes a very large positive integer and the expression evaluates to greater than 6. This is a very important point in embedded systems where unsigned data types should be used frequently (see Reference 2). If you get this one wrong, you are perilously close to not getting the job. <br><br><br><br>13. Comment on the following code fragment. <br><br>unsigned int zero = 0;<br><br>unsigned int compzero = 0xFFFF; <br><br>/*1's complement of zero */<br><br><br><br>On machines where an int is not 16 bits, this will be incorrect. It should be coded: <br><br>unsigned int compzero = ~0;<br><br><br><br>This question really gets to whether the candidate understands the importance of word length on a computer. In my experience, good embedded programmers are critically aware of the underlying hardware and its limitations, whereas computer programmers tend to dismiss the hardware as a necessary annoyance. <br><br>By this stage, candidates are either completely demoralized-or they're on a roll and having a good time. If it's obvious that the candidate isn't very good, then the test is terminated at this point. However, if the candidate is doing well, then I throw in these supplemental questions. These questions are hard, and I expect that only the very best candidates will do well on them. In posing these questions, I'm looking more at the way the candidate tackles the problems, rather than the answers. Anyway, have fun... <br><br><br><br>Dynamic memory allocation <br>14. Although not as common as in non-embedded computers, embedded systems do still dynamically allocate memory from the heap. What are the problems with dynamic memory allocation in embedded systems? <br><br>Here, I expect the user to mention memory fragmentation, problems with garbage collection, variable execution time, and so on. This topic has been covered extensively in ESP , mainly by P.J. Plauger. His explanations are far more insightful than anything I could offer here, so go and read those back issues! Having lulled the candidate into a sense of false security, I then offer up this tidbit: <br><br>What does the following code fragment output and why? <br><br><br><br>char *ptr;<br><br>if ((ptr = (char *)malloc(0)) == <br><br>NULL) <br><br>else<br><br>puts("Got a null pointer");<br><br>puts("Got a valid pointer");<br><br><br><br>This is a fun question. I stumbled across this only recently when a colleague of mine inadvertently passed a value of 0 to malloc and got back a valid pointer! That is, the above code will output "Got a valid pointer." I use this to start a discussion on whether the interviewee thinks this is the correct thing for the library routine to do. Getting the right answer here is not nearly as important as the way you approach the problem and the rationale for your decision. <br><br><br><br>Typedef <br>15. Typedef is frequently used in C to declare synonyms for pre-existing data types. It is also possible to use the preprocessor to do something similar. For instance, consider the following code fragment: <br><br><br><br>#define dPS struct s *<br><br>typedef struct s * tPS;<br><br><br><br>The intent in both cases is to define dPS and tPS to be pointers to structure s. Which method, if any, is preferred and why? <br><br>This is a very subtle question, and anyone who gets it right (for the right reason) is to be congratulated or condemned ("get a life" springs to mind). The answer is the typedef is preferred. Consider the declarations: <br><br>dPS p1,p2;<br><br>tPS p3,p4;<br><br><br><br>The first expands to: <br><br>struct s * p1, p2;<br><br><br><br>which defines p1 to be a pointer to the structure and p2 to be an actual structure, which is probably not what you wanted. The second example correctly defines p3 and p4 to be pointers. <br><br><br><br>Obscure syntax <br>16. C allows some appalling constructs. Is this construct legal, and if so what does this code do? <br><br><br><br>int a = 5, b = 7, c;<br><br>c = a+++b;<br><br><br><br>This question is intended to be a lighthearted end to the quiz, as, believe it or not, this is perfectly legal syntax. The question is how does the compiler treat it? Those poor compiler writers actually debated this issue, and came up with the "maximum munch" rule, which stipulates that the compiler should bite off as big (and legal) a chunk as it can. Hence, this code is treated as: <br><br>c = a++ + b;<br><br>Thus, after this code is executed, a = 6, b = 7, and c = 12. <br><br>If you knew the answer, or guessed correctly, well done. If you didn't know the answer then I wouldn't consider this to be a problem. I find the greatest benefit of this question is that it is good for stimulating questions on coding styles, the value of code reviews, and the benefits of using lint. <br><br>Well folks, there you have it. That was my version of the C test. I hope you had as much fun taking it as I had writing it. If you think the test is a good test, then by all means use it in your recruitment. Who knows, I may get lucky in a year or two and end up being on the receiving end of my own work. <br><br>Nigel Jones is a consultant living in Maryland. When not underwater, he can be found slaving away on a diverse range of embedded projects. He enjoys hearing from readers and can be reached at NAJones@compuserve.com . <br><br>References <br><br>Jones, Nigel, "In Praise of the #error directive," Embedded Systems Programming, September 1999, p. 114. <br><br>Jones, Nigel, " Efficient C Code for Eight-bit MCUs ," Embedded Systems Programming, November 1998, p. 66. </div> </div> <p style="margin: 5px; line-height: 150%;"> </p>  <font color="#000099"><strong>鍘熸枃鍦板潃</strong></font> <a target="_blank">http://blog.csdn.net/sailor_8318/archive/2008/03/25/2215041.aspx</a><img src ="http://m.shnenglu.com/zzh/aggbug/68049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zzh/" target="_blank">Xiao.Zhu</a> 2008-11-28 08:41 <a href="http://m.shnenglu.com/zzh/archive/2008/11/28/68049.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Visual Studio 6.0 鍜屻Visual Studio 2005 緙栬緫鍣ㄩ厤鑹叉柟妗?/title><link>http://m.shnenglu.com/zzh/archive/2007/09/18/32402.html</link><dc:creator>Xiao.Zhu</dc:creator><author>Xiao.Zhu</author><pubDate>Tue, 18 Sep 2007 02:12:00 GMT</pubDate><guid>http://m.shnenglu.com/zzh/archive/2007/09/18/32402.html</guid><wfw:comment>http://m.shnenglu.com/zzh/comments/32402.html</wfw:comment><comments>http://m.shnenglu.com/zzh/archive/2007/09/18/32402.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://m.shnenglu.com/zzh/comments/commentRss/32402.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zzh/services/trackbacks/32402.html</trackback:ping><description><![CDATA[<p>Visual Studio 6.0 緙栬緫鍣ㄩ厤鑹叉柟妗?br><br>澶嶅埗浠ヤ笅浠g爜淇濆瓨鎴?reg鏂囦歡錛岀劧鍚庡鍏ユ敞鍐岃〃銆?/p> <p>--------------------------------------------------------------------------------------------------------------------<br>Windows Registry Editor Version 5.00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format]<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Calls Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Calls Highlight"=hex:00,00,00,00,00,ff,00,00,10,00,10,00<br>"Superceded code"=hex:80,80,80,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Disassembly Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Assembly Code"=hex:80,80,80,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Memory Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Memory Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Output Window]<br>"FontFace"="FixedSys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:c0,c0,c0,00,00,00,00,00,15,00,15,00<br>"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00<br>"Current Error/Tag"=hex:ff,ff,ff,00,00,00,80,00,55,00,55,00<br>"Bookmark"=hex:00,00,00,00,00,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Registers Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Value Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Source Browser]<br>"FontFace"="DejaVu Sans"<br>"FontSize"=dword:0000000c<br>"Text"=hex:c0,c0,c0,00,00,00,00,00,15,00,15,00<br>"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Source Window]<br>"FontFace"="DejaVu Sans Mono"<br>"FontSize"=dword:0000000d<br>"Text"=hex:c0,c0,c0,00,00,00,00,00,12,01,b2,00<br>"Text Selection"=hex:00,00,00,00,c0,c0,c0,00,19,00,19,00<br>"Current Error/Tag"=hex:ff,ff,ff,00,00,00,80,00,d2,01,b2,01<br>"Bookmark"=hex:00,00,00,00,00,ff,ff,00,10,00,10,00<br>"Breakpoint"=hex:ff,ff,ff,00,80,00,00,00,10,00,10,00<br>"Current Statement"=hex:00,00,00,00,ff,ff,00,00,70,00,70,00<br>"Selection Margin"=hex:d4,d0,c8,00,d4,d0,c8,00,13,00,13,00<br>"Keyword"=hex:ff,00,ff,00,00,00,00,00,10,00,11,00<br>"Comment"=hex:00,e6,00,00,00,00,00,00,10,00,11,00<br>"Number"=hex:ff,ff,00,00,00,00,00,00,10,00,11,00<br>"String"=hex:ff,80,00,00,00,00,00,00,10,00,11,00<br>"Operator"=hex:c0,c0,c0,00,00,00,00,00,11,00,11,00<br>"Wizard IDL/ODL Code"=hex:80,80,80,00,00,00,00,00,14,00,15,00<br>"HTML Element Name"=hex:80,00,80,00,00,00,00,00,14,00,15,00<br>"HTML Attribute Name"=hex:ff,00,00,00,00,00,00,00,14,00,15,00<br>"HTML Attribute Value"=hex:00,00,ff,00,00,00,00,00,14,00,15,00<br>"HTML Comment"=hex:00,80,00,00,00,00,00,00,14,00,15,00<br>"HTML Entity"=hex:ff,00,00,00,00,00,00,00,14,00,15,00<br>"HTML Tag Delimiter"=hex:00,00,ff,00,00,00,00,00,14,00,15,00<br>"HTML String"=hex:00,00,ff,00,00,00,00,00,14,00,15,00<br>"HTML Tag Text"=hex:ff,00,ff,00,00,00,00,00,14,00,15,00<br>"HTML Operator"=hex:00,00,ff,00,00,00,00,00,14,00,15,00<br>"HTML Server-Side Script"=hex:00,00,00,00,ff,ff,00,00,14,00,14,00<br>"User Defined Keywords"=hex:00,00,ff,00,00,00,00,00,14,00,15,00<br>"Wizard Code"=hex:80,80,80,00,00,00,00,00,14,00,15,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Variables Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Variables Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Watch Window]<br>"FontFace"="Fixedsys"<br>"FontSize"=dword:0000000c<br>"Text"=hex:00,00,00,00,ff,ff,ff,00,13,01,b3,00<br>"Text Selection"=hex:ff,ff,ff,00,00,00,00,00,19,00,19,00<br>"Watch Highlight"=hex:ff,00,00,00,ff,ff,ff,00,10,00,10,00<br>[HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Format\Workspace Window]<br>"FontFace"="Segoe UI"<br>"FontSize"=dword:0000000c<br>-----------------------------------------------------------------------------------------------------------------------<br><br><br>Visual Studio 2005 <br>澶嶅埗浠ヤ笅浠g爜淇濆瓨鎴?reg鏂囦歡錛岀劧鍚庡鍏ユ敞鍐岃〃銆?br>------------------------------------------------------------------------------------------------------------------------<br>Windows Registry Editor Version 5.00</p> <p>[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\FontAndColors\{A27B4E24-A735-4D1D-B8E7-9716E1E3D8E0}]<br>"Colorable item format version"=dword:00000008<br>"FontName"="Courier"<br>"FontPointSize"=dword:0000000a<br>"FontCharSet"=dword:00000000<br>"Plain Text Foreground"=dword:00e5e5e5<br>"Plain Text Background"=dword:00000000<br>"Plain Text FontFlags"=dword:00000000<br>"Selected Text Foreground"=dword:00000000<br>"Selected Text Background"=dword:00ebe8e7<br>"Selected Text FontFlags"=dword:80000000<br>"Line Numbers Foreground"=dword:00804000<br>"Line Numbers Background"=dword:02000000<br>"Line Numbers FontFlags"=dword:80000000<br>"Visible White Space Foreground"=dword:0080ffff<br>"Visible White Space Background"=dword:02000000<br>"Visible White Space FontFlags"=dword:80000000<br>"Collapsible Text Foreground"=dword:00c9c9c9<br>"Collapsible Text Background"=dword:00000000<br>"Collapsible Text FontFlags"=dword:00000000<br>"Comment Foreground"=dword:00c4c4c4<br>"Comment Background"=dword:001f1f1f<br>"Comment FontFlags"=dword:00000000<br>"CSS Property Name Foreground"=dword:0000ffff<br>"CSS Property Name Background"=dword:02000000<br>"CSS Property Name FontFlags"=dword:00000000<br>"CSS Property Value Foreground"=dword:0000ff00<br>"CSS Property Value Background"=dword:02000000<br>"CSS Property Value FontFlags"=dword:00000000<br>"CSS Selector Foreground"=dword:00ffff00<br>"CSS Selector Background"=dword:02000000<br>"CSS Selector FontFlags"=dword:00000000<br>"HTML Attribute Value Foreground"=dword:0000ff00<br>"HTML Attribute Value Background"=dword:02000000<br>"HTML Attribute Value FontFlags"=dword:00000000<br>"HTML Comment Foreground"=dword:0080ff80<br>"HTML Comment Background"=dword:02000000<br>"HTML Comment FontFlags"=dword:00000000<br>"HTML Element Name Foreground"=dword:0000ffff<br>"HTML Element Name Background"=dword:02000000<br>"HTML Element Name FontFlags"=dword:00000000<br>"HTML Entity Foreground"=dword:00ffb66c<br>"HTML Entity Background"=dword:02000000<br>"HTML Entity FontFlags"=dword:00000000<br>"HTML Operator Foreground"=dword:00ffffff<br>"HTML Operator Background"=dword:02000000<br>"HTML Operator FontFlags"=dword:00000000<br>"HTML Server-Side Script Foreground"=dword:00000000<br>"HTML Server-Side Script Background"=dword:00007777<br>"HTML Server-Side Script FontFlags"=dword:00000000<br>"HTML Tag Delimiter Foreground"=dword:00ffff00<br>"HTML Tag Delimiter Background"=dword:02000000<br>"HTML Tag Delimiter FontFlags"=dword:00000000<br>"Identifier Foreground"=dword:00eaeaea<br>"Identifier Background"=dword:02000000<br>"Identifier FontFlags"=dword:00000000<br>"Keyword Foreground"=dword:00ffff00<br>"Keyword Background"=dword:02000000<br>"Keyword FontFlags"=dword:00000000<br>"Number Foreground"=dword:0000a8a8<br>"Number Background"=dword:02000000<br>"Number FontFlags"=dword:00000000<br>"Operator Foreground"=dword:00bf80ff<br>"Operator Background"=dword:02000000<br>"Operator FontFlags"=dword:00000000<br>"Preprocessor Keyword Foreground"=dword:00ff6f6f<br>"Preprocessor Keyword Background"=dword:02000000<br>"Preprocessor Keyword FontFlags"=dword:00000000<br>"Read-Only Region Foreground"=dword:02000000<br>"Read-Only Region Background"=dword:00c0c0c0<br>"Read-Only Region FontFlags"=dword:00000000<br>"Register Data Foreground"=dword:02000000<br>"Register Data Background"=dword:02000000<br>"Register Data FontFlags"=dword:00000000<br>"Register NAT Foreground"=dword:00ffffff<br>"Register NAT Background"=dword:02000000<br>"Register NAT FontFlags"=dword:00000000<br>"String Foreground"=dword:0081c2fe<br>"String Background"=dword:02000000<br>"String FontFlags"=dword:00000000<br>"XML Doc Comment Foreground"=dword:00b7ffb7<br>"XML Doc Comment Background"=dword:001f1f1f<br>"XML Doc Comment FontFlags"=dword:00000000<br>------------------------------------------------------------------------------------------------------------------------<br></p> <img src ="http://m.shnenglu.com/zzh/aggbug/32402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zzh/" target="_blank">Xiao.Zhu</a> 2007-09-18 10:12 <a href="http://m.shnenglu.com/zzh/archive/2007/09/18/32402.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鏉傦紬鏉?鎶鏈祫鏂?/title><link>http://m.shnenglu.com/zzh/archive/2007/08/13/29864.html</link><dc:creator>Xiao.Zhu</dc:creator><author>Xiao.Zhu</author><pubDate>Mon, 13 Aug 2007 01:22:00 GMT</pubDate><guid>http://m.shnenglu.com/zzh/archive/2007/08/13/29864.html</guid><wfw:comment>http://m.shnenglu.com/zzh/comments/29864.html</wfw:comment><comments>http://m.shnenglu.com/zzh/archive/2007/08/13/29864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/zzh/comments/commentRss/29864.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zzh/services/trackbacks/29864.html</trackback:ping><description><![CDATA[<p>涓鑸叏灞鍙橀噺搴旇鐢ㄦ瘮杈冮暱錛岃緇嗙殑鍚嶇О錛岃屾湰鍦板彉閲忓垯綆鍗曟槑浜嗕負瀹溿?br>GetSystemMetrics鍙互鑾峰緱寰堝緋葷粺淇℃伅銆?/p> <p>錛僫 nclude <>鍏堟悳绱?I緙栬瘧閫夐」鐨勮礬寰勶紝鐒跺悗鎼滅儲鐜鍙橀噺INCLUDE錛?"鍏堟悳绱㈢埗鏂囦歡鐨勮礬寰勶紝鐒跺悗鎵嶆槸鍓嶉潰涓や釜璺緞銆?/p> <p>鐢–璁捐涓涓姩鎬佸闀跨殑鏁扮粍錛岄渶瑕佺敤鍒癕ALLOC鍜孯EALLOC錛屽涓庡悓涓涓寚閽堬紝濡傛灉鍐呭瓨涓嶅瀛樺偍鏁版嵁錛屽氨鐢≧EALLOC閲嶆柊鍒嗛厤澶氫竴鍊嶇殑鍐呭瓨銆傚茍涓旇繑鍥炵殑鎸囬拡涓嶈兘鐩存帴緇欏師鏉ョ殑鎸囬拡錛屽洜涓哄鏋滃垎閰嶅け璐ワ紝閭d箞鍘熸潵鐨勬暟鎹氨浼氫涪澶便?/p> <p>浼犻掑嚱鏁板湴鍧浣滀負鍙傛暟</p> <p>棣栧厛瀹氫箟浠ュ嚱鏁板湴鍧浣滀負鍙傛暟鐨勫嚱鏁?/p> <p>                   <br>fun1(榪斿洖綾誨瀷(*fun2)(鍙傛暟))<br>{<br>   ...=(*fun2)(鍙傛暟);</p> <p>}<br>fun2姝e父瀹氫箟<br>璋冪敤鐨勬椂鍊欍銆fun1(鍑芥暟鍚?;<br>int fun2(int n)<br>{<br> return n+1;</p> <p>}</p> <p>int fun1(int n,int(*f)(int b))<br>{<br> return (*f)(n);</p> <p> </p> <p>}<br>int main(int argc, char* argv[])<br>{<br> int a(B),b;<br>    b=fun1(a,fun2);<br>    cout<<b;<br> return 0;<br>}</p> <p>瀹炵幇鏁e垪琛細浣跨敤涓涓暎鍒楀嚱鏁幫紝灝嗛」鏁e垪鍒頒竴涓暟緇勯噷闈紝姣忎釜鏁扮粍鍏冪礌鏄竴涓摼琛紝璁板綍榪欎釜鏁e垪鍊肩殑鎵鏈夐」銆?/p> <p>CMemoryState 綾誨彲鐢ㄤ簬媯鏌ュ唴瀛樻硠闇層?/p> <p> </p> <p> </p> <p>鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟閮芥病鏈夎繑鍥炲?/p> <p>綾葷殑鎴愬憳緙虹渷鏄鏈夌殑.<br>濡傛灉瀹氫箟浜嗘瀯閫犲嚱鏁板拰鏋愭瀯鍑芥暟,蹇呴』灝嗗畠浠緗負PUBLIC,鍚﹀垯鏃犳硶璁塊棶.<br>(浜嬪疄涓婁篃鍙互鏄痯rivate,浣嗗彧鑳借闂被鐨勯潤鎬佹垚鍛?榪欐椂涓嶈兘鐢熸垚瀵硅薄,濡傛灉瑕佺敓鎴愬璞?闇瑕佷竴瀹氱殑鎶宸?</p> <p>閲嶈澆渚濋潬鍙傛暟涓嶅悓鑰屼笉鏄繑鍥炲肩殑涓嶅悓,鍥犱負鎴戜滑鍙互鍦ㄨ皟鐢ㄥ嚱鏁扮殑鏃跺欏拷鐣ヨ繑鍥炲?榪欎釜鏃跺欑紪璇戝櫒鏃犳硶紜畾璇ヨ皟鐢ㄩ偅涓嚱鏁?</p> <p>鏋勯犲嚱鏁板彲浠ユ牴鎹弬鏁扮被鍨嬩笉鍚屽尯鍒?涔熷彲浠ユ牴鎹弬鏁頒釜鏁頒笉鍚屽尯鍒?浣嗗鏋滀竴涓瀯閫犲嚱鏁扮殑鍙傛暟鏈夌己鐪佸艱屼笖鍓嶉潰鐨勫弬鏁頒笌鍏跺畠鏋勯犲嚱鏁扮浉鍚?閭d箞濡傛灉鍦ㄨ皟鐢ㄧ殑鏃跺欑敤鍒頒簡緙虹渷鍊?緙栬瘧鍣ㄦ棤娉曞垎杈ㄨ璋冪敤閭d釜鍑芥暟,浼氭姤閿?</p> <p>鍙互鍦ㄥ畾涔夊嚱鏁扮殑鏃跺?璁╂煇涓弬鏁板彧鏈夌被鍨嬪悕鑰屾病鏈夋爣璇嗙,榪欐牱鍋氱殑鐩殑鏄負浜嗗皢鏉ュ彲鑳介渶瑕佹彃鍏ヤ竴涓弬鏁?鍦ㄨ皟鐢ㄧ殑鏃跺欓殢渚跨粰榪欎釜浣嶇疆涓涓煎氨鍙互浜?</p> <p>int temp(int a,int,int b)<br>{}</p> <p>~鎸変綅姹傚弽</p> <p>const 瀛樻斁鍦ㄧ鍙瘋〃閲?涓嶄細琚垎閰嶅唴瀛?濡傛灉浣跨敤&絎﹀彿,灝變細寮鴻揩緙栬瘧鍣ㄤ負甯擱噺鍒嗛厤鍦板潃,const鏁扮粍涔熶細琚垎閰嶅唴瀛?</p> <p>const int* p錛沬nt const* p;鎸囧悜甯擱噺鐨勬寚閽堬紝瀹冪殑鍐呭(*p)涓嶈兘琚敼鍙橈紝涔熶笉鑳藉皢瀹冪殑鍊艱祴int * const p,甯告寚閽堬紝鍊間笉鍙樸傜粰闈炲父閲忔寚閽堛?br>瀵逛復鏃跺璞¤浣跨敤甯稿煎紩鐢ㄦ帴鏀訛紝鍥犱負涓存椂瀵硅薄鏄父閲忋?/p> <p>瀵逛簬const鎴愬憳鍙橀噺錛屽繀欏誨湪鏋勯犲嚱鏁板墠(鏋勯犲嚱鏁板垵濮嬪寲琛?瀵瑰畠璧嬪垵鍊?鑾刼nst涔熷彲浠ュ湪榪欓噷璧嬪?浣嗘病鏈夊繀瑕?鍙互杞埌鏋勯犲嚱鏁頒綋鍐?铏界劧鍦ㄥ垵濮嬪寲琛ㄩ噷鏁堢巼鏇撮珮)銆備換浣曠被鍨嬬殑鎴愬憳鍙橀噺閮戒笉鑳藉湪澹版槑鐨勬椂鍊欒祴鍊箋?/p> <p>綾諱腑鐨勫父閲廲onst鏄鏌愪釜鍏蜂綋瀵硅薄鑰岃█鐨勶紝濡傛灉闇瑕佸鏁翠釜綾葷殑甯稿鹼紝浣跨敤enum.</p> <p>char *p="123456";<br>cout<<*p++<<*p++;<br>*p=3;<br>char *t;<br>t=p;<br>杈撳嚭緇撴灉涓?21,鍥犱負姹傚奸『搴忔槸浠庡彸鍒板乏,絎笁涓鍙ユ槸閿欑殑,*p鐨勫唴瀛樻槸涓嶅彲鍐欑殑,浼間箮p搴旇涓轟竴涓父閲忔寚閽?浣嗙‘瀹炲彲浠ュ皢p璧嬬粰涓涓潪甯告寚閽?璇彞5涓嶆姤閿?</p> <p>濡傛灉鎴愬憳鍑芥暟琚0鏄庝負const,閭d箞鍏朵腑涓嶈兘鍚湁鏀瑰彉鎴愬憳鍙橀噺鍊肩殑璇彞(浣嗗彲浠ユ敼鍙樿mutable淇グ鐨勬垚鍛樺彉閲?),涔熶笉鑳借皟鐢ㄩ潪const鎴愬憳鍑芥暟,濡傛灉瀵硅薄琚0鏄庝負const,閭d箞瀹冨彧鑳借皟鐢╟onst鎴愬憳鍑芥暟.</p> <p>volatile鐨勭敤娉曞悓const,鐢氳嚦鍙互浣跨敤const volatile鍋氫慨楗版病,volatile鏍囪瘑鏁版嵁鍙兘琚埆鐨勮繘紼嬫敼鍙?鍥犳鏈夊繀瑕佸湪姣忔浣跨敤鐨勬椂鍊欓噸璇昏繖涓暟鎹?榪欏湪浼樺寲鏈熼棿鐗瑰埆閲嶈,闃叉緙栬瘧鍣ㄥ仛涓浜涘亣璁?</p> <p>緇欏畯鐨勫弬鏁版渶濂芥槸綆鍗曞彉閲忥紝濡傛灉涓嶆槸錛屽a++,閭d箞鍙橀噺鍦ㄥ畯涓嚭鐜板嚑嬈★紝a灝變細琚姞澶氬皯嬈°傛渶濂戒笉鐢ㄥ畯鍋氱被浼煎嚱鏁扮殑浜嬫儏錛屽湪綾諱腑錛岀敤鍐呰仈鍑芥暟浠f浛瀹忥紝涓鏍峰彲浠ュ緱鍒伴珮鏁堢巼銆?/p> <p>鍦ㄧ被涓畾涔夌殑鍑芥暟鑷姩鎴愪負鍐呰仈鍑芥暟錛屽湪綾誨錛屼嬌鐢╥nline鍏抽敭瀛椼?/p> <p>涓嶅簲璇ヤ嬌鐢╬ublic鎴愬憳鍙橀噺錛岃屾槸搴旇浣跨敤鍐呰仈鍑芥暟瀛樺彇榪欎簺鍙橀噺錛屼嬌鐢ㄩ噸杞藉彲浠ュ彧鐢ㄤ竴涓嚱鏁板悕瀛楀畬鎴愬瓨鍙栥?/p> <p>涓涓▼搴忕殑鎵鏈夋枃浠訛紝鎵鏈夌殑鍚嶅瓧錛堜笉鍦ㄥ嚱鏁版垨綾諱腑錛夌己鐪侀兘鏄閮ㄨ繛鎺ワ紝榪欐剰鍛崇潃涓嶅悓鏂囦歡涓浉鍚岀殑鍚嶅瓧錛堜笉鍦ㄥ嚱鏁版垨綾諱腑錛変細寮曡搗鍐茬獊錛屽鏋滃榪欎簺鍚嶅瓧鐢╯tatic淇グ錛屽氨浼氬彉鎴愬唴閮ㄨ繛鎺ワ紝鍚嶅瓧浠呭湪緙栬瘧鍗曞厓鍐呭彲瑙併俥xtern鏄痵tatic鐨勫弽涔夎瘝錛岃〃紺哄閮ㄨ繛鎺ワ紝鍚岀己鐪佺殑鎰忎箟鐩稿悓銆備袱縐嶈繛鎺ョ殑鍚嶅瓧閮戒細瀛樺偍鍦ㄩ潤鎬佸瓨鍌ㄥ尯銆?/p> <p>涓鏃︾敤浜庝慨楗板眬閮ㄥ彉閲忥紝static灝變笉鍐嶈〃紺哄彲瑙佹э紝鑰屽彧鏀瑰彉鍙橀噺鐨勫瓨璐被鍨嬨?/p> <p>register琛ㄧず甯屾湜榪欎釜鍙橀噺琚斁鍦ㄥ瘎瀛樺櫒閲岋紝鍥犱負瀹冪粡甯歌鐢ㄥ埌錛屽簲璇ラ伩鍏嶄嬌鐢ㄨ繖涓叧閿瓧錛屽洜涓鴻繖鏂歸潰閫氬父鏈哄櫒姣斾漢鏇存搮闀褲?/p> <p>綾諱腑鐨剆tatic鍙橀噺錛堝寘鎷敤static淇グ鐨刢onst錛夊繀欏誨湪綾誨拰鍑芥暟澶栫殑鍏ㄥ眬浣嶇疆鍒濆鍖栵紝鍒濆鍖栫殑璇硶鏄細static 綾誨瀷 綾?:鍙橀噺鍚?鍊鹼紱</p> <p>瀛樺湪宓屽綾誨拰灞閮ㄧ被:綾諱腑瀹氫箟鐨勭被鍜屽嚱鏁頒腑瀹氫箟鐨勭被,鍚庤呬笉鑳芥湁闈欐佹垚鍛樺彉閲?鏄劇劧錛屾病鏈夊姙娉曞垵濮嬪寲榪欑static鍙橀噺).</p> <p>璋冪敤c搴?鍦ㄥ0鏄庣殑鏃跺欒浣跨敤extern "C" 鍑芥暟澹版槑,鎸囨槑榪欐槸涓涓猚榪炴帴.鍥犱負c++鍚宑鐨勭紪璇戝櫒涓嶅悓,浼氫負鍑芥暟浜х敓涓嶅悓鐨勫唴閮ㄥ悕,鎸夌収c++鐨勬柟寮忚繛鎺鍑芥暟,浼氭壘涓嶅埌搴撲腑鐨勫嚱鏁頒綋.褰撶劧,閫氬父鎯呭喌涓嬪簱鐨勫紑鍙戜笂宸茬粡涓烘垜浠仛濂戒簡榪欎簺.</p> <p>寮曠敤蹇呴』琚垵濮嬪寲,涓斿紩鐢ㄧ殑瀵硅薄涓嶈兘鏀瑰彉.涓嶈兘寮曠敤null.</p> <p>int f(const int&)<br>涓婇潰鏄竴涓父閲忓紩鐢?浣跨敤甯擱噺寮曠敤鏄負浜嗕繚璇佸閮ㄥ彉閲忎笉琚慨鏀?鍙﹀,濡傛灉浼犲叆鐨勬槸甯擱噺鎴栬呬復鏃跺璞?涓嶄嬌鐢ㄥ父閲忓紩鐢ㄧ殑鍙傛暟灝嗗嚭閿?鍥犱負浜岃呴兘鏄父閲?</p> <p>鏃犺繑鍥炲肩殑鍑芥暟鏄痸oid綾誨瀷.</p> <p>void inf(int*&i){i++;}  璋冪敤:int *i=0; inf(i); <br>涓婇潰鐨勫嚱鏁版槸浠ユ寚閽堝紩鐢ㄥ仛鍙傛暟,鏀瑰彉鎸囬拡鐨勫?榪樺彲浠ヤ嬌鐢ㄦ寚鍚戞寚閽堢殑鎸囬拡,瑕侀夯鐑︿竴浜?涓嶈繃琛ㄨ揪鏇存槑紜?void inf(int **i){(*i)++}; 璋冪敤鏃?int *i=0; inf(&i); </p> <p>閫氳繃鍊間紶閫掔粰鍑芥暟錛屾垨鑰呭嚱鏁拌繑鍥炰竴涓璞?鏄嬌鐢ㄤ綅鎷瘋礉寤虹珛瀵硅薄,榪欑鎯呭喌涓嬬紪璇戝櫒浼氳皟鐢ㄦ嫹璐濇瀯閫犲嚱鏁?濡傛灉娌℃湁緙栬瘧鍣ㄤ細寤虹珛涓涓己鐪佺殑),浣嗗璞¢攢姣佹椂浼氳皟鐢ㄦ瀽鏋勫嚱鏁?</p> <p>濡傛灉鎯崇姝㈤氳繃鍊間紶閫掓煇涓璞?鍙澹版槑涓涓鏈夌殑鎷瘋礉鏋勯犲嚱鏁?姝ゆ椂緙栬瘧鍣ㄨ涓虹敤鎴鋒帴綆′簡榪欓」宸ヤ綔,涓嶄細寤虹珛緙虹渷鐨勬嫹璐濇瀯閫犲嚱鏁?鑰岀敤鎴峰緩绔嬬殑鍑芥暟鏄鏈夌殑,娌℃硶璋冪敤,緙栬瘧鍣ㄥ氨浼氭姤閿?</p> <p>鍙互瀹氫箟鎸囧悜綾葷殑鎴愬憳鍙橀噺鍜屾垚鍛樺嚱鏁扮殑鎸囬拡錛岀▼搴忎笉蹇呬嬌鐢ㄥ嚱鏁扮殑鍚嶅瓧灝卞彲浠ヨ皟鐢ㄥ畠錛屾兂璧蜂簡楂橀氱殑CDMA紼嬪簭妗嗘灦.c++緙栫▼鎬濇兂絎?0绔犮?/p> <p>涓涓寚鍚戝嚱鏁扮殑鎸囬拡:<br>void inf(int *&i){i++;}<br>int main(int argc, char* argv[])<br>{<br>int *i=0;<br>cout<<i<<endl;<br>void (*pf)(int *&);<br>pf=&inf;<br>(*pf)(i);<br>cout<<i<<endl;<br>}</p> <p><br>榪愮畻絎﹂噸杞?br>閲嶈澆浠呮槸瀵圭敤鎴風被鍨嬬殑鏁版嵁鏉ヨ鐨勶紝瀵瑰唴緗殑鏁版嵁綾誨瀷鏄笉鍙互閲嶈澆榪愮畻絎︾殑銆?br>.鍜?*閮戒笉鑳介噸杞?鍙互灝嗚繍綆楃閲嶈澆鐪嬩綔鍙﹀涓縐嶅艦寮忕殑鍑芥暟璋冪敤錛屽嚱鏁扮殑鍚嶅瓧鏄痮perator@,@浠h〃榪愮畻絎︼紝鍙傛暟鐨勪釜鏁板彇鍐充簬涓や釜鍥犵礌錛?br>1 榪愮畻絎︽槸涓鍏冭繕鏄簩鍏?br>2 榪愮畻絎︽槸鍏ㄥ眬鍑芥暟(涓鍏冩槸涓涓弬鏁?浜屽厓鏄袱涓弬鏁?,榪樻槸鎴愬憳鍑芥暟(涓鍏冩病鏈夊弬鏁?浜屽厓涓涓弬鏁?---瀵硅薄鍙樹負宸︿晶鍙傛暟)</p> <p>鍙互閲嶈澆鍑犱箮鎵鏈夌殑榪愮畻絎?浣嗗浜庣幇鍦╟涓病鏈夋剰涔夌殑榪愮畻絎︽槸涓嶈兘閲嶈澆鐨?涔熶笉鑳芥敼鍙樿繍綆楃鐨勫弬鏁頒釜鏁板拰浼樺厛綰?</p> <p>閲嶈澆榪愮畻絎︾殑榪斿洖鍊?濡傛灉闇瑕佽繑鍥炲璞℃湰韜?鏍規嵁闇瑕佽繑鍥?br>瀵硅薄鐨勬寚閽堟垨鑰呭紩鐢?濡傛灉鏄繑鍥炰復鏃剁敓鎴愮殑瀵硅薄,閭d箞榪斿洖瀵硅薄.</p> <p>閲嶈澆榪愮畻絎︾殑榪斿洖鍊兼槸鍚﹀父閲?褰撹繑鍥炵殑鏄竴涓復鏃跺煎緱鏃跺?濡?%,&,>>,榪欎簺榪愮畻絎﹀緱鍒扮殑緇撴灉瑕佽祴緇欏彟澶栦竴涓彉閲?榪欐椂榪斿洖鍊兼槸const,濡傛灉榪斿洖鍊肩洿鎺ョ敤浜庡彉閲?濡?=,+=,榪欐槸榪斿洖鍊間笉瑕佸姞const.</p> <p>鍑芥暟榪斿洖瀵硅薄鐨勬椂鍊?榪斿洖涓涓復鏃跺璞℃瘮鏂板緩涓涓璞″湪榪斿洖鏁堢巼瑕侀珮寰堝,鍥犱負榪欐椂璋冪敤鐨勬槸鏅氭瀯閫犲嚱鏁拌屼笉鏄嫹璐濇瀯閫犲嚱鏁?鑰屼笖涓嶉渶瑕佽皟鐢ㄦ瀽鏋勫嚱鏁?铏界劧鏂板緩涓涓璞″啀榪斿洖榪斿洖鐨勪篃鏄竴涓復鏃跺璞?</p> <p>鏅鴻兘鎸囬拡(smart pointer):瀵硅薄,鍖呭鍣?榪唬鍣?</p> <p>鑷姩綾誨瀷杞崲:鍙互緙栫▼瀹炵幇鑷姩綾誨瀷杞崲.濡傞渶瑕佷粠瀵硅薄one鍒皌wo,閭d箞鍙渶瑕佷負two瀹氫箟涓涓互one&涓哄弬鏁扮殑鏋勯犲嚱鏁?褰撶紪璇戝櫒鍙戠幇闇瑕佽繘琛屼粠瀵硅薄one鍒皌wo鐨勮漿鎹㈢殑鏃跺?浼氳嚜鍔ㄦ鏌wo鐨勫畾涔?鎵懼埌榪欎釜鏋勯犲嚱鏁?鏋勯犱竴涓猼wo瀵硅薄.濡傛灉闇瑕佹樉寮忕被鍨嬭漿鎹?鍦ㄦ瀯閫犲嚱鏁板墠鍔犱竴涓?explicit</p> <p>榪樻湁涓縐嶈嚜鍔ㄧ被鍨嬭漿鎹㈡柟娉曟槸:涓洪渶瑕佽漿鎹㈢殑瀵硅薄閲嶈澆涓涓繍綆楃,榪愮畻絎︿互瑕佽漿鎹㈠埌鐨勫璞$殑鍚嶅瓧鍛藉悕.鏃犻』澹版槑榪斿洖鍊?<br>operator one() const{ return one(x);}</p> <p><br>涓嶈繃騫朵笉鎻愬¢殣寮忕被鍨嬭漿鎹?榪欐牱瀹規槗闅愯棌閿欒,涔熶細闄嶄綆璋冪敤鏃剁殑鏁堢巼.<br> <br>浣跨敤鍏ㄥ眬閲嶈澆榪愮畻絎﹁屼笉鏄垚鍛樿繍綆楃鐨勫ソ澶勬槸鍙互瀵瑰乏鍙蟲搷浣滀功閮借嚜鍔ㄤ綔綾誨瀷杞崲,鑰屾垚鍛樿繍綆楃鐨勬搷浣滄暟宸︿晶鐨勫繀欏繪槸姝g‘鐨勫璞?/p> <p>閲嶈澆璧嬪兼搷浣滅"=",榪斿洖鍙互鏄紩鐢ㄤ篃鍙互鏄?鍓嶈呮晥鐜囪緝楂?浣嗚璁板緱姝ゆ椂榪斿洖鐨勫紩鐢ㄤ笉鑳芥槸灞炰簬灞閮ㄥ璞$殑.閫氬父榪斿洖*this.</p> <p>return String(s1+s2); 涓嶴tring temp(s1+s2);return temp;鐨勬晥鐜囨槸涓嶅悓鐨勶紝鍚庤呰榪涜瀵硅薄鎷瘋礉錛岃屽墠鑰呯洿鎺ュ皢涓存椂瀵硅薄鍒涘緩鍦ㄥ嚱鏁扮殑榪斿洖鍖恒傚悓鏃朵篃鏇村姞綆媧併?/p> <p>鍑芥暟涓皯鐢╯tatic鍙橀噺銆傝鐩稿悓鐨勮緭鍏ヤ駭鐢熺浉鍚岀殑杈撳嚭錛岃繖鏍風殑浠g爜渚夸簬浣跨敤鍜岀淮鎶ゃ?/p> <p>瀵瑰嚱鏁扮殑鍙傛暟鍜岃繑鍥炲肩殑鏈夋晥鎬ц繘琛屾鏌ャ?/p> <p>縐瀬浣跨敤鏂█(ASSERT),鍚屾椂瑕佸姞涓婃敞閲婏紝闃叉灝嗘潵蹇樿ASSERT鐨勭洰鐨勩?/p> <p>涔嬫墍浠ユ湁浜嗘寚閽堣繕瑕佸紩鍏ュ紩鐢紝鏄負浜嗗鍔熻兘鍔犱互闄愬埗錛岄槻姝㈠彂鐢熸剰澶栵紝灝卞儚瀵瑰弬鏁板姞涓奵onst闄愬畾鐨勭洰鐨勪竴鏍楓?/p> <p>鍔ㄦ佸垎閰嶅唴瀛樼殑鍘熷垯:<br>1 鍒嗛厤鍚庤媯鏌ユ槸鍚﹀垎閰嶆垚鍔?鍗砳f(p==NULL)<br>2 閲婃斁鍐呭瓨鍚庤璁板緱浠=NULL,闃叉浜х敓閲庢寚閽?閲庢寚閽堜細璁╂垜浠湪浣跨敤鎸囬拡鍓嶇殑if(p==NULL)媯鏌ュ艦鍚岃櫄璁?</p> <p>瑕佺敵璇蜂竴鍧楀唴瀛樺鍒舵暟緇刢har a[]鐨勫唴瀹?搴旇鐢寵鐨勫唴瀛樺ぇ灝忔槸sizeof(char)*(strlen(a)+1);</p> <p>濡傛灉閫氳繃鍙傛暟浼犻掓暟緇?鏁扮粍鍚嶈嚜鍔ㄩ鍖栦負涓涓寚閽?<br>main()<br>{<br> char a[100];<br>        cout<<sizeof(a);<br> fun(a);<br>}<br>void fun(char a[100])<br>{<br>   cout<<sizeof(a);<br>}<br>杈撳嚭100 4.</p> <p>瀵瑰唴瀛樺垎閰嶅け璐ヨ繘琛屽鐞嗘湁涓ょ鏂規硶:<br>1 if(p==NULL) 閫傜敤浜庡唴瀛樺垎閰嶈鍙ヨ緝灝戠殑鎯呭喌<br>2 _set_new_handler  _set_new_mode 閫傜敤浜庡唴瀛樺垎閰嶈鍙ヨ緝澶氱殑鎯呭喌</p> <p>unsigned涓庢病鏈塽nsigned 綾誨瀷鍙槸琛ㄧず鑼冨洿涓嶅悓,澶у皬鐩稿悓.</p> <p> </p> <p>濡傛灉涓嶇粰綾誨畾涔夋嫹璐濇瀯閫犲嚱鏁板拰璧嬪煎嚱鏁幫紝濡傛灉綾諱腑鏈夋寚閽堝彉閲忥紝灝變細瀵艱嚧閿欒錛屽鏋滄寚閽堟寚鍚戝姩鎬佸唴瀛樺尯錛岄偅榪欏潡鍐呭瓨浼氫涪澶憋紝鑰屼袱涓寚閽堢浉鍚屼竴涓潡鍐呭瓨錛屽鑷村叾鍊兼棤娉曞垽瀹氾紝鑰屼笖涓や釜鍑芥暟鐨勬瀽鏋勫嚱鏁頒細灝嗚繖鍧楀唴瀛橀噴鏀句袱嬈★紝瀵艱嚧鍑洪敊銆?br>String a("hello");<br>String b("world");<br>String c(a); //璋冪敤鎷瘋礉鏋勯犲嚱鏁幫紝榪樺彲浠ュ啓鎴愶細String c=a;浣嗛鏍艱緝宸?br>c=a;         //璋冪敤璧嬪煎嚱鏁?operator =) 璧嬪煎嚱鏁頒腑娉ㄦ剰鍏堟鏌ヨ嚜璧嬪箋?/p> <p>鍦ㄧ戶鎵垮綋涓紝鏋勯犲嚱鏁幫紝鏋愭瀯鍑芥暟錛岃祴鍊煎嚱鏁伴兘涓嶈兘琚戶鎵匡紝鍦ㄧ紪鍐欏瓙綾繪椂瑕佹敞浠ヤ笅鍑犵偣錛?br>1瀛愮被蹇呴』鍦ㄦ瀯閫犲嚱鏁扮殑鍒濆鍖栬〃璋冪敤鍩虹被鐨勬瀯閫犲嚱鏁般?br>2鐖剁被鍜屽瓙綾葷殑鏋愭瀯鍑芥暟閮藉繀欏繪槸virtual.//鐢ㄤ簬澶氭併?br>3瀛愮被璧嬪煎嚱鏁拌璋冪敤鐖剁被鐨勮祴鍊煎嚱鏁幫細Base::operater=(other);</p> <p><br>瀵瑰嚱鏁板弬鏁板拰榪斿洖鍊艱繘琛宑onst闄愬畾浠呭鎸囬拡鍜屽紩鐢ㄦ湁鎰忎箟錛屽鍊間紶閫掓病鏈夋剰涔夛紝瀵硅緭鍑哄弬鏁頒竴瀹氫笉瑕佺敤const,涓嶇劧鏃犳硶杈撳嚭鍙傛暟銆?/p> <p>閲嶈澆new鍜宒elete鐨勫師鍥犳湁涓や釜錛氶渶瑕佸弽澶嶅垎閰嶅唴瀛橈紝闇瑕佷翰鑷仛榪欎釜宸ヤ綔鎻愰珮鏁堢巼錛岃繕鏈夊氨鏄噺灝戝唴瀛樼鐗囷紝姣斿鍙互棣栧厛浣跨敤闈欐佹垚鍛樻寚閽堜繚鐣欏緢澶т竴鍧楀唴瀛?鍦ㄩ潤鎬佸瓨鍌ㄥ尯)錛屽湪鍏朵腑瀹屾垚鍐呭瓨鐨勫垎閰嶏紝騫惰嚜宸辨爣璁板垎閰嶅拰閲婃斁錛岄噴鏀劇殑鏃跺欙紝鍙槸鏍囪鍐呭瓨錛岃屼笉free閲婃斁銆?br>閲嶈澆鐨刵ew鍜宒elete鍙畬鎴愬唴瀛樼殑鍒嗛厤鍜屽洖鏀跺伐浣溿俷ew鎺ュ彈size_t鍑芥暟錛屽畬鎴愬唴瀛樼殑鍒嗛厤錛岃繑鍥炰竴涓獀oid*鎸囬拡錛宒elete鎺ュ彈涓涓獀oid*鎸囬拡錛屽皢瀹冮噴鏀俱?br>娉ㄦ剰閲嶈澆new鍜宒elete鏈変袱縐嶄笉鍚岀殑褰㈠紡錛屼竴涓敤浜庢瘡嬈″垱寤轟竴涓璞★紝鍙︿竴涓敤鏉ュ垱寤轟竴涓璞℃暟緇勶紝闇瑕佸姞涓奫]銆傚鏋滈噸杞戒簡鍓嶈咃紝閭d箞鍦ㄥ垱寤哄璞℃暟緇勭殑鏃跺欙紝緋葷粺浼氳皟鐢ㄥ叏灞鐨刵ew鍜宒elete.</p> <p>鍙戠幇涓涓湁瓚g殑鐜拌薄錛屽彲浠ヤ嬌鐢ㄥ間負NULL鐨勬寚閽堣皟鐢ㄤ換鎰忓璞$殑鎴愬憳鍑芥暟錛屽彧瑕佸厛寮哄埗杞崲鍒拌繖涓璞★紝騫朵笖璋冪敤鐨勬槸綰唬鐮併?/p> <p>鎴愬憳瀵硅薄鐨勫垵濮嬪寲鍙互鍜岀埗綾繪瀯閫犲嚱鏁扮殑璋冪敤騫舵帓鏀懼湪鍒濆鍖栬〃銆?/p> <p>鍦ㄨ繘鍏ユ瀯閫犲嚱鏁扮殑宸︽嫭鍙峰墠錛屾墍鏈夌殑鎴愬憳鍙橀噺閮藉繀欏昏鍒濆鍖栥?/p> <p>鏋勯犲嚱鏁幫紝鏋愭瀯鍑芥暟錛岃祴鍊艱繍綆楄祴涓嶈緇ф壙銆?/p> <p>綾葷殑鍙嬪厓鑳藉璁塊棶鍏秔rivate,protected鎴愬憳錛屽瓙綾昏兘璁塊棶綾葷殑protected鎴愬憳銆?/p> <p>涓嶈鍦ㄦ瀽鏋勫嚱鏁頒腑鎶涘嚭寮傚父錛屽洜涓哄紓甯稿鐞嗗嚱鏁板湪鑾峰緱寮傚父鍚庤璋冪敤鏋愭瀯鍑芥暟娓呯悊瀵硅薄錛屾鏃跺啀鍙戠敓寮傚父浼氬鑷寸▼搴忔棤娉曞啀鎹曡幏寮傚父錛屽彧鑳界粓姝紙鍙兘鍦ㄨ嚜瀹氫箟鐨剆et_terminate()涓綔鏈鍚庣殑澶勭悊銆傦級銆?/p> <p>鎷瘋礉瀛楃涓茬殑鏂規硶<br>char dest[sz];<br>memset(dest,0,sz);<br>strncpy(dest,source,sz-1);<br>榪欐牱淇濊瘉浜嗕笉浼氳秴榪囩紦鍐插尯涓旂粨灝句負'\0'.</p> <p>寮傚父澶勭悊鍑芥暟浼氶鍏堣皟鐢ㄦ墍鏈夊湪try鍧椾腑鍒涘緩浜嗙殑瀵硅薄鐨勬瀽鏋勫嚱鏁幫紝鐒跺悗鎵ц寮傚父澶勭悊鍑芥暟錛岀劧鍚庣戶緇繍琛屽悗闈㈢殑紼嬪簭銆備絾闂鏄紝濡傛灉涓涓瀽鏋勫嚱鏁板嚭鐜頒簡寮傚父錛屽湪鏋愭瀯鍑芥暟涓紓甯稿墠鍒涘緩鐨勫爢涓婄殑鎵鏈夊璞¢兘鏃犳硶璋冪敤鍏舵瀽鏋勫嚱鏁版甯擱攢姣併傛柟娉曟槸浣跨敤妯℃澘錛屽茍鑷垵濮嬪寲琛ㄥ垱寤鴻繖浜涙ā鏉垮璞°?/p> <p>set_unexpceted鍙互鎴幏娌℃湁琚嚱鏁板紓甯歌鏍艱鏄庡寘鎷緱寮傚父錛岃繕鍙互綆鍗曠殑鐢ㄤ竴涓猼hrow;灝嗚繖涓紓甯鎬綔涓哄凡鐭ュ紓甯稿啀嬈℃姏鍑猴紝濡傛灉鏈夌浉搴旂殑catch璇彞錛岄偅涔堝氨鍙互鎹曡幏榪欎釜寮傚父銆?/p> <p>鎶涘嚭寮傚父鐨勫瓙綾伙紝浼氳鑳藉鎹曡幏鍏剁埗綾誨紓甯哥殑澶勭悊鍣ㄦ崟鑾楓傝繖鏃朵細浜х敓鍒囩墖錛屽嵆澶勭悊鍣ㄦ敹鍒扮殑鏄竴涓埗綾伙紝浣跨敤寮曠敤鑰屼笉鏄紶閫掑煎彲浠ラ伩鍏嶈繖涓棶棰樸?br>      try<br>  {<br>   throw(except("got it"));<br>  }<br>  catch(except &t)<br>  {<br>   t.what();<br>  }</p> <p><br>榪愯鏃剁被褰㈣瘑鍒void鎸囬拡鏃犳晥銆?/p> <p>dynamic_cast<>鐢ㄤ簬鍚戜笅鏄犲皠銆?br>base* b=new derived;<br>derived* d=dynamic_cast<derived*>b; 濡傛灉dynamic_cast澶辮觸鐨勮瘽錛屽皢榪斿洖NULL,鍙互浠ユ鏉ヨ瘯鎺㈢潃鍒ゆ柇鎸囬拡b鐨勭被鍨嬨?/p> <p>RTTI榪樺彲浠ヤ嬌鐢╰ypeinfo().name()鐨勬柟娉曡繑鍥炲璞d銆倀ypeinfo()榪斿洖typeinfo瀵硅薄錛屼嬌鐢ㄥ墠瑕佸寘鍚ご鏂囦歡typeinfo.h.</p> <p>class B<br>class D:public B</p> <p>B* p=new D;<br>B& r=*p;</p> <p>typeid(p)==typeid(B*)<br>typeid(r)!==typeid(D)<br>typeid(*p)==typeid(D)<br>typeid(&r)==typeid(B*)</p> <p>瀵瑰紩鐢ㄧ殑鍔ㄦ佹槧灝勪篃瑕佸埗瀹氬埌涓涓紩鐢ㄤ笂錛屽鏋滃け璐ヤ笉鏄繑鍥濶ULL,鍥犱負搴旂敤涓嶈涓虹┖錛岃屾槸浜х敓涓涓紓甯革紝鍥犳瀵瑰紩鐢ㄧ殑鍔ㄦ佹槧灝勫繀欏諱嬌鐢ㄥ紓甯稿鐞嗐?/p> <p>瀵圭┖鎸囬拡浣跨敤typeid()涔熶細浜х敓寮傚父錛屽彲浠ュ湪浣跨敤涔嬪墠媯鏌ユ寚閽堟槸鍚︿負NULL鏉ラ伩鍏嶈繖涓棶棰樸?/p> <p>鍦ㄥ閲嶇戶鎵跨殑鎯呭喌涓嬶紝浼犵粺鐨勫己鍒剁被鍨嬭漿鎹㈠彲鑳芥棤娉曟甯稿伐浣滐紝浣嗗姩鎬佹槧灝勫拰typeid宸ヤ綔鐨勫緢濂姐?/p> <p>瑕佹槸鍔ㄦ佺被鍨嬬被鍨嬭漿鎹紝闇瑕佸熀綾誨寘鍚玽irtual鎴愬憳鍑芥暟錛屽茍涓攙c緙栬瘧鍣ㄦ湁/GR閫夐」銆傜粡榪囧姩鎬佺被鍨嬭漿鎹紝鐢辯埗綾昏漿鎹㈣屾潵鐨勫瓙綾繪寚閽堝彲浠ヨ皟鐢ㄥ瓙綾諱腑鏂版坊鍔犺岀埗綾諱腑娌℃湁鐨勬柟娉曘?/p> <p>static_cast 閫氬父涓嶆槸蹇呴渶鐨勶紝浣嗗畠浼氳綾誨瀷杞崲鏇村姞閱掔洰銆?/p> <p>const_cast鐢ㄤ簬灝嗗父閲忓拰volatile鏄犲皠緇欐櫘閫氭寚閽堛?/p> <p>reinterpret_cast鏄嵄闄╁茍涓斿彲縐繪鎬у緢宸殑杞崲錛屽畠灝嗗璞$湅浣滀簩榪涘埗鏁拌繘琛岃漿鎹€傛渶濂戒笉瑕佷嬌鐢ㄣ?/p> <p>C++涓紝灝嗙粨鏋勫悕鐩存帴浣滀負綾誨瀷鍚嶄嬌鐢紝鑰屼笉闇瑕佽薄c涓偅鏍蜂嬌鐢╰ypedef  struct 緇撴瀯鍚峽} 綾誨瀷鍚?</p> <p>                    WINDOWS鏍稿績緙栫▼<br>鍐呮牳瀵硅薄錛氭瘡涓唴鏍稿璞¢兘鏄竴涓唴瀛樺潡錛岀敱鍐呮牳緇存姢錛岃繘紼嬪湪鍒涘緩浜嗕竴涓唴鏍稿璞″悗鑾峰緱涓涓彞鏌勶紝閫氬父涓涓繘紼嬬殑鍙ユ焺瀵瑰彟澶栦竴涓繘紼嬫槸娌℃湁鎰忎箟鐨勶紝浣嗗彲浠ラ氳繃涓瀹氭帾鏂藉湪榪涚▼闂村叡浜唴鏍稿璞°傚綋榪涚▼緇堟鍚庯紝瀹冨垱寤虹殑鍐呮牳瀵硅薄涓嶄竴瀹氭秷澶憋紝鍐呮牳緇存姢姣忎釜鍐呮牳瀵硅薄鐨勫紩鐢ㄨ鏁般?/p> <p><br>GDI瀵硅薄涓嶆槸鍐呮牳瀵硅薄錛屽尯鍒嗗唴鏍稿璞″拰GDI瀵硅薄鐨勬柟娉曟槸鍐呮牳瀵硅薄鐨勫垱寤哄嚱鏁扮殑鍙傛暟涓湁瀹夊叏灞炴э紝鑰孏DI瀵硅薄娌℃湁銆?/p> <p>鍐呮牳瀵硅薄鐨勫畨鍏ㄥ睘鎬ч氬父鍦ㄥ垱寤烘湇鍔″櫒紼嬪簭鐨勬椂鍊欑敤鍒幫紝浼犻掍竴涓狽ULL鍙互鑾峰緱緙虹渷鐨勫畨鍏ㄥ睘鎬с?/p> <p>褰撲笉鍐嶄嬌鐢ㄦ煇涓唴鏍稿璞$殑鏃跺欙紝鍙互浣跨敤BOOL CloseHandle(HANDLE)鍏抽棴鍙ユ焺錛岀郴緇熶細鑷姩灝嗗唴鏍稿璞′俊鎭竻闄ゅ嚭榪涚▼鐨勫彞鏌勮〃錛堟鍙ユ焺琛ㄤ繚瀛樹笖浠呬繚瀛樿榪涚▼浣跨敤鐨勬墍鏈夊唴鏍稿璞′俊鎭傦級錛屽茍鑷姩涓哄唴鏍稿璞$殑寮曠敤璁℃暟鍑忎竴銆傚鏋滃繕璁板叧闂彞鏌勪篃涓嶈绱э紝鍦ㄨ繘紼嬫帹鍑哄悗錛岀郴緇熶細鑷姩媯鏌ヨ繘紼嬬殑鍙ユ焺琛紝娓呯悊娌℃湁閲婃斁鐨勫彞鏌勶紝鍥犳蹇樿鍏抽棴鍙ヤ笉涓瀹氫細閫犳垚鍐呭瓨娉勬紡銆?/p> <p>紼嬪簭鐨勮繘鍏ョ偣WinMain鐨勭涓涓弬鏁版椂榪涚▼鐨勫疄渚嬪彞鏌勶紝涔熸槸榪涚▼鏄犲皠鍒拌櫄鎷熷湴鍧絀洪棿鐨勮搗濮嬪湴鍧錛寁c++榛樿鏄?x00400000.鍙互鐢℅etModuleHandle()寰楀埌榪欎釜鍊?br>PTSTR GetCommandLine()鑾峰緱鍛戒護琛?br>PWSTR CommandLineToArgvW()鍒嗚В鍛戒護琛?/p> <p>姣忎釜榪涚▼閮芥湁涓涓笌浠栫浉鍏崇殑鐜鍧椼?br>VarName1=VarValue1\0<br>VarName2=VarValue2\0<br>...............<br>\0</p> <p>GetEnvironmentVariable()  //鑾峰緱鐜鍙橀噺鍊?br>ExpandEnvironmentStrings()//灞曞紑%鍖呰9鐨勭幆澧冨彉閲忓?br>SetEnvironmentVariable()  //璁懼畾鐜鍙橀噺</p> <p>榪涚▼鐨勪翰緙樻э細榪涚▼鐨勭嚎紼嬭寮鴻揩鍐岰PU鐨勫瓙闆嗕笂榪愯銆?/p> <p>瀛愯繘紼嬮粯璁ょ戶鎵跨埗榪涚▼鐨勯敊璇爣蹇椼?br>SetErrorMode(UINT)  //璁懼畾閿欒妯″紡</p> <p>榪涚▼緇存姢褰撳墠椹卞姩鍣ㄥ拰鐩綍淇℃伅<br>GetCurrentDirectory()<br>SetCurrentDirectory()</p> <p>鑾峰緱緋葷粺鐗堟湰錛?br>GetVersion()<br>GetVersionEx()<br>VeryfyVersionInfo()</p> <p><br>GetExitCodeProcess(),瀵逛簬榪樺湪榪愯鐨勮繘紼嬶紝鍙互寰楀埌0x103錛圫TILL_ACTIVE),瀵逛簬緇堟鐨勮繘紼嬶紝濡傛灉榪樻病鏈塁loseHandle(pi.hProcess),鍙互寰楀埌瀹冪殑閫鍑虹爜,鍚﹀垯寰楀埌鐨勬槸涔辯爜銆?/p> <p>windows2000鏀寔浣滀笟綆$悊錛?閫氳繃灝嗚繘紼嬪姞鍏ヤ綔涓氾紝鍙互瀵硅繘紼嬬殑榪愯鏉冮檺錛屼嬌鐢ㄧ殑璧勬簮榪涜闄愬埗銆傛柟娉曞涓嬶細<br>HANDLE hjob=CreateJobObject(NULL,NULL);//鍒涘緩涓涓綔涓氬璞°?br>SetInformationJobObject();//璁懼畾浣滀笟瀵硅薄鐨勫弬鏁幫紝鍖呮嫭瀵硅繘紼嬬殑鍚勭闄愬埗銆?br>CreateProcess(NULL,"CMD",NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);//鍒涘緩鏂拌繘紼嬨?br>AssignProcessToJobObject(hjob,pi.hProcess); //灝嗚繘紼嬪姞鍏ヤ綔涓氥傚彲鍔犲叆澶氫釜銆?br>ResumeThread(pi.hThread);<br>CloseHandle(pi.hThread);<br>HANDLE h[2];<br>h[0]=pi.hProcess;<br>h[1]=hjob;<br>DWORD dw=WaitForMultipleObject(2,h,false,INFINITE);<br>switch(dw-WAIT_OBJECT_0錛?br>  case 0://the process has terminated..<br>  case 1://all of the job's allotted cpu time was used.<br>}<br>CloseHandle(pi.hProcess);<br>CloseHandle(hjob);</p> <p>緇堟浣滀笟涓墍鏈夎繘紼嬬殑榪愯<br>TerminateJobObject(hjob,UINT uExitCode)</p> <p>鏌ヨ浣滀笟緇熻淇℃伅<br>QueryInformationJobObject();</p> <p>鐩戣浣滀笟鐨勮繍琛岋細<br>JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;//鍒涘緩涓涓狪/O瀹屾垚绔彛瀵硅薄<br>SetInformationJobObject(hjob.JobObjectAssociateCompletionPortInformation,&joacp,sizeof(joacp)<br>//灝嗕綔涓氬悓瀹屾垚绔彛瀵圭浉鍏寵仈銆?br>GetQueuedCompletionStatus()  //鐩戞帶I/O绔彛銆?/p> <p>榪涚▼鐢變袱閮ㄥ垎緇勬垚錛氳繘紼嬪唴鏍稿璞★紝 鍦板潃絀洪棿銆傝繘紼嬫槸涓嶆椿娉肩殑錛屽畠鐨勬墽琛屼緷璧栦簬綰跨▼銆?br>綰跨▼鐢變袱閮ㄥ垎緇勬垚錛氱嚎紼嬪唴鏍稿璞★紝綰跨▼鍫嗘爤銆?/p> <p><br>鍒涘緩鏂扮嚎紼嬶細<br>DWORD銆WINAPI FUNC(PVOID pvParam)<br>int Param;<br>DWORD dwThreadID;<br>CreateThread(NULL,0,FUNC,(PVOID)&Param,0,&dwThreadID);</p> <p>媯鏌ョ嚎紼嬫槸鍚﹂鍑猴細<br>BOOL GetExitCodeThread(HANDLE hThread,PDWORD pdwExitCode);//濡傛灉榪樻湭緇堟錛屽緱鍒?x103.</p> <p><br>鑾峰緱浼彞鏌勶細<br>GetCurrentProcess()<br>GetCurrentThread()</p> <p>鑾峰緱榪愯鏃墮棿錛?br>GetProcessTimes()<br>GetThreadTimes()</p> <p>綰跨▼鎴栬繘紼嬬殑浼彞鏌勮漿鍖栦負瀹炲彞鏌勶細<br>DuplicatgeHandle();//姝ゅ嚱鏁頒細澧炲姞鍐呮牳瀵硅薄鐨勫紩鐢ㄨ鏁般?/p> <p>浼彞鏌勭敤浜庢湰綰跨▼錛岃幏寰楄繖涓彞騫朵笉浼氬獎鍝嶅唴鏍稿璞$殑璁℃暟錛岃屽疄鍙ユ焺鐢ㄤ簬浼犻掔粰瀛愯繘紼嬨?/p> <p>綰跨▼鐨勬殏鍋滃拰榪愯錛?br>ResumeThread(HANDLE)<br>SuspendThread(HANDLE)  //浣跨敤姝ゅ嚱鏁拌灝忓績姝婚攣銆?/p> <p>綰跨▼浼戠湢錛?br>Sleep(DWORD dwMilliseconds);<br>鑷姩閫鍑哄綋鍓嶆椂闂寸墖錛?br>SwitchtoThread();</p> <p>鍙互鑾峰緱鍜屼慨鏀圭嚎紼嬬殑涓婁笅鏂囷紝浣跨敤涔嬪墠瑕丼uspendThread()<br>GetThreadContext()<br>SetThreadContext()</p> <p>鏀瑰彉榪涚▼鐨勪紭鍏堢駭://璁頒綇榪涚▼鏄笉鍙互璋冨害鐨勶紝璋冨害鐨勫崟浣嶆槸綰跨▼銆?br>BOOL銆SetPriorityClass();<br>DWORD GetPriorityClass();</p> <p>璁懼畾綰跨▼鐨勭浉瀵逛紭鍏堢駭錛?br>int GetThreadPriority(HANDLE hThread);<br>BOOL SetThreadPriority(Handle hThread,int nPriority);</p> <p>Microsoft淇濈暀浜嗛殢鏃朵慨鏀硅皟搴︾畻娉曠殑鏉冨埄錛屽洜姝や嬌鐢ㄧ浉瀵逛紭鍏堢駭錛屽彲浠ヤ繚璇佺▼搴忓湪灝嗘潵鐨勭郴緇熶笂涔熷彲浠ユ甯歌繍琛屻?br>緇撳悎榪涚▼浼樺厛綰у拰綰跨▼鐨勭浉瀵逛紭鍏堢駭錛屽氨鍙互寰楀埌綰跨▼鐨勫熀鏈紭鍏堢駭銆傜嚎紼嬬殑褰撳墠浼樺厛綰т笉鍙互浣庝簬鍩烘湰浼樺厛綰э紝<br>涔熷氨鏄錛岀郴緇熶細鎻愰珮綰跨▼鐨勪紭鍏堢駭錛屽茍闅忕潃鎵ц鏃墮棿鐗囩殑嫻侀濋檷浣庝紭鍏堢駭錛屼絾闄嶅埌鍩烘湰浼樺厛綰у悗灝變笉鍐嶉檷浜嗐?br>浼樺厛綰?-15鎴愪負鍔ㄦ佷紭鍏堢駭鑼冨洿錛岄珮浜?5鏄疄鏃惰寖鍥達紝緋葷粺涓嶄細璋冨害瀹炴椂鑼冨洿綰跨▼鐨勪紭鍏堢駭錛屼篃涓嶄細鎶婂姩鎬佷紭鍏堢駭鑼冨洿鐨?br>綰跨▼鎻愰珮鍒?5浠ヤ笂銆?/p> <p>浜茬紭鎬ф槸瀵瑰澶勭悊鍣ㄧ郴緇熸潵璇寸殑錛屼負浜嗚兘鍒╃敤淇濈暀鍦╟pu楂橀熺紦瀛樺拰NUMA(闈炵粺涓鍐呭瓨璁塊棶錛夌粨鏋勮綆楁満鏈彃浠舵澘涓婂唴瀛樹腑鐨勬暟鎹紝緋葷粺灝介噺綰跨▼涓婃榪愯浣跨敤鐨凜PU鏉ヨ繍琛岀嚎紼嬶紝鍖呮嫭杞翰緙樻э紙WIN2000榛樿錛夊拰紜翰緙樻э紙鐢ㄦ埛鍙互閫夋嫨CPU)<br>鐩稿叧鐨勫嚱鏁版湁錛?br>BOOL SetProcessAffinityMask(HANDLE hProcess,DWORD_PTR dwProcessAffinityMask);<br>BOOL GetProcessAffinityMask(Handle hProcess,PDWORD_PTR pdwProcessAffinityMask,PDWORD_PTR pdwSystemAffinityMask);<br>DWORD_PTR SetThreadAffinityMask(HANDLE hThread,DWORD_PTR dwThreadAffinityMask);<br>DWORD_PTR SetThreadIdealProcessor(HANDLE hThread,DWORD dwIdealProcessor);</p> <p>涓寸晫鍖轟繚璇佸叾涓殑璧勬簮錛堥氬父鏄悇縐嶅叡浜彉閲忥級琚師瀛愮殑璁塊棶錛屽綋榪涘叆涓寸晫鍖哄悗錛屽叾浠栬闂繖浜涜祫婧愮殑綰跨▼灝嗕笉浼氳璋冨害銆?/p> <p>綰跨▼鍚屾鍖呮嫭鐢ㄦ埛鏂瑰紡鍜屽唴鏍告柟寮忥紝鐢ㄦ埛鏂瑰紡鍖呮嫭鍘熷瓙鎿嶄綔鍜屼復鐣屽尯錛屽畠鐨勭壒鐐規槸閫熷害蹇紝浣嗗姛鑳芥湁闄愩傚唴鏍告柟寮忓埄鐢ㄥ唴鏍稿璞$殑閫氱煡鐘舵佹潵鍚屾綰跨▼錛岀敱浜庨渶瑕佺敱鐢ㄦ埛鏂瑰紡鍒囨崲鍒板唴鏍告柟寮忥紙榪欑鍒囨崲寰堝簾鏃墮棿錛夛紝涓旂郴緇熻榪涜寰堝鎿嶄綔錛屾晥鐜囪緝浣庯紝浣嗗姛鑳藉己澶э紙鑳藉璁懼畾瓚呮椂鍊肩瓑,鍙互鍚屾澶氫釜榪涚▼鐨勭嚎紼嬶級銆?/p> <p>鍐呮牳鏂瑰紡鍚屾鐨勫師鐞嗭細綰跨▼浣胯嚜宸辮繘鍏ヤ紤鐪犵姸鎬侊紝絳夊緟鍐呮牳瀵硅薄鐢辨湭閫氱煡鐘舵佸彉涓哄凡閫氱煡鐘舵併?/p> <p>鍙浜庢湭閫氱煡鐘舵佸彉鍜屽凡閫氱煡鐘舵佺殑鍐呮牳瀵硅薄錛氳繘紼嬶紝綰跨▼錛屼綔涓氾紝鏂囦歡淇敼閫氱煡錛屾椂闂達紝鍙瓑寰呭畾鏃跺櫒錛屾枃浠訛紝鎺у埗鍙拌緭鍏ワ紝淇″彿閲忥紝浜掓枼浣撱?/p> <p>榪涚▼鍜岀嚎紼嬪湪寤虹珛鏃跺浜庢湭閫氱煡鐘舵侊紝鍦ㄩ鍑烘椂鍙樹負宸查氱煡鐘舵併?/p> <p>絳夊緟鍑芥暟錛?br>DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);<br>DWORD WaitForMultipleObject(DWORD dwCount,CONST HANDLE* phObjects,BOOL fWaitALL,DWORD dwMilliseconds);鍏朵腑錛?br>0<dwCount<WAIT_OBJECTS(windows澶存枃浠朵腑瀹氫箟涓?4錛夛紝濡傛灉璁懼畾fWaitALl涓篢RUE,閭d箞鍑芥暟浼氱煡閬撳乏鍙沖璞″彉涓哄凡閫氱煡鐘舵佹墠浼氳繑鍥烇紝濡傛灉浼犻扚ALSE錛岄偅涔堝彧瑕佹湁涓涓璞″彉涓哄凡閫氱煡鐘舵侊紝鍑芥暟灝變細榪斿洖銆?br>榪斿洖鍊肩殑鍚箟錛?br>HANDLE h[3];<br>h[0]=hProcess1;<br>h[1]=hProcess2;<br>h[2]=hProcess3;<br>DWORD dw=WaitForMultipleObject(3,h,FALSE,5000);<br>switch(dw)<br>{<br>    case WAIT_FAILED://Bad call to function(invalid handle?)<br>         break;<br>    case WAIT_TIMEOUT錛?/None of the object became signaled within 5000 milliseconds.<br>         break;<br>    case WAIT_OBJECT_0+0:The process identified by h[0] terminated.<br>         break;<br>    case WAIT_OBJECT_0+1:<br>         break;<br>    case WAIT_OBJECT_0+2:<br>         break;<br>}<br>//WaitForSingleObject()鐨勮繑鍥炲煎彧鏈夊墠涓夌鎯呭喌銆傚鏋滅粰WaitForMutipleObject()鐨刦WaitAll鍙傛暟浼犻扵RUE,閭d箞鍏惰繑鍥炲間篃鍙湁鍓嶄笁縐嶃?/p> <p>浜嬩歡鍐呮牳瀵硅薄錛氭湁涓ょ錛屼漢宸ヤ簨浠跺璞★細褰撳畠寰楀埌閫氱煡鐨勬椂鍊欙紝鎵鏈夌瓑寰呯殑綰跨▼閮藉彉涓哄彲璋冨害綰跨▼錛涜嚜鍔ㄩ噸緗殑浜嬩歡錛氬綋浜嬩歡寰楀埌閫氱煡鐨勬椂鍊欙紝鍙湁涓涓瓑寰呯嚎紼嬪彉涓哄彲璋冨害鐨勭嚎紼嬨傚垱寤轟簨浠跺唴鏍稿璞★細<br>HANDLE CreateEvent(PSECURITY_ATTRIBUTES psa,BOOL fManualReset,BOOL fInitialState,PCTSTR pszName);<br>灝嗕簨浠舵敼涓洪氱煡鐘舵侊細<br>BOOL SetEvent(HANDLE hEvent);<br>灝嗕簨浠舵敼涓烘湭閫氱煡鐘舵侊細<br>BOOL ResetEvent(HANDLE hEvent);<br>濡傛灉浜嬩歡鏄嚜鍔ㄩ噸緗簨浠訛紝閭d箞鎴愬姛絳夊緟浼氫駭鐢熷壇浣滅敤錛屽嵆灝嗕簨浠惰嚜鍔ㄧ疆涓烘湭閫氱煡鐘舵併傚鏋滄槸浜哄伐浜嬩歡瀵硅薄錛屽垯娌℃湁鍓綔鐢ㄣ?/p> <p>絳夊緟瀹氭椂鍣ㄥ唴鏍稿璞★細鏄湪鏌愪釜鏃墮棿鎴栨寜瑙勫畾鐨勯棿闅旀椂闂村彂鍑鴻嚜宸辯殑淇″彿閫氱煡鐨勫唴鏍稿璞°?br>HANDLE CreateWaitableTimer(PSECURITY_ATTRIBUTES psa,BOOL fManualReset,PCSTR pszName);<br>鍒濆鎬繪槸鏈氱煡鐘舵併?br>BOOL SetWaitableTimer(<br>HANDLE hTimer,<br>const LARGE_INTEGER *pDueTime,<br>LONG lPeriod,<br>PTIMERAPCROUTINE pfnCompletionRoutine,<br>PVOID pvArgToCompletionRoutine,<br>BOOL fResume);<br>鍙栨秷瀹氭椂鍣細<br>BOOL CancelWaitableTimer(HANDLE hTimer);<br>濡傛灉浠呮兂鏀瑰彉鎶ユ椂鏉′歡錛屼笉鐢ㄨ皟鐢ㄨ繖涓嚱鏁版殏鍋滄姤鏃跺櫒錛岀洿鎺ヨ皟鐢⊿etWaitableTimer()灝卞彲浠ヤ簡銆?/p> <p>淇″彿閲忓唴鏍稿璞?br>濡傛灉褰撳墠璧勬簮鐨勬暟閲忓ぇ浜?錛屽彂鍑轟俊鍙?br>濡傛灉褰撳墠璧勬簮鏁伴噺絳変簬0錛屼笉鍙戝嚭淇″彿<br>鍐充笉鍏佽璧勬簮鏁伴噺涓鴻礋鍊箋?br>鍒涘緩淇″彿閲忥細<br>HANDLE CreateSemaphore(PSECURITY_ATTRIBUTE psa,<br>LONG lInitialCount,<br>LONG lMaximumCount,<br>PCSTR pszName);<br>閫掑璧勬簮錛?br>BOOL ReleaseSemaphore(HANDLE hsem,<br>LONG lReleaseCount,<br>PLONG plPreviousCount);</p> <p>浜掓枼浣撳唴鏍稿璞★細浜掓枼浣撶‘淇濆鍗曚釜璧勬簮鐨勪簰鏂ヨ闂傚畠鍖呭惈涓涓嬌鐢ㄦ暟閲忥紝涓涓嚎紼婭D,涓涓掑綊璁℃暟鍣?br>涓庝復鐣屽尯鐨勫尯鍒細鑳藉鍚屾澶氫釜榪涚▼涓殑綰跨▼錛屽彲浠ヨ瀹氳秴鏃跺箋?br>濡傛灉ID涓?錛岄偅涔堣〃紺烘病鏈夌嚎紼嬪崰鐢ㄤ簰鏂ヤ綋錛屼簰鏂ヤ綋鍙戝嚭淇″彿銆?br>濡傛灉ID涓嶄負0錛岃〃紺哄崰鐢ㄨ祫婧愮殑綰跨▼ID錛屼笉鍙戝嚭淇″彿銆?/p> <p>HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa,<br>BOOL fInitialOwner,<br>PCTSTR銆pszName);</p> <p>閲婃斁璧勬簮錛?br>BOOL ReleaseMutex(HANDLE hMutex);</p> <p>棰濆鐨勫嚱鏁幫細<br>DWORD SingalObjectAndWait(<br>HANDLE hObjectToSignal,<br>HANDLE hObjectToWaitOn,<br>DWORD dwMilliseconds,<br>BOOL fAlertable);<br>鍙戝嚭涓涓氱煡淇″彿騫剁瓑寰呭彟涓涓氱煡錛屾晥鐜囨瘮鍒嗗埆鎿嶄綔鎻愰珮寰堝銆?/p> <p>windows2000鎻愪緵浜嗗涓嬪嚑縐嶇嚎紼嬫睜鍑芥暟鐢ㄤ簬綰跨▼綆$悊錛?br>涓銆佸紓姝ヨ皟鐢ㄥ嚱鏁?<br>BOOL QueueUserWorkItem(<br>PTHREAD_START_ROUTINE pfnCallback,<br>PVOID pvContext錛?br>ULONG dwFlags);<br>璇ュ嚱鏁板皢“宸ヤ綔欏圭洰”鏀懼叆綰跨▼姹犲茍涓旂珛鍗寵繑鍥炪傚伐浣滈」鐩槸鎸囦竴涓敤pfnCallback鍙傛暟鏍囪瘑鐨勫嚱鏁般傚畠琚皟鐢ㄥ茍涓斾紶閫掑崟涓弬鏁皃vContext.宸ヤ綔欏圭洰鍑芥暟鍘熷瀷濡備笅錛?br>DWORD WINAPI WorkItemFunc(PVOID pvContext);<br>dwFlags鍙傛暟錛歐T_EXECUTEDEFAULT  宸ヤ綔欏圭洰鏀懼叆闈濱/O緇勪歡寰楃嚎紼嬩腑<br>             WT_EXECUTEINIOTHREAD 宸ヤ綔欏圭洰鏀懼叆I/O緇勪歡鐨勭嚎紼嬩腑錛岃繖鏍風殑綰跨▼鍦↖/O璇鋒眰娌℃湁瀹屾垚涔嬪墠涓嶄細琚粓姝㈣繍琛?nbsp;                                 錛岄槻姝㈠洜涓虹嚎紼嬭緇堟瀵艱嚧I/O璇鋒眰涓㈠け銆?br>             WT_EXECUTEINPERSISTENTTHREAD 鏀懼叆姘鎬箙綰跨▼姹狅紝<br>             WT_EXECUTELONGFUNCTION  宸ヤ綔欏圭洰闇瑕侀暱鏃墮棿鐨勫伐浣滐紝緋葷粺浼氭嵁姝ゅ畨鎺掓洿澶氱殑綰跨▼銆?/p> <p>綰跨▼姹犱笉鑳借緗嚎紼嬩釜鏁扮殑涓婇檺錛屽惁鍒欐帓闃熶釜鏁拌秴榪囩嚎紼嬩釜鏁頒笂闄愮殑鏃跺欙紝浼氬鑷存墍鏈夌殑綰跨▼閮借涓柇銆?/p> <p>宸ヤ綔欏圭洰鍑芥暟濡傛灉璁塊棶浜嗗凡緇忚鍗歌澆鐨凞LL,浼氫駭鐢熻繚瑙勮闂?/p> <p><br>浜屻佹寜瑙勫畾鐨勬椂闂撮棿闅旇皟鐢ㄥ嚱鏁?br>鍒涘緩瀹氭椂鍣ㄩ槦鍒楋細<br>HANDLE CreateTimerQueue();<br>鍦ㄩ槦鍒椾腑鍒涘緩瀹氭椂鍣細<br>BOOL CreateTimerQueueTimer(<br>PHANDLE phNewTimer,<br>HANDLE hTimerQueue,<br>WAITORTIMERCALLBACK pfnCallback,<br>PVOID pvContext,<br>DWORD dwDueTime,<br>DWORD dwPeriod,<br>ULONG dwFlags);<br>宸ヤ綔鍥炶皟鍑芥暟鍘熷瀷濡備笅錛?br>VOID WINAPI WaitOrTimerCallback(<br>PVOID pvContext,<br>BOOL fTimerOrWaitFired);<br>dwFlags姣斿墠闈㈢殑澶氫簡涓涓爣蹇楋細WT_EXECUTEINTIMERTHREAD,琛ㄧず鐢辯粍浠剁殑瀹氭椂鍣ㄧ嚎紼嬶紙瀹氭椂鍣ㄧ粍浠跺彧鏈変竴涓嚎紼嬶級榪愯榪欎釜<br>宸ヤ綔鍑芥暟錛屾鏃剁殑宸ヤ綔鍑芥暟蹇呴』鏄緢蹇繑鍥炵殑錛屽惁鍒欏畾鏃跺櫒緇勪歡灝嗘棤娉曞鐞嗗叾浠栫殑璇鋒眰銆?/p> <p>鍒犻櫎瀹氭椂鍣細<br>BOOL DeleteTimerQueueTimer(<br>HANDLE hTimerQueue,<br>HANDLE hTimer,<br>HANDLE hCompletionEvent);<br>鍦ㄥ畾鏃跺櫒綰跨▼涓垹闄ゅ畾鏃跺櫒浼氶犳垚姝婚攣銆傝瀹歨CompletionEvent涓篒NVALID_HANDLE_VALUE錛岄偅涔堝湪瀹氭椂鍣ㄧ殑鎵鏈夋帓闃熷伐浣滈」鐩病鏈夊畬鎴愪箣鍓嶏紝DeleteTimerQueueTimer涓嶄細榪斿洖錛屼篃灝辨槸璇村湪宸ヤ綔欏圭洰涓瀹氭椂鍣ㄨ繘琛屼腑鏂垹闄や細姝婚攣銆傚彲浠ョ粰hCompletionEvent浼犻掍簨浠跺彞鏌勶紝鍑芥暟浼氱珛鍗寵繑鍥烇紝鍦ㄦ帓闃熷伐浣滃畬鎴愪箣鍚庯紝浼氳緗浜嬩歡銆?/p> <p>閲嶆柊璁懼畾瀹氭椂鍣細//涓嶈兘淇敼宸茬粡瑙﹀彂鐨勫崟姝ュ畾鏃跺櫒銆?br>BOOL ChangeTimerQueueTimer(<br>HANDLE hTimerQueue,<br>HANDLE hTimer,<br>ULONG dwDueTime,<br>ULONG dwPeriod;</p> <p>鍒犻櫎瀹氭椂鍣ㄩ槦鍒楋細<br>BOOL DeleteTimerQueueEx(<br>HANDLE hTimerQueue,<br>HANDLE hCompletionEvent);</p> <p>涓夈佸綋鍗曚釜鍐呮牳瀵硅薄鍙樹負宸查氱煡鐘舵佹椂璋冪敤鍑芥暟<br>BOOL RegisterWaitForSIngleObject(<br>PHANDLE phNewWaitObject,<br>HANDLE hObject,<br>WAITORTIMERCALLBACK pfnCallback,<br>PVOID pvContext,<br>ULONG dwMilliseconds,<br>ULONG dwFlags);<br>pfnCallBack鍘熷瀷錛?br>VOID WINAPI WaitOrTimerCallbadkFunc(<br>PVOID pvContext,<br>BOOLEAN fTimerorWaitFired);<br>濡傛灉絳夊緟瓚呮椂錛宖TimerorWaitFired==TRUE,濡傛灉鏄凡閫氱煡鐘舵侊紝鍒欎負FALSE.</p> <p>dwFlags鍙互浼犻掑弬鏁幫細WT_EXECUTEINWAITTHREAD,瀹冭絳夊緟緇勪歡寰楃嚎紼嬩箣涓榪愯宸ヤ綔欏圭洰鍑芥暟銆傛敞鎰忛」鍚屽墠銆?/p> <p>濡傛灉絳夊緟鐨勫唴鏍稿璞℃槸鑷姩閲嶇疆鐨勶紝閭d箞浼氬鑷村伐浣滃嚱鏁拌鍙嶅璋冪敤錛屼紶閫扺T_EXECUTEONLYONCE浼氶伩鍏嶈繖縐嶆儏鍐點?/p> <p>鍙栨秷絳夊緟緇勪歡鐨勬敞鍐岀姸鎬侊細<br>BOOL UnregisterWaitEx(<br>HANDLE hWaitHandle,<br>HANDLE hCompletionEvent);</p> <p>鍥涖佸綋寮傛I/O璇鋒眰瀹屾垚鏃惰皟鐢ㄥ嚱鏁?br>灝嗚澶囧拰綰跨▼姹犵殑闈濱/O緇勪歡鍏寵仈<br>BOOL BindIoCompletionCallback(<br>HANDLE hDevice,<br>POVERLAPPED_COMPLETION_ROUTINE pfnCallback,<br>ULONG dwFlags//濮嬬粓涓?);</p> <p>宸ヤ綔鍑芥暟鍘熷瀷錛?br>VOID WINAPI OverlappedCompletionRoutine(<br>DWORD dwErrorCode,<br>DWORD dwNumberOfBytesTransferred,<br>                         ,<br>POVERLAPPED pOverlapped);</p> <p>Windows鐨勫唴瀛樼粨鏋?/p> <p>浠?8錛?000錛屽埌64浣嶇殑windows,鍐呭瓨綆$悊鏂瑰紡閮芥槸涓嶅悓鐨勶紝32浣嶇殑win2000鐢ㄦ埛鍐呭瓨鏄粠0x10000鍒?x7fffffff錛?4kB-2G),2000 Advanced server鍙互杈懼埌錛?4kB-3G),鍏朵腑鏈楂?4kB涔熸槸紱佹榪涘叆鐨勩傚啀寰涓婂垯鐢辯郴緇熶嬌鐢ㄣ?8鍒欐槸浠?x400000-0x7fffffff(4M-2G),2G-3G鏄郴緇熺敤鏉ュ瓨鏀?2浣嶅叡浜暟鎹殑鍦版柟錛屽寰堝緋葷粺鍔ㄦ佽繛鎺ュ簱銆?-4M鏄負浜嗗吋瀹?6浣嶇▼搴忎繚鐣欑殑銆?G-4G鐢辯郴緇熻嚜韜嬌鐢ㄣ?8鐨勫唴鏍稿尯鏄笉鍙椾繚鎶ょ殑錛?000鍙椾繚鎶ゃ?br>瀵硅櫄鎷熷湴鍧絀洪棿鐨勫垎閰嶇О浣滀繚鐣欙紝浣跨敤铏氭嫙鍐呭瓨鍒嗛厤鍑芥暟(VirtualAlloc),閲婃斁浣跨敤VirtualFree(),鐩墠錛屾墍鏈塩pu騫沖彴鐨勫垎閰嶇矑搴﹂兘鏄?4kB,欏甸潰澶у皬鍒欎笉鍚岋紝x86鏄?kB,Alpha鏄?kB,緋葷粺鍦ㄤ繚鐣欏唴瀛樼殑鏃跺欒瀹氳浠庡垎閰嶇矑搴﹁竟鐣屽紑濮嬶紝騫朵笖鏄〉闈㈢殑鏁存暟鍊嶏紝鐢ㄦ埛浣跨敤VirtualAlloc閮介伒瀹堣繖涓瀹氾紝浣嗙郴緇熶笉鏄紝瀹冩槸浠庨〉闈㈣竟鐣屽紑濮嬪垎閰嶇殑銆?/p> <p>灝嗙墿鐞嗗瓨鍌ㄥ櫒鏄犲皠鍒頒繚鐣欑殑鍐呭瓨鍖哄煙鐨勮繃紼嬬О涓烘彁浜ょ墿鐞嗗瓨鍌ㄥ櫒錛屾彁浜ゆ槸浠ラ〉闈負鍗曚綅榪涜鐨勶紝涔熶嬌鐢╒irtualAlloc鍑芥暟銆?/p> <p>鐗╃悊瀛樺偍鍣ㄦ槸鐢卞唴瀛樺拰錛堢‖鐩樹笂鐨勶級欏墊枃浠剁粍鎴愮殑錛屽鏋滆闂殑鏁版嵁鏄湪欏墊枃浠朵腑錛屽垯縐頒負欏甸潰澶辨晥錛宑pu浼氭妸璁塊棶閫氱煡鎿嶄綔緋葷粺錛屾搷浣滅郴緇熻礋璐e皢鏁版嵁璋冨叆鍐呭瓨錛屽茍鎸囧cpu鍐嶆榪愯涓婃澶辨晥鐨勬寚浠ゃ?/p> <p>褰撳惎鍔ㄤ竴涓▼搴忕殑鏃跺欙紝緋葷粺騫朵笉鏄皢鏁翠釜鏂囦歡璇誨叆鍐呭瓨鎴栬呴〉鏂囦歡錛岃屾槸灝嗚繖涓枃浠剁洿鎺ユ槧灝勫埌铏氭嫙鍐呭瓨絀洪棿錛屽茍灝嗛渶瑕佺殑鏁版嵁璇誨叆鍐呭瓨錛屽嵆灝嗙‖鐩樹笂鐨勬枃浠舵湰韜綋浣滈〉鏂囦歡錛堣櫧鐒朵笉鏄級銆傚綋紜洏涓婄殑涓涓▼搴忕殑鏂囦歡鏄犲儚錛堣繖鏄釜exe鏂囦歡鎴栬卍ll鏂囦歡錛夌敤浣滃湴鍧絀洪棿鐨勭墿鐞嗗瓨鍌ㄥ櫒錛屽畠縐頒負鍐呭瓨鏄犲皠鏂囦歡銆傚綋涓涓?exe鎴栬卍ll鏂囦歡琚姞杞芥椂錛岀郴緇熷皢鑷姩淇濈暀涓涓湴鍧絀洪棿鐨勫尯鍩燂紝騫跺皢璇ユ枃浠舵槧灝勫埌璇ュ尯鍩熶腑銆備絾緋葷粺涔熸彁渚涗簡涓緇勫嚱鏁幫紝鐢ㄤ簬灝嗘暟鎹枃浠舵槧灝勫埌涓涓湴鍧絀洪棿鐨勫尯鍩熶腑銆?/p> <p><br>鐗╃悊瀛樺偍鍣ㄧ殑欏甸潰鍏鋒湁涓嶅悓鐨勪繚鎶ゅ睘鎬э細<br>PAGE_NOACESS<br>PAGE_READONLY<br>PAGE_READWRITE<br>PAGE_EXECUTE<br>PAGE_EXECUTE_READ<br>PAGE_EXECUTE_READWRITE<br>PAGE_WRITECOPY<br>PAGE_EXECUTE_WRITECOPY<br>鍚庝袱涓睘鎬ф槸閰嶅悎鍏變韓欏甸潰鏈哄埗浣跨敤鐨勩俉INDOWS鏀寔澶氫釜榪涚▼鍏變韓鍗曚釜鍐呭瓨鍧楋紝姣斿榪愯notepad鐨?0涓疄渚嬶紝鍙互璁╀粬浠叡浜簲鐢ㄧ▼搴忕殑浠g爜鍜屾暟鎹紝榪欐牱鍙互澶уぇ鎻愰珮鎬ц兘錛屼絾瑕佹眰璇ュ唴瀛樺潡鏄笉鍙啓鐨勩備簬鏄郴緇熷湪璋冨叆.exe鎴栬卍ll鐨勬椂鍊欙紝浼氳綆楅偅浜涢〉闈㈡槸鍙互鍐欏叆鐨勶紝涓鴻繖浜涢〉闈㈠垎閰嶈櫄鎷熷唴瀛樸傜劧鍚庡悓鍏朵粬鐨勯〉闈竴璧鋒槧灝勫埌涓鍧楄櫄鎷熷唴瀛橈紝浣嗚祴PAGE_WRITECOPY鎴栬匬AGE_EXECUTE_WRITECOPY灞炴?閫氬父鍖呭惈浠g爜鐨勫潡鏄疨AGE_EXECUTE_READ錛屽寘鍚暟鎹殑鍧楁槸PAGE_READWRITE)銆傚綋涓涓繘紼嬭瘯鍥懼皢鏁版嵁鍐欏叆鍏變韓鍐呭瓨鍧楁椂錛岀郴緇熶細榪涜濡備笅鎿嶄綔錛氬鎵鵑鍏堝垎閰嶇殑涓涓┖闂查〉闈紝灝嗚瘯鍥句慨鏀圭殑欏甸潰鎷瘋礉鍒拌繖涓┖闂查〉闈紝璧嬩簣PAGE_READWRITE鎴栬匬AGE_EXECUTE_READWRITE灞炴э紝鐒跺悗鏇存柊榪涚▼鐨勯〉闈㈣〃錛屼嬌寰楃敤鎴峰彲浠ュ鏂扮殑欏甸潰榪涜鍐欏叆銆?/p> <p>榪樻湁涓変釜鐗規畩鐨勪繚鎶ゅ睘鎬э細PAGE_NOCACHE PAGE_WRITECOMBINE PAGE_GUARD,鍓嶄袱涓敤浜庨┍鍔ㄧ▼搴忓紑鍙戯紝鏈鍚庝竴涓彲浠ヨ搴旂敤紼嬪簭鍦ㄩ〉闈㈣鍐欏叆鐨勬椂鍊欒幏寰椾竴涓紓甯搞?/p> <p>鍧楃殑鎰忔濇槸涓緇勭浉閭葷殑欏甸潰錛屽畠浠叿鏈夌浉鍚岀殑淇濇姢灞炴э紝騫朵笖鍙楃浉鍚岀被鍨嬬殑鐗╃悊瀛樺偍鍣ㄦ敮鎸併?br>璧嬩簣铏氭嫙鍐呭瓨欏甸潰淇濇姢灞炴х殑鎰忎箟鏄負浜嗘彁楂樻晥鐜囷紝鑰屼笖榪欎釜灞炴ф諱細琚墿鐞嗗瓨鍌ㄥ櫒鐨勪繚鎶ゅ睘鎬у彇浠c?/p> <p>濡傛灉鏁版嵁鍦ㄥ唴瀛樹腑娌℃湁瀵歸綈錛岄偅涔坈pu瑕佸嬈¤闂墠鑳藉緱鍒版暟鎹紝鏁堢巼寰堜綆銆?/p> <p>鍐呭瓨綆$悊鍑芥暟錛?/p> <p>鑾峰緱緋葷粺淇℃伅錛?br>VOID GetSystemInfo(LPSYSTEM_INFO psinf);//鍙互寰楀埌欏甸潰澶у皬錛屽垎閰嶇矑搴︼紝鏈澶у唴瀛樺湴鍧錛屾渶灝忓唴瀛樺湴鍧銆?/p> <p>鑾峰緱鍐呭瓨鐘舵侊細<br>VOID GlobalMemoryStatus(LPMEMORYSTATUS pmst);</p> <p>鑾峰緱鍐呭瓨鍦板潃鐨勬煇浜涗俊鎭細<br>DWORD VirtualQuery(<br>LPVOID pvAddress,<br>PMEMORY_BASIC_INFORMATION pmbi,<br>DWORD dwLength);</p> <p>DWORD VirtualQuery(<br>HANDLE hProcess,<br>LPVOID pvAddress,<br>PMEMORY_BASIC_INFORMATION pmbi,<br>DWORD dwLength);</p> <p>鍐呭瓨鏄犲皠鏂囦歡鐨勪紭鐐癸細<br>1 鑺傜渷欏甸潰鏂囦歡;<br>2 鍔犲揩紼嬪簭鍚姩錛?br>3 鍦ㄥ涓繘紼嬮棿鍏變韓鏁版嵁銆?/p> <p>榪涚▼鐨勫惎鍔ㄨ繃紼嬶細<br>緋葷粺棣栧厛灝?exe鏂囦歡鏄犲皠鍒板湴鍧絀洪棿錛岀己鐪佸熀鍦板潃鏄?x400000,鐒跺悗鏌ヨ.exe鐨勮緭鍏ヨ〃錛屽皢鍏朵嬌鐢ㄧ殑鎵鏈?dll涔熸槧灝勫埌鍦板潃絀洪棿錛堝熀鍦板潃鍦ㄦ瘡涓?dll鏂囦歡涓紝濡傛灉涓嶈兘婊¤凍錛岄渶瑕侀噸瀹氫綅錛夛紝鐒跺悗灝嗘墽琛?exe鐨勫惎鍔ㄤ唬鐮併傛鏃?exe鏂囦歡榪樺湪紜洏涓娿傛瘡嬈′唬鐮佽煩鍒頒竴涓皻鏈姞杞藉埌鍐呭瓨鐨勬寚浠ゅ湴鍧錛屽氨浼氬嚭鐜頒竴涓敊璇紝緋葷粺浼氬彂鐜拌繖涓敊璇紝騫跺皢浠g爜鍔犲啀鍒板唴瀛樹腑銆?br>濡傛灉鍐嶅垱寤鴻繖涓?exe鏂囦歡鐨勪竴涓疄渚嬨傞偅涔堢洿鎺ュ皢鍘熸潵鐨勫湴鍧絀洪棿涓殑鍐呭鏄犲皠鍒版柊鐨勫湴鍧絀洪棿灝卞彲浠ヤ簡銆傝繖鏍峰涓疄渚嬪氨鍙互鍏變韓鐩稿悓鐨勪唬鐮佸拰鏁版嵁銆傚鏋滄煇涓疄渚嬭鏀瑰彉鍏變韓鍐呭錛岀郴緇熷氨涓鴻鏇存敼鐨勯〉闈㈢敵璇蜂竴涓柊鐨勯〉闈紝灝嗗唴瀹規嫹璐濅竴浠斤紝鐒跺悗鐢ㄦ柊鐨勯〉闈唬鏇垮湴鍧絀洪棿涓師鏉ラ〉闈㈢殑鏄犲皠灝卞彲浠ヤ簡銆?8鍚?000涓嶅悓錛屽畠涓嶅緟淇敼渚跨珛鍗充負鎵鏈夌殑瀹炰緥鍒嗛厤鏂扮殑欏甸潰銆?/p> <p>浣跨敤鍐呭瓨鏄犲皠鏂囦歡錛?br>1 鍒涘緩鎴栨墦寮涓涓枃浠跺唴鏍稿璞★細<br>HANDLE CreateFile(<br>PCSTR pszFileName,<br>DWORD dwDesiredAccess,<br>DWORD dwShareMode,<br>PSECURITY_ATTRIBUTES psa,<br>DWORD dwCreationDisposition,<br>DWORD dwFlagsAndAttributes,<br>HANDLE hTemplateFile);<br>澶辮觸鐨勮繑鍥炲兼槸INVALID_HANDLE_VALUE<br>2 鍒涘緩涓涓枃浠舵槧灝勫唴鏍稿璞★細<br>HANDLE CreateFileMapping(<br>HANDLE hFile,<br>PSECURITY_ATTRIBUTES psa,<br>DWORD fdwProtect,<br>DWORD dwMaximumSizeHigh,<br>DWORD dwMaximumSizeLow,<br>PCTSTR pszName);<br>濡傛灉緇欏嚱鏁扮殑fdwProtect浼犻扨AGE_READWRITE鏍囧織錛岄偅涔堢鐩樹笂鏂囦歡鐨勫ぇ灝忎細鍙樹負鍚屾槧鍍忔枃浠剁浉鍚屽ぇ灝忋?br>澶辮觸鐨勮繑鍥炲兼槸NULL銆?/p> <p>3 灝嗘枃浠舵槧灝勫埌榪涚▼鐨勫湴鍧絀洪棿錛?br>PVOID MapViewOfFile(<br>HANDLE hFileMappingObject,<br>DWORD dwDesiredAccess,<br>DWORD dwFileOffsetHigh,<br>DWORD dwFileOffsetLow,<br>SIZE_T dwNumberOfBytesToMap);<br>windows2000浼氭牴鎹姹傚皢閮ㄥ垎鏂囦歡鏄犲皠鍒板湴鍧絀洪棿錛岃寃in98鎬繪槸鎶婂叏閮ㄥ唴瀹規槧灝勫埌鍦板潃絀洪棿錛屽茍涓斾粎鑳芥槧灝勫埌2G-3G絀洪棿錛屾絀洪棿涓哄叡浜┖闂達紝鎵鏈夌殑榪涚▼濡傛灉鏄犲皠鐩稿悓鐨勬枃浠訛紝閭d箞閮戒細鏄犲皠鍒扮浉鍚岀殑鍦板潃錛屼竴涓繘紼嬬敋鑷充笉蹇呮槧灝勫氨鍙互璁塊棶榪欎釜絀洪棿閲屽叾浠栬繘紼嬬殑鏄犲皠鏂囦歡錛寃in2000澶氫釜榪涚▼鏄犲皠鍚屼竴涓枃浠惰繑鍥炵殑鍦板潃閫氬父鏄笉鍚岀殑銆?br>4 浠庤繘紼嬬殑鍦板潃絀洪棿涓挙閿鏂囦歡鏁板彞鐨勬槧鍍?br>BOOL UnmapViewOfFile(PVOID pvBaseAddress);</p> <p>灝嗘枃浠舵槧鍍忓啓鍏ョ鐩橈細<br>BOOL FlushViewOfFile(<br>PVOID pvAddress,<br>SIZE_T dwNumberOfBytesToFlush);</p> <p>windows淇濊瘉鍗曚釜鏂囦歡鏄犲皠瀵硅薄鐨勫涓鍥懼叿鏈夌浉鍏蟲с備絾涓嶄繚璇佷絾涓枃浠剁殑澶氫釜鏄犲皠瀵硅薄鏈夌浉鍏蟲с?/p> <p>浣跨敤MapViewOfFileEx浠f浛MapViewOfFile鍙互璁懼畾鏂囦歡鏄犲皠鐨勫熀鍦板潃錛?br>PVOID MapViewOfFileEx(<br>HANDLE hFileMappingObject,<br>DWORD dwDesiredAccess,<br>DWORD dwFileOffsetHigh,<br>DWORD dwFileOffsetLow,<br>SIZE_T dwNumberOfBytesToMap,<br>PVOID pvBaseAddress);</p> <p>浣跨敤鍐呭瓨鏄犲皠鏂囦歡鍦ㄨ繘紼嬮棿鍏變韓鏁版嵁<br>鍏變韓鏈哄埗錛歊PC ,COM,OLE,DDE,紿楀彛娑堟伅錛圵M_COPYDATA),鍓創鏉匡紝閭錛岀閬擄紝濂楁帴瀛椼?br>鍦ㄥ崟鏈轟笂錛屽畠浠殑搴曞眰瀹炵幇鏂規硶閮芥槸鍐呭瓨鏄犲皠鏂囦歡銆?/p> <p>鍙互鍦ㄩ〉鏂囦歡涓洿鎺ュ垱寤烘枃浠舵槧灝勫璞★紝鏂規硶鏄粰CreateFileMapping鍑芥暟鐨刪File鍙傛暟浼犻捍NVALID_HANDLE_VALUE.娉ㄦ剰錛?br>CreateFile()鍑芥暟榪愯澶辮觸涔熶細榪斿洖榪欎釜鍙傛暟錛屽洜姝や竴瀹氳媯鏌reateFile錛堬級鐨勮繑鍥炲箋傝浣忥紝鏂囦歡鍑芥暟榪愯澶辮觸鐨勫彲鑳芥уお澶т簡銆?/p> <p>絎笁绔狅細澶氫釜榪涚▼鍏變韓瀵硅薄銆?/p> <p>鍫嗘爤錛氫紭鐐癸細鍙互涓嶈冭檻鍒嗛厤綺掑害鍜岄〉闈㈣竟鐣屼箣綾葷殑闂錛岄泦涓簿鍔涘鐞嗘墜澶寸殑浠誨姟錛岀己鐐規槸錛氬垎閰嶅拰閲婃斁鍐呭瓨鍧楃殑閫熷害姣斿叾浠栨満鍒舵參錛屽茍涓旀棤娉曠洿鎺ユ帶鍒剁墿鐞嗗瓨鍌ㄥ櫒鐨勬彁浜ゅ拰鍥炴敹銆?/p> <p>榪涚▼鐨勯粯璁ゅ爢鏍堟槸1MB,鍙互浣跨敤/HEAP閾炬帴寮鍏寵皟鏁村ぇ灝忥紝DLL娌℃湁鐩稿叧鐨勫爢鏍堛?/p> <p>鍫嗘爤鐨勯棶棰樺湪浜庯細寰堝windows鍑芥暟瑕佷嬌鐢ㄤ復鏃跺唴瀛樺潡錛岃繘紼嬬殑澶氫釜綰跨▼瑕佸垎閰嶅唴瀛樺潡錛岃繖浜涘唴瀛橀兘鏄湪榛樿鍫嗘爤涓婂垎閰嶇殑錛屼絾瑙勫畾鏃墮棿鍐咃紝姣忔鍙兘鐢變竴涓嚎紼嬭兘澶熷垎閰嶅拰閲婃斁榛樿鍫嗘爤鐨勫唴瀛樺潡錛屽叾浠栨兂瑕佸鐞嗗唴瀛樺潡鐨勭嚎紼嬪繀欏葷瓑寰呫傝繖縐嶆柟娉曞閫熷害鍙堝獎鍝嶃傚彲浠ヤ負榪涚▼鐨勭嚎紼嬪垱寤鴻緟鍔╁爢鏍堬紝浣唚indows鍑芥暟鍙兘浣跨敤榛樿鍫嗘爤銆?/p> <p>鑾峰彇榪涚▼榛樿鍫嗘爤鍙ユ焺錛?br>HANDLE GetProcessHeap();</p> <p>鍒涘緩杈呭姪鍫嗘爤鐨勭悊鐢?br>1 淇濇姢緇勪歡錛?br>澶氫釜緇勪歡鐨勬暟鎹販鍚堜氦鍙夌殑瀛樻斁鍦ㄤ竴鍧楀唴瀛橀噷錛岄偅涔堜竴涓粍浠剁殑閿欒鎿嶄綔寰堝鏄撳獎鍝嶅埌鍙﹀涓涓粍浠躲傝岃瀹氫綅閿欒鐨勬潵婧愬皢鍗佸垎鍥伴毦銆?br>2 鏇存湁鏁堢殑鍐呭瓨綆$悊<br>閫氳繃鍦ㄥ爢鏍堜腑鍒嗛厤鍚屾牱澶у皬鐨勫璞★紝鍙互鏇村姞鏈夋晥鐨勭鐞嗗唴瀛橈紝鍑忓皯鍐呭瓨紕庣墖銆?br>3 榪涜鏈湴璁塊棶錛?br>灝嗗悓縐嶆暟鎹泦涓埌涓瀹氱殑鍐呭瓨鍧楋紝鍙互鍦ㄦ搷浣滅殑鏃跺欒闂緝灝戠殑欏甸潰錛岃繖灝卞噺灝戜簡RAM鍜岀‖鐩樺鎹㈢殑鍙兘.<br>4 鍑忓皯綰跨▼鍚屾鐨勫紑閿錛?br>閫氳繃鍛婅瘔緋葷粺鍙湁涓涓嚎紼嬩嬌鐢ㄥ爢鏍?鍒涘緩鍫嗘爤鏃朵嬌鐢℉EAP_NO_SERIALIZE鏍囧織緇檉dwOptions)錛屽彲浠ラ伩鍏嶅爢鏍堝嚱鏁版墽琛岄澶栫殑鐢ㄤ簬淇濊瘉鍫嗘爤瀹夊叏鎬х殑浠g爜錛屾彁楂樻晥鐜囷紝浣嗘鏃剁敤鎴峰繀欏昏嚜宸辯淮鎶ょ嚎紼嬬殑瀹夊叏鎬э紝緋葷粺涓嶅啀瀵規璐熻矗銆?br>5 榪呴熼噴鏀懼爢鏍堛?br>鍥犱負鏁版嵁鍗曚竴錛屽洜姝ら噴鏀劇殑鏃跺欏彧瑕侀噴鏀懼爢鏍堝嵆鍙紝涓嶅繀鏄劇ず鐨勯噴鏀炬瘡涓唴瀛樺潡銆?/p> <p>鍒涘緩杈呭姪鍫嗘爤錛?br>HANDLE HeapCreate(<br>DWORD fdwOptions,<br>SIZE_T dwInitialSize,<br>SIZE_T dwMaximumSize);</p> <p>浠庡爢鏍堜腑鍒嗛厤鍐呭瓨錛?br>PVOID HeapAlloc(<br>HANDLE hHeap,<br>DWORD fdwFlags,<br>SIZE_T dwBytes);娉ㄦ剰錛氬綋鍒嗛厤瓚呰繃錛?MB)鍐呭瓨鍧楃殑鏃跺欙紝鏈濂戒嬌鐢╒irtualAlloc錛堬級錛?/p> <p>鏀瑰彉鍐呭瓨鍧楃殑澶у皬錛?br>PVOID HeapReAlloc(<br>HANDLE hHeap,<br>DWORD fdwFlags,<br>PVOID pvMem,<br>SIZE_T銆dwBytes);</p> <p>媯绱㈠唴瀛樺潡鐨勫ぇ灝忥細<br>SIZE_T HeapSize(<br>HANDLE hHeap,<br>DWORD fdwFlags,<br>LPVOID pvMem);</p> <p>閲婃斁鍐呭瓨鍧?<br>BOOL HeapFree(<br>HANDLE hHeap,<br>DWORD fdwFlags,<br>PVOID pvMem);</p> <p>鎾ら攢鍫嗘爤錛?br>BOOL HeapDestroy(HANDLE hHeap);</p> <p>浣跨敤杈呭姪鍫嗘爤鐨勬柟娉曪細閲嶈澆瀵硅薄鐨刵ew鎿嶄綔絎︼紝鍦ㄨ緟鍔╁爢涓婂垎閰嶅唴瀛橈紝騫剁粰瀵硅薄娣誨姞涓涓潤鎬佸彉閲忕敤浜庝繚瀛樺爢鍙ユ焺銆?/p> <p>鍏跺畠鍫嗘爤鍑芥暟錛?br>鑾峰彇榪涚▼涓墍鏈夊爢鏍堝緱鍙ユ焺錛?br>DWORD GetProcessHeaps(DWORD dwNumHeaps,PHANDLE pHeaps);<br>楠岃瘉鍫嗘爤瀹屾暣鎬э細<br>BOOL HeapValidate(<br>HANDLE hHeap,<br>DWORD fdwFlags,<br>LPCVOID pvMem);<br>鍚堝茍鍦板潃涓殑絀洪棽鍧?br>UINT HeapCompact(<br>HANDLE hHeap錛?br>DWORD fdwFlags);</p> <p>BOOL HeapLock(HANDLE hHeap);<br>BOOL HeapUnlock(HANDLE </p> <p>閬嶅巻鍫嗘爤錛?br>BOOL HeapWalk(<br>HANDLE hHeap,<br>PProcess_HEAP_ENTRY pHeapEntry);</p> <p>鍚勪釜dll涔熷彲浠ユ湁鑷繁鐨勮緭鍏ヨ〃銆?/p> <p>濡備綍緙栧啓DLL:<br>鍦―LL鐨勫ご鏂囦歡涓紝鏈夊涓嬩唬鐮侊細<br>#ifdef MYLIB<br>#else<br>    #define MYLIB extern "C" __declspec(dllimport)    <br>#endif<br>鍦ㄦ瘡涓緭鍑哄彉閲忓拰杈撳嚭鍑芥暟鐨勫0鏄庡墠錛岀敤MYLIB淇グ銆?br>鍦―LL鐨勫疄鐜版枃浠朵腑錛屾湁濡備笅浠g爜錛?br>錛僫 nclude "windows.h"<br>#define MYLIB extern "C" __declspec(dllexport)<br>錛僫 nclude "Mylib.h"</p> <p>鍏跺畠鐨勫悓緙栧啓鏅欳++紼嬪簭瀹屽叏鐩稿悓銆?"C" 琛ㄧず鎸塁鏂瑰紡閾炬帴鍜岃皟鐢ㄥ嚱鏁般侰++緙栬瘧鍣ㄧ己鐪佹寜鐓_stdcall鏂瑰紡緙栬瘧鍜岃皟鐢紝榪欑鏂瑰紡浼氭敼鍙樺嚱鏁扮殑鍐呴儴鍚嶅瓧銆傛澶勫鏋滄妸"C"閮藉幓鎺変篃鍙互錛屼絾C紼嬪簭灝嗘棤娉曡皟鐢ㄣ傚彟澶栵紝浣跨敤GetProcAddress鍑芥暟鏃朵篃浼氬彂鐢熷洶闅撅紝鍥犱負<br>緙栬瘧紼嬪簭宸茬粡鎶婂嚱鏁板悕瀛楁敼鍙樹簡錛屾棤娉曠敤鍘熸潵鐨勫悕瀛楀緱鍒板嚱鏁板湴鍧銆傦紙鏍稿績緙栫▼璇寸殑涓嶆槑鐧斤紝娌℃兂鍒拌繖鏈功閿欒榪欎箞澶氾級<br>鍙戣鐨勬椂鍊欙紝灝嗗ご鏂囦歡銆?lib鏂囦歡鍜孌LL鏂囦歡緇欑敤鎴峰氨鍙互浜嗐俵ib鏂囦歡鐨勪綔鐢ㄦ槸璇存槑浜嗗ご鏂囦歡涓嚱鏁版墍鍦ㄧ殑DLL鏂囦歡錛屽鏋滄病鏈塴ib鏂囦歡錛岀紪璇戝櫒灝嗗湪閾炬帴榪囩▼涓彁紺洪敊璇細unresolved external symbol 鍑芥暟鍚嶃?br>浜嬪疄涓婏紝璋冪敤DLL鏈変袱縐嶆柟寮忥紝絎竴縐嶆槸姣旇緝甯哥敤錛屽嵆鍖呭惈DLL鐨勫ご鏂囦歡錛屽茍鍦ㄩ摼鎺ョ殑鏃跺欏皢鍔ㄦ侀摼鎺ュ簱鍚宔xe鏂囦歡鍍忚繛鎺ワ紝寤虹珛杈撳叆琛ㄣ傝繖涓椂鍊欓渶瑕?lib鏂囦歡銆傜浜岀鏂規硶exe鏂囦歡涓病鏈夎緭鍏ヨ〃錛岀▼搴忎嬌鐢↙oadLibrary(Ex)鍜孏etProcAddress()鏄懼紡鐨勫姞杞紻LL鏂囦歡錛堝嵏杞界敤FreeLibrary())錛岃繖涓椂鍊欎笉闇瑕?lib鏂囦歡銆?br>HINSTANCE LoadLibrary(PCTSTR pszDLLpathName);<br>HINSTANCE LoadLibraryEx(PCTSTR pszDLLpathName,NULL,0);</p> <p>涓ゆ璋冪敤LoardLibrary騫朵笉浼氳杞戒袱嬈ll鏂囦歡錛屽彧鏄皢dll鏄犲皠榪涜繘紼嬬殑鍦板潃絀洪棿銆傜郴緇熶細鑷姩涓烘瘡涓繘紼嬬淮鎶や竴涓猟ll鐨勮鏁般侳reeLiabray浼氫嬌璁℃暟鍑忎竴錛屽鏋滆鏁頒負0錛岀郴緇熷氨浼氬皢dll浠庤繘紼嬬殑鍦板潃絀洪棿鍗歌澆銆?/p> <p><br>HINSTANCE GetModuleHandle(PCTSTR pszModuleName);//紜畾dll鏄惁宸茬粡琚槧灝勮繘鍦板潃絀洪棿銆?br>HINSTANCE hinstDll=GetModuleHandle("MyLib");<br>if(hinstDll==NULL)<br>{<br>    hinstDll=LoadLibrary("MyLib");<br>}</p> <p>DWORD GetModuleFileName(<br>    HINSTANCE hinstModule,<br>    PTSTR pszPathName,<br>    DWORD cchPath<br>}<br>鍙互鑾峰緱鏌愪釜妯″潡錛?exe鎴栬卍ll)鐨勫叏璺緞鍚嶃?/p> <p>鍑犱釜鍑芥暟鐨勭敤娉曪細錛堟敞鎰廏etProcAddress()鍑芥暟鐨勭敤娉曪紝濡備綍瀹氫箟鍜屼嬌鐢ㄤ竴涓嚱鏁版寚閽堬級<br>typedef int (*MYPROC)(int,int);</p> <p>int main()<br>{<br> HINSTANCE t;<br> t=LoadLibraryEx(TEXT("tt.dll"),NULL,0);<br> if(t)<br> {<br>  cout<<TEXT("load success")<<endl;</p> <p> }<br> HINSTANCE hinstDll=GetModuleHandle("tt.dll");<br> if(hinstDll==NULL)<br> {<br>  cout<<TEXT("first load failed")<<endl;<br>  hinstDll=LoadLibrary("MyLib");<br> }<br> size_t sz=100;<br> PTCHAR str=new TCHAR[sz];<br> GetModuleFileName(t,str,sz);<br> cout<<str<<endl;<br> delete str;<br> MYPROC add=NULL;<br> add=(MYPROC)GetProcAddress(t,"add");<br>    if(NULL!=add)<br>    {<br>  cout<<(*add)(1,2)<<endl;<br> }<br> FreeLibrary(t);</p> <p> return 0;<br>}</p> <p><br>UNICODE<br>ANSI/UNICODE閫氱敤鐨勫畾涔夋柟娉曪紙杞崲鍙渶瑕佸湪緙栬瘧鐨勬椂鍊欎嬌鐢╛UNICODE鍜孶NICODE錛夛細<br>TCHAR _TEXT("success") PTSTR PCTSTR _tcscpy(),_tcscat();<br>浣跨敤BYTE PBYTE瀹氫箟瀛楄妭錛屽瓧鑺傛寚閽堝拰鏁版嵁緙撳啿銆?br>浼犻掔粰鍑芥暟鐨勭紦瀛樺ぇ灝忥細sizeof(szBuffer)/sizeof(TCHAR)<br>緇欏瓧絎︿覆鍒嗛厤鍐呭瓨錛歮alloc(nCharacters*sizeof(TCHAR));<br>鍏跺畠鐨勫瓧絎︿覆鍑芥暟錛?br>PTSTR CharLower(PTSTR pszString);<br>PTSTR CharUpper(PTSTR pszString);<br>杞崲鍗曚釜瀛楃錛?br>TCHAR c=CharLower((PTSTR)szString[0]);<br>杞崲緙撳瓨涓殑瀛楃涓詫紙涓嶅繀浠?緇撳熬錛夛細<br>DWORD CharLowerBuff(<br>PTSTR pszString,<br>DWORD cchString);<br>DWORD CharUpperBuff(<br>PTSTR pszString,<br>DWORD cchString);</p> <p>BOOL IsCharAlpha(TCHAR ch);<br>BOOL IsCharAlpahNumeric(TCHAR ch);<br>BOOL IsCharLower(TCHAR ch);<br>BOOL IsCharUpper(TCHAR ch);</p> <p>綰跨▼鏈湴瀛樺偍(TLS):涓鴻繘紼嬬殑姣忎釜綰跨▼瀛樺偍縐佹湁鏁版嵁銆傜敤浜庨偅浜涗竴嬈′紶閫掑弬鏁板悗澶氭璋冪敤鐨勫嚱鏁幫紙鍑芥暟浼氫繚瀛樹笂嬈¤皟鐢ㄧ殑鏁版嵁錛夈?br>瀹炵幇鏂規硶錛氳繘紼嬩腑鏈変竴涓綅鏍囧織鏍戠粍錛坵in2000鐨勮繖涓暟緇勫ぇ灝忚秴榪?000錛夈傚湪姣忎釜綰跨▼涓湁涓涓搴旂殑PVOID鏁扮粍銆傞氳繃璁懼畾浣嶆爣蹇楁爲緇勭殑鏌愪釜浣嶆潵鍒嗛厤姣忎釜綰跨▼涓殑PVOID鏁扮粍寰楃浉搴斿崟鍏冦傚嚱鏁伴渶瑕佹瘡嬈℃绱㈢嚎紼嬬殑PVOID鏁扮粍錛岃幏寰楄綰跨▼鐨勭浉搴旀暟鎹?/p> <p>DWORD TlsAlloc();  //涓烘瘡涓嚎紼嬪垎閰嶄竴涓┖鐨凱VOID鏁扮粍鍗曞厓銆?/p> <p>BOOL TlsSetValue(  //綰跨▼璁懼畾鑷繁鐨凱VOID鏁扮粍鍗曞厓銆?br>DWORD dwTlsIndex,<br>PVOID pvTlsValue);</p> <p>PVOID TlsGetValue(<br>DWORD dwTlsIndex);  //媯绱VOID鏁扮粍銆?/p> <p>BOOL TLSFree(<br>DWORD dwTlsIndex);  //閲婃斁PVOID鏁扮粍鍗曞厓</p> <p>闈欐乀LS:__declspec(thread) DWORD gt_dwStartTime=0;//鍙兘淇グ鍏ㄥ眬鎴栬呴潤鎬佸彉閲忋?/p> <p>DLL鎸傛帴錛堣繘紼嬫敞鍏ワ級錛氳鑷繁鐨凞LL鎻掑叆鍒板叾浠栬繘紼嬬殑鍦板潃絀洪棿銆?/p> <p>1 浣跨敤娉ㄥ唽琛ㄦ彃鍏LL<br>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs<br>灝嗕綘鐨凞LL璺緞鏀懼叆榪欎釜鍏抽敭瀛椾笅闈€傚綋User32.dll琚槧灝勫埌榪涚▼涓殑鏃跺欙紝瀹冧細鍔犲湪榪欎釜鍏抽敭瀛椾笅鐨勬瘡涓簱銆?br>娉ㄦ剰錛氾紙1錛夊win98鏃犳晥<br>      錛?錛夌敱浜庡姞杞戒簨闂存瘮杈冩棭錛屼綘鐨凞LL鍙兘鏃犳硶璋冪敤kernel32浠ュ鐨刣ll.<br>       (3) 濡傛灉榪涚▼娌℃湁浣跨敤user32.dll錛岃繖涓柟娉曟棤鏁堛?br>       (4) 闇瑕侀噸鏂板惎鍔ㄣ?br>      錛?錛塽ser32涓嶄細媯鏌ユ瘡涓簱鏄惁鍔犺澆鎴愬姛銆?br>2 浣跨敤windows閽╁瓙<br>HOOK hHook=SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hinstDll,0);<br>BOOL UnhookWindowsHookEx(HHOOK hhook);<br>鍏蜂綋榪囩▼濡備笅錛?br>      錛?錛夎繘紼婤鐨勪竴涓嚎紼嬪噯澶囧彂閫佹秷鎭粰涓涓獥鍙c?br>      錛?錛夌郴緇熷療鐪嬬嚎紼嬩笂鏄惁宸茬粡瀹夎浜哤H_GETMESSAGE閽╁瓙銆?br>      錛?錛夌郴緇熷療鐪婫etMsgProc鐨凞LL鏄惁宸茬粡鏄犲皠鍒頒簡榪涚▼B鐨勫湴鍧絀洪棿錛屽鏋滄病鏈夛紝緋葷粺灝嗘妸DLL鏄犲皠鍒癇鐨勫湴鍧絀洪棿錛屽茍鑷姩澧炲姞寮曠敤璁℃暟銆?br>      錛?錛夎皟鐢℅etMsgProc鍑芥暟錛岃繑鍥炴椂錛岀郴緇熶細鑷姩涓篋LL鐨勫紩鐢ㄨ鏁板噺涓銆?/p> <p>3 浣跨敤榪滅▼綰跨▼鏉ユ彃鍏LL<br>      (1)浣跨敤VirtualAllocEx,鍒嗛厤榪滅▼榪涚▼鐨勫湴鍧絀洪棿鐨勫唴瀛樸?br>      (2)浣跨敤WriteProcessMemory,灝咲ll鐨勮礬寰勫悕鎷瘋礉鍒扮涓涓楠や腑宸茬粡鍒嗛厤鐨勫唴瀛樹腑銆?br>      (3)浣跨敤GetProcAddress,鑾峰緱LoadLibrary鐨勫疄闄呭湴鍧銆?br>      (4)浣跨敤CreateRemoteThread,鍦ㄨ繙紼嬭繘紼嬩腑鍒涘緩涓涓嚎紼嬨?br>      閫鍑猴細  <br>      (5)浣跨敤VirtualFreeEx錛岄噴鏀懼唴瀛?br>      (6)浣跨敤GetProcAddress,鑾峰緱FreeLiabary鐨勫湴鍧銆?br>      (7)浣跨敤CreateRemoteThread,鍦ㄨ繙紼嬭繘紼嬩腑鍒涘緩涓涓嚎紼嬶紝璋冪敤FreeLiabary鍑芥暟銆?br>4 浣跨敤鐗規礇浼奃LL鎻掑叆<br>  鏇挎崲dll.<br>5 灝咲LL浣滀負璋冭瘯紼嬪簭鎻掑叆<br>6 win98鍐呭瓨鏄犲皠鏂囦歡錛宑reatprocess </p> <p>緇撴瀯鍖栧紓甯稿鐞嗭細<br>緇撴潫澶勭悊紼嬪簭錛歘_try{} __finally{}<br>闄ら潪__try鎵ц涓繘紼嬫垨鑰呯嚎紼嬬粨鏉燂紝鍚﹀垯鎬諱細鎵ц__finally錛屽茍涓擾_finally涓殑return浼氭浛浠_try涓殑return;濂界殑涔犳儻鏄皢return ,continue,break,goto璇彞鎷垮埌緇撴瀯鍖栧紓甯稿鐞嗚鍙ュ闈紝鍙互鑺傜渷寮閿銆傚皢__try涓殑return 鎹㈡垚__leave錛屽彲浠ヨ妭鐪佸紑閿銆傚湪__finally鎬葷‘瀹氭椂姝e父榪涘叆榪樻槸灞曞紑榪涘叆錛?br>BOOL AbnormalTermination();//姝e父榪涘叆榪斿洖FALSE,灞閮ㄥ睍寮鎴栬呭叏灞灞曞紑榪斿洖TRUE;</p> <p>寮傚父澶勭悊紼嬪簭錛歘_try{}__exception(寮傚父榪囨護琛ㄨ揪寮?{}</p> <p>EXCEPTION_EXECUTE_HANDLE<br>琛ㄧず澶勭悊寮傚父錛屽鐞嗗悗杞埌exception鍧楀悗闈㈢殑浠g爜緇х畫鎵ц銆?br>EXCEPTION_CONTINUE_EXECUTION<br>EXCEPTION_CONTINUE_SEARCH</p> <p>鍙互瀵瑰紓甯歌繃婊よ〃杈懼紡榪涜紜紪鐮侊紝涔熷彲浠ョ敤涓涓皟鐢ㄤ竴涓嚱鏁版潵鍐沖畾榪囨護琛ㄨ揪寮忥紝鍑芥暟鐨勮繑鍥炲兼槸LONG.渚嬪錛屽彲浠ヨ繘琛屼竴瀹氬鐞嗭紝鐒跺悗榪斿洖EXCEPTION_CONTINUE_EXECUTION錛屽啀嬈℃墽琛屽嚭閿欒鍙ャ備絾鍙兘鍐嶆鍑洪敊錛屽洜姝よ繖縐嶆柟娉曞繀欏誨皬蹇冿紝闃叉鐢熸垚姝誨驚鐜?/p> <p>DWORD GetExceptionCode() 鍙互鑾峰緱寮傚父縐嶇被銆傚畠鍙兘鍦╛_except鍚庣殑鎷彿鎴栬呭紓甯稿鐞嗙▼搴忎腑璋冪敤銆?/p> <p>鍙戠敓寮傚父鍚庯紝鎿嶄綔緋葷粺浼氬儚寮曡搗寮傚父鐨勭嚎紼嬬殑鏍堥噷鍘嬪叆涓変釜緇撴瀯:EXCEPTION_RECORD CONTEXT EXCEPTION_POINTERS,鍏朵腑絎笁涓粨鏋勫寘鍚袱涓垚鍛樻寚閽堬紝鍒嗗埆鎸囧悜鍓嶄袱涓粨鏋勶紝浣跨敤鍑芥暟鍙互鑾峰緱絎笁涓粨鏋勭殑鎸囬拡錛?br>PEXCEPTION_POINTERS GetExceptionInformation();//浠呭彲浠ュ湪寮傚父榪囨護鍣ㄤ腑璋冪敤,鏃_exception鍚庨潰鐨勫皬鎷彿銆?/p> <p>閫楀彿琛ㄨ揪寮忥細浠庡乏鍒板彸瀵規墍鏈夌殑琛ㄨ揪寮忔眰鍊鹼紝騫惰繑鍥炴渶鏈夐潰鐨勮〃杈懼紡鐨勫箋?/p> <p>寮曞彂杞歡寮傚父錛?br>VOID RaiseException(<br>DWORD dwExceptionCode,<br>DWORD dwExceptionFlags,<br>DWORD nNumberOfArguments,<br>CONST ULONG_PTR *pArguments);</p> <p>緙虹渷璋冭瘯鍣ㄦ墍鍦ㄦ敞鍐岃〃錛?br>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug  Debugger<br>win98鏄瓨鏀懼湪win.ini閲?/p> <p>璋冭瘯鍣ㄦ寕鎺ュ埌琚皟璇曡繘紼?br>BOOL DebugActiveProcess(DWORD dwProcessID);</p> <p><br>while(*str++!='\0');<br>搴旇娉ㄦ剰鐨勬槸鍦ㄤ笉婊¤凍鏉′歡鍚庯紝str浠嶇劧浼氳嚜鍔?銆?/p> <p>浣嶆搷浣滅>>鍜?lt;<涓嶄細鍋氬驚鐜綅縐伙紝鍗充笉浼氭妸縐誨嚭鐨勪綅鏀懼埌鍙︿竴澶淬?/p> <p>澶氭佹у拰鍔ㄦ佽仈緙栫殑瀹炵幇榪囩▼鍒嗘瀽</p> <p>銆銆涓銆佸熀紜錛?/p> <p>銆銆1銆佸鎬佹э細浣跨敤鍩虹綾葷殑鎸囬拡鍔ㄦ佽皟鐢ㄥ叾媧劇敓綾諱腑鍑芥暟鐨勭壒鎬с?/p> <p>銆銆2銆佸姩鎬佽仈緙栵細鍦ㄨ繍琛岄樁孌碉紝鎵嶅皢鍑芥暟鐨勮皟鐢ㄤ笌瀵瑰簲鐨勫嚱鏁頒綋榪涜榪炴帴鐨勬柟寮忥紝鍙堝彨榪愯鏃惰仈緙栨垨鏅氭崋緇戙?/p> <p>銆銆浜屻佽繃紼嬫弿榪幫細</p> <p>銆銆1銆佺紪璇戝櫒鍙戠幇涓涓被涓湁铏氬嚱鏁幫紝緙栬瘧鍣ㄤ細绔嬪嵆涓烘綾葷敓鎴愯櫄鎷熷嚱鏁拌〃 vtable錛堝悗闈㈡湁瀵箆table鐨勫垎鏋愶級銆傝櫄鎷熷嚱鏁拌〃鐨勫悇琛ㄩ」涓烘寚鍚戝搴旇櫄鎷熷嚱鏁扮殑鎸囬拡銆?/p> <p>銆銆2銆佺紪璇戝櫒鍦ㄦ綾諱腑闅愬惈鎻掑叆涓涓寚閽坴ptr錛堝vc緙栬瘧鍣ㄦ潵璇達紝瀹冩彃鍦ㄧ被鐨勭涓涓綅緗笂錛夈?/p> <p>銆銆鏈変竴涓姙娉曞彲浠ヨ浣犳劅鐭ヨ繖涓殣鍚寚閽堢殑瀛樺湪錛岃櫧鐒朵綘涓嶈兘鍦ㄧ被涓洿鎺ョ湅鍒板畠錛屼絾浣犲彲浠ユ瘮杈冧竴涓嬪惈鏈夎櫄鎷熷嚱鏁版椂鐨勭被鐨勫昂瀵稿拰娌℃湁铏氭嫙鍑芥暟鏃剁殑綾葷殑灝哄錛屼綘鑳藉鍙戠幇錛岃繖涓寚閽堢‘瀹炲瓨鍦ㄣ?</p> <p>銆銆3銆佸湪璋冪敤姝ょ被鐨勬瀯閫犲嚱鏁版椂錛屽湪綾葷殑鏋勯犲嚱鏁頒腑錛岀紪璇戝櫒浼氶殣鍚墽琛寁ptr涓巚table鐨勫叧鑱斾唬鐮侊紝灝唙ptr鎸囧悜瀵瑰簲鐨剉table銆傝繖灝卞皢綾諱笌姝ょ被鐨剉table鑱旂郴浜嗚搗鏉ャ?/p> <p>銆銆4銆佸湪璋冪敤綾葷殑鏋勯犲嚱鏁版椂錛屾寚鍚戝熀紜綾葷殑鎸囬拡姝ゆ椂宸茬粡鍙樻垚鎸囧悜鍏蜂綋鐨勭被鐨則his鎸囬拡錛岃繖鏍蜂緷闈犳this鎸囬拡鍗沖彲寰楀埌姝g‘鐨剉table錛屼粠鑰屽疄鐜頒簡澶氭佹с傚湪姝ゆ椂鎵嶈兘鐪熸涓庡嚱鏁頒綋榪涜榪炴帴錛岃繖灝辨槸鍔ㄦ佽仈緙栥?/p> <p>瀹氫箟綰櫄鍑芥暟鏂規硶錛歷irtual returntype function()= 0;</p> <p>鎵鏈夌殑綾誨瀷閮藉彲浠ョ敤new鍔ㄦ佸垱寤猴紝鍖呮嫭綾伙紝緇撴瀯錛屽唴緗暟鎹被鍨嬨?/p> <p>exit()鍑芥暟鍖呭惈鍦?cstdlib"涓?/p> <p>娉涘瀷緙栫▼錛屼嬌鐢⊿TL搴?br>鎬誨叡鏈夎繎75涓硾鍨嬬畻娉?/p> <p>鎵鏈夊鍣ㄧ殑鍏遍氭搷浣滐細<br>== != = empty() size() clear(),begin(),end(),浠ュ強insert鍜宔rase,涓嶈繃鍚庤呴殢瀹瑰櫒鐨勭殑涓嶅悓鑰屼笉鍚?/p> <p>搴忓垪寮忓鍣細<br>vector(鏁扮粍):鎻掑叆鍜屽垹闄ょ殑鏁堢巼杈冧綆錛屼絾瀛樺彇鏁堢巼楂樸?br>list錛堝弻鍚戦摼琛級:涓庡墠鑰呯浉鍙嶏紝鎻掑叆鍜屽垹闄ょ殑鏁堢巼杈冮珮錛屼絾瀛樺彇鏁堢巼浣庛傛瘡涓厓绱犲寘鍚笁涓瓧孌碉細value back front.<br>deque(闃熷垪):鍦ㄥ墠绔拰鏈熬鎿嶄綔鏁堢巼楂樸?/p> <p>鐢熸垚搴忓垪寮忓鍣ㄧ殑浜旂鏂規硶錛?br>1 浜х敓絀虹殑瀹瑰櫒錛?br>list<string> slist;<br>vector<int> vtor;<br>2 浜х敓鐗瑰畾澶у皬鐨勫鍣紝瀹瑰櫒涓殑姣忎釜鍏冪礌閮戒互鍏墮粯璁ゅ間負鍒濆鹼紙鍙戠幇VC涓殑int double絳夋病鏈夐粯璁ゅ鹼級銆?br>list<int> ilist(1024);<br>vector<string> svec(24);<br>3 浜х敓鐗瑰畾澶у皬鐨勫鍣紝騫朵負姣忎釜鍏冪礌鎸囧畾鍒濆鹼細<br>list<int ilist(1024,0);<br>vector<string> svec(24,"default");<br>4 閫氳繃涓瀵硅凱浠e櫒浜х敓瀹瑰櫒錛岃繖瀵硅凱浠e櫒鐢ㄦ潵琛ㄧず鏁扮粍浣滀負鍒濆肩殑鍖洪棿錛?br>int ia[10]={1,2,3,4,5,6,7,8,9,0};<br>vector<int>  iv(ia+2,ia+8);<br>5 澶嶅埗鏌愪釜鐜版湁鐨勫鍣ㄧ殑鍊鹼細<br>vector<int> ivec1;<br>//濉厖ivec1;<br>vector<int> ivec2(ivec1);</p> <p>鏈?涓柟娉曠敤浜庢搷浣滃紑濮嬪拰鏈熬鐨勫厓绱狅細push_front() pop_front() push_back() pop_back(),鐢變簬pop鎿嶄綔浠呭垹闄ゅ厓绱犺屼笉榪斿洖鍏冪礌錛屽洜姝よ繕闇瑕乫ront() back()鏂規硶鍙栧紑濮嬪拰鏈熬鐨勫厓绱狅紝鍙﹀錛寁ector涓嶅寘鎷琾ush_front() pop_front鏂規硶錛屽緢鏄劇劧錛屾棤娉曞疄鐜般?/p> <p>intert鐨勫洓縐嶅彉褰細<br>iterator insert(iterator position,elemType value):灝唙alue鎻掑埌position鍓嶃傝繑鍥炲兼寚鍚戣鎻掑叆鐨勫厓绱犮?br>void insert(iterator position,int count,elemType value):鍦╬osition鍓嶆彃鍏ount涓厓绱狅紝姣忎釜鍏冪礌閮芥槸value.<br>void insert(iterator1 position,iterator2 first,iterator2 last):灝唂irst,last涔嬮棿鐨勫厓绱犳彃鍒皃osition鍓?<br>iterator insert( iterator position):鍦╬osition鍓嶆彃鍏ュ厓绱狅紝鍒濆間負鎵灞炵被鍨嬬殑榛樿鍊箋?/p> <p>erase鐨勪袱縐嶅彉褰細<br>1  iterator erase(iterator posit):鍒犻櫎posit鎸囧悜鐨勫厓绱犮?br>list<string>::iterator it=find(slist.begin(),slist,end(),str);<br>slist.erase(it);<br>2  iterator erase(iterator first,iterator last):鍒犻櫎first,last闂寸殑鍏冪礌銆?/p> <p>list涓嶆敮鎸乮terator鐨勫亸縐昏繍綆?/p> <p>瀵逛簬甯稿煎鍣紝浣跨敤甯歌凱浠e櫒錛?br>const vector<string> cs_vec;<br>vector<string::const_iterator iter_cs_vec.begin();</p> <p>iterator鍙互褰撲綔鎸囬拡鐢紝鍙互鐢?鍙栧唴瀹癸紝涔熷彲浠ョ敤->璋冪敤瀵硅薄鐨勬垚鍛樸?/p> <p>浣跨敤娉涘瀷綆楁硶<br>錛僫 nclude <algorithm></p> <p>find():綰挎ф悳绱㈡棤搴忛泦鍚?br>binary_search():浜屽垎鎼滅儲鏈夊簭闆嗗悎銆?br>count()錛氳繑鍥炲厓绱犱釜鏁般?br>search():鎼滅儲搴忓垪錛屽鏋滃瓨鍦ㄨ繑鍥炵殑iterator鎸囧悜搴忓垪棣栭儴錛屽惁鍒欐寚鍚戝鍣ㄦ湯灝俱?br>max_element(begin,end):榪斿洖鍖洪棿鍐呯殑鏈澶у箋?br>copy(begin,end,begin):鍏冪礌澶嶅埗銆?br>sort(begin,end):鎺掑簭銆?/p> <p>function objects:錛僫 nclude <functional><br>綆楁湳榪愮畻錛?br>plus<type> minus<type> negate<type> multiplies<type> divides<type> modules<type><br>鍏崇郴榪愮畻錛?br>less<type> less equal<type> greater<type greater equal<type> equal_to<type> not_equal_to<type><br>閫昏緫榪愮畻錛?br>logical_and<type> logical_or<type> logical_not<type></p> <p>adapter:閫傞厤鍣ㄣ?br>bind1st:灝嗘暟鍊肩粦瀹氬埌function object鐨勭涓涓弬鏁般?br>bind2nd:灝嗘暟鍊肩粦瀹氬埌function object鐨勭浜屼釜鍙傛暟銆?/p> <p>浣跨敤map:<br>錛僫 nclude <map><br>錛僫 nclude <string><br>map<string,int> words;</p> <p>words["vermeer"]=1;</p> <p>map<string,int>::iterator it=words.begin();<br>for(;it!=words.end();++it)<br>cout<<"key:"<<it->first<<"value:"<<it->second<<endl;</p> <p>鏌ユ壘map鍏冪礌鐨勬柟娉?<br>words.find("vermeer");//榪斿洖iterator,鎸囧悜鎵懼埌鐨勫厓绱狅紝鎵句笉鍒拌繑鍥瀍nd();<br>榪樺彲浠ワ細<br>if(words.count(search_word))<br>count=words[search_word];</p> <p>浣跨敤set:<br>錛僫 nclude <set><br>錛僫 nclude <string><br>set<string> word_exclusion;<br>//鍒ゆ柇鏄惁瀛樺湪鏌愪釜鍏冪礌<br>if(word_exclusion.count(tword))<br>//榛樿鎯呭喌涓嬶紝鎵鏈夊厓绱犳寜less-than榪愮畻鎺掑垪</p> <p>//鍔犲叆鍏冪礌<br>iset.insert(ival);<br>iset.insert(vec.begin(),vec.end());</p> <p>涓巗et鐩稿叧鐨勭畻娉?br>set_intersection() set_union() set_difference() set_symmetric_difference()</p> <p>浣跨敤insertion adapters:<br>錛僫 nclude <iterator><br>back_inserter()<br>inserter()<br>front_inserter()</p> <p>浣跨敤STL閫氬父浼氭湁寰堝璀﹀憡錛屼負浜嗛伩鍏嶅湪璋冭瘯妯″紡錛坉ebug mode錛夊嚭鐜版伡浜虹殑璀﹀憡錛屼嬌鐢ㄤ笅闈㈢殑緙栬瘧鍣ㄥ懡浠わ細</p> <p>#pragma warning(disable: 4786) </p> <p>strncpy(dest,source,count) if(count銆?strlen(source)),閭d箞null緇撳熬涓嶄細琚姞鍦╠est鐨勫熬閮紝濡傛灉count>strlen(source),閭d箞涓嶈凍鐨勯儴鍒嗕細鐢╪ull濉厖銆?/p> <p><br>windows鍐呭瓨鏄敱楂樺湴鍧鍚戝簳鍦板潃鍒嗛厤鐨勶紝浣嗗彉閲忕殑瀛樺偍鏄粠搴曞湴鍧鍒伴珮鍦板潃鐨勶紝濡侷NT綾誨瀷鐨勫洓涓瓧鑺傦紝鏁扮粍鐨勬瘡涓厓绱犮?br> <br>鍐呭瓨澶嶅埗鐨勬椂鍊欎笉鑳界敤瀛楃涓叉嫹璐濆嚱鏁幫紝鍥犱負鍗充嬌浣跨敤strncpy鎸囧畾浜嗗鍒剁殑闀垮害錛屾嫹璐濆嚱鏁頒篃浼氶亣鍒?\0'鑷姩緇堟錛岃浣跨敤MEMSET銆?/p> <p>鐢變簬瀵歸綈鐨勫叧緋伙紝涓嬮潰涓や釜緇撴瀯浣跨敤sizeof錛屽墠鑰呮槸12錛屽悗鑰呮槸16銆?br>struct DNSAnswer<br>{<br> unsigned short name;<br> unsigned short type;<br> unsigned short cla; <br> unsigned short length;<br> unsigned int   ttl;<br>};<br>struct DNSAnswer<br>{<br> unsigned short name;<br> unsigned short type;<br> unsigned short cla;<br> unsigned int   ttl;<br>        unsigned short length;<br>};</p> <p>瀛愮被鍙互浣跨敤鐖剁被鐨勪繚鎶ゆ垚鍛橈紝鑰屽弸鍏冩瘮瀛愮被鐨勬潈闄愯繕澶э紝鍙互浣跨敤綾葷殑縐佹湁鍜屼繚鎶ゆ垚鍛樸?/p> <p>鍦ㄥ唴瀛樺垎閰嶅け璐ョ殑鎯呭喌涓嬶紝緋葷粺鍙湁鍦ㄥ嚭閿欏鐞嗗嚱鏁頒負絀虹殑鎯呭喌涓嬶紝鎵嶄細鎶涘嚭寮傚父錛歴td::bad_alloc(),鍚﹀垯浼氬弽澶嶈皟鐢ㄥ鐞嗗嚱鏁板茍鍐嶆灝濊瘯鍒嗛厤鍐呭瓨銆?/p> <p>濡傛灉閲嶈澆浜哊EW錛岄偅涔堝湪緇ф壙鐨勬椂鍊欒灝忓績錛屽鏋滃瓙綾繪病鏈夎鐩朜EW錛岄偅涔堝畠浼氬幓浣跨敤鐖剁被鐨凬EW 錛屽洜姝ゅ簲璇ュ湪new錛宒elete涓仛媯鏌?br>if (size != sizeof(base))             // 濡傛灉鏁伴噺“閿欒”錛岃鏍囧噯operator new錛宐ase涓虹被鍚?br>    return ::operator new(size);        // 鍘誨鐞嗚繖涓姹?/p> <p>  if (size != sizeof(base)) {      // 濡傛灉size"閿欒"錛?br>    ::operator delete(rawmemory);  // 璁╂爣鍑唎perator鏉ュ鐞嗚姹?br>    return;                        <br>  }</p> <p>c++鏍囧噯瑙勫畾錛岃鏀寔0鍐呭瓨璇鋒眰錛堝垎閰嶄竴涓瓧鑺傦級錛屽茍涓斿彲浠ュ垹闄ULL鎸囬拡錛堢洿鎺ヨ繑鍥烇級銆?/p> <p>鍦ㄥ垱寤虹嚎紼嬬殑鏃跺欙紝浼犻掔殑鍙橀噺涓瀹氳鏄叏灞鎴栬呴潤鎬佺殑鍙橀噺錛屽洜涓轟紶閫掔殑鏄彉閲忕殑鍦板潃錛屽鏋滄槸灞閮ㄥ彉閲忓湴鍧寰堝揩灝變細澶辨晥銆?/p> <p>涓葷嚎紼嬮鍑哄悗錛屽叾瀛愮嚎紼嬭嚜鍔ㄧ粨鏉熴?/p> <p>鏅鴻兘鎸囬拡錛氬畠鍙互閬垮厤鍐呭瓨娉勯湶錛屽洜涓烘櫤鑳芥寚閽堟槸鍦ㄦ爤涓婂垱寤虹殑錛涜繕鍙互閬垮厤鍫嗕笂鍐呭瓨鐨勯噸澶嶉噴鏀鵑敊璇紝鍥犱負瀹冧繚璇佸彧鏈変竴涓寚閽堟嫢鏈夎繖鍧楀唴瀛樼殑鎵鏈夋潈銆?/p> <img src ="http://m.shnenglu.com/zzh/aggbug/29864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zzh/" target="_blank">Xiao.Zhu</a> 2007-08-13 09:22 <a href="http://m.shnenglu.com/zzh/archive/2007/08/13/29864.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>linux涓嬪熀浜巎rtplib搴撶殑瀹炴椂浼犻佸疄鐜?http://m.shnenglu.com/zzh/archive/2007/08/08/29578.htmlXiao.ZhuXiao.ZhuWed, 08 Aug 2007 08:39:00 GMThttp://m.shnenglu.com/zzh/archive/2007/08/08/29578.htmlhttp://m.shnenglu.com/zzh/comments/29578.htmlhttp://m.shnenglu.com/zzh/archive/2007/08/08/29578.html#Feedback0http://m.shnenglu.com/zzh/comments/commentRss/29578.htmlhttp://m.shnenglu.com/zzh/services/trackbacks/29578.html涓銆丷TP 鏄繘琛屽疄鏃舵祦濯掍綋浼犺緭鐨勬爣鍑嗗崗璁拰鍏抽敭鎶鏈?br> 瀹炴椂浼犺緭鍗忚錛圧eal-time Transport Protocol錛孭RT錛夋槸鍦?nbsp;Internet 涓婂鐞嗗濯掍綋鏁版嵁嫻佺殑涓縐嶇綉緇滃崗璁紝鍒╃敤瀹冭兘澶熷湪涓瀵逛竴錛坲nicast錛屽崟鎾級鎴栬呬竴瀵瑰錛坢ulticast錛屽鎾級鐨勭綉緇滅幆澧冧腑瀹炵幇浼犳祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撱俁TP 閫氬父浣跨敤 UDP 鏉ヨ繘琛屽濯掍綋鏁版嵁鐨勪紶杈擄紝浣嗗鏋滈渶瑕佺殑璇濆彲浠ヤ嬌鐢?nbsp;TCP 鎴栬?nbsp;ATM 絳夊叾瀹冨崗璁?br> 鍗忚鍒嗘瀽 錛氭瘡涓涓猂TP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛圥ayload錛変袱涓儴鍒嗙粍鎴愶紝鍏朵腑澶撮儴鍓?nbsp;12 涓瓧鑺傜殑鍚箟鏄浐瀹氱殑錛岃岃礋杞藉垯鍙互鏄煶棰戞垨鑰呰棰戞暟鎹?br>
      RTP 鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝瑕佸湪 Linux 騫沖彴涓婅繘琛屽疄鏃朵紶閫佺紪紼嬶紝鍙互鑰冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?nbsp;RTP 搴擄紝濡?nbsp;LIBRTP銆丣RTPLIB 絳夈侸RTPLIB 鏄竴涓潰鍚戝璞$殑 RTP 搴擄紝瀹冨畬鍏ㄩ伒寰?nbsp;RFC 1889 璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨銆侸RTPLIB 鏄竴涓敤 C++ 璇█瀹炵幇鐨?nbsp;RTP 搴擄紝榪欎釜搴撲嬌鐢╯ocket 鏈哄埗瀹炵幇緗戠粶閫氳 鍥犳鍙互榪愯鍦?nbsp;Windows銆丩inux銆丗reeBSD銆丼olaris銆乁nix鍜孷xWorks 絳夊縐嶆搷浣滅郴緇熶笂銆?br>浜屻丣RTPLIB 搴撶殑浣跨敤鏂規硶鍙婄▼搴忓疄鐜?br> (1)JRTPLIB  鍑芥暟 鐨勪嬌鐢?br> a銆佸湪浣跨敤 JRTPLIB 榪涜瀹炴椂嫻佸獟浣撴暟鎹紶杈撲箣鍓嶏紝棣栧厛搴旇鐢熸垚 RTPSession 綾葷殑涓涓疄渚嬫潵琛ㄧず姝ゆ RTP 浼氳瘽錛岀劧鍚庤皟鐢?nbsp;Create() 鏂規硶鏉ュ鍏惰繘琛屽垵濮嬪寲鎿嶄綔銆俁TPSession 綾葷殑 Create() 鏂規硶鍙湁涓涓弬鏁幫紝鐢ㄦ潵鎸囨槑姝ゆ RTP 浼氳瘽鎵閲囩敤鐨勭鍙e彿銆?br> RTPSession sess;  sess.Create(5000); 

 b銆佽緗伆褰撶殑鏃舵埑鍗曞厓錛屾槸 RTP 浼氳瘽鍒濆鍖栬繃紼嬫墍瑕佽繘琛岀殑鍙﹀涓欏歸噸瑕佸伐浣滐紝榪欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetTimestampUnit() 鏂規硶鏉ュ疄鐜扮殑錛岃鏂規硶鍚屾牱涔熷彧鏈変竴涓弬鏁幫紝琛ㄧず鐨勬槸浠ョ涓哄崟鍏冪殑鏃舵埑鍗曞厓銆?br> sess.SetTimestampUnit(1.0/8000.0);

 c銆佸綋 RTP 浼氳瘽鎴愬姛寤虹珛璧鋒潵涔嬪悗錛屾帴涓嬪幓灝卞彲浠ュ紑濮嬭繘琛屾祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撲簡銆傞鍏堥渶瑕佽緗ソ鏁版嵁鍙戦佺殑鐩爣鍦板潃錛孯TP 鍗忚鍏佽鍚屼竴浼氳瘽瀛樺湪澶氫釜鐩爣鍦板潃錛岃繖鍙互閫氳繃璋冪敤 RTPSession 綾葷殑 AddDestination()銆丏eleteDestination() 鍜?nbsp;ClearDestinations() 鏂規硶鏉ュ畬鎴愩備緥濡傦紝涓嬮潰鐨勮鍙ヨ〃紺虹殑鏄 RTP 浼氳瘽灝嗘暟鎹彂閫佸埌鏈湴涓繪満鐨?nbsp;6000 绔彛錛?nbsp;

 unsigned long addr = ntohl(inet_addr("127.0.0.1")); 
 sess.AddDestination(addr, 6000);
 
 d銆佺洰鏍囧湴鍧鍏ㄩ儴鎸囧畾涔嬪悗錛屾帴鐫灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 SendPacket() 鏂規硶錛屽悜鎵鏈夌殑鐩爣鍦板潃鍙戦佹祦濯掍綋鏁版嵁銆係endPacket() 鏄?nbsp;RTPSession 綾繪彁渚涚殑涓涓噸杞藉嚱鏁?br>瀵逛簬鍚屼竴涓?nbsp;RTP 浼氳瘽鏉ヨ錛岃礋杞界被鍨嬨佹爣璇嗗拰鏃舵埑澧為噺閫氬父鏉ヨ閮芥槸鐩稿悓鐨勶紝JRTPLIB 鍏佽灝嗗畠浠緗負浼氳瘽鐨勯粯璁ゅ弬鏁幫紝榪欐槸閫氳繃璋冪敤 RTPSession 綾葷殑 SetDefaultPayloadType()銆丼etDefaultMark() 鍜?nbsp;SetDefaultTimeStampIncrement() 鏂規硶鏉ュ畬鎴愮殑銆備負 RTP 浼氳瘽璁劇疆榪欎簺榛樿鍙傛暟鐨勫ソ澶勬槸鍙互綆鍖栨暟鎹殑鍙戦侊紝渚嬪錛屽鏋滀負 RTP 浼氳瘽璁劇疆浜嗛粯璁ゅ弬鏁幫細 

 sess.SetDefaultPayloadType(0);
  sess.SetDefaultMark(false);  
 sess.SetDefaultTimeStampIncrement(10);
 


涔嬪悗鍦ㄨ繘琛屾暟鎹彂閫佹椂鍙渶鎸囨槑瑕佸彂閫佺殑鏁版嵁鍙婂叾闀垮害灝卞彲浠ヤ簡錛?nbsp;

 sess.SendPacket(buffer, 5); 


 e銆佸浜庢祦濯掍綋鏁版嵁鐨勬帴鏀剁錛岄鍏堥渶瑕佽皟鐢?nbsp;RTPSession 綾葷殑 PollData() 鏂規硶鏉ユ帴鏀跺彂閫佽繃鏉ョ殑 RTP 鎴栬?nbsp;RTCP 鏁版嵁鎶ャ傜敱浜庡悓涓涓?nbsp;RTP 浼氳瘽涓厑璁告湁澶氫釜鍙備笌鑰咃紙婧愶級錛屼綘鏃㈠彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSource() 鍜?nbsp;GotoNextSource() 鏂規硶鏉ラ亶鍘嗘墍鏈夌殑婧愶紝涔熷彲浠ラ氳繃璋冪敤 RTPSession 綾葷殑 GotoFirstSourceWithData() 鍜?nbsp;GotoNextSourceWithData() 鏂規硶鏉ラ亶鍘嗛偅浜涙惡甯︽湁鏁版嵁鐨勬簮銆傚湪浠?nbsp;RTP 浼氳瘽涓嫻嬪嚭鏈夋晥鐨勬暟鎹簮涔嬪悗錛屾帴涓嬪幓灝卞彲浠ヨ皟鐢?nbsp;RTPSession 綾葷殑 GetNextPacket() 鏂規硶浠庝腑鎶藉彇 RTP 鏁版嵁鎶ワ紝褰撴帴鏀跺埌鐨?nbsp;RTP 鏁版嵁鎶ュ鐞嗗畬涔嬪悗錛屼竴瀹氳璁板緱鍙婃椂閲婃斁銆?br>
JRTPLIB 涓?nbsp;RTP 鏁版嵁鎶ュ畾涔変簡涓夌鎺ユ敹妯″紡錛屽叾涓瘡縐嶆帴鏀舵ā寮忛兘鍏蜂綋瑙勫畾浜嗗摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼氳鎺ュ彈錛岃屽摢浜涘埌杈劇殑 RTP 鏁版嵁鎶ュ皢浼氳鎷掔粷銆傞氳繃璋冪敤 RTPSession 綾葷殑 SetReceiveMode() 鏂規硶鍙互璁劇疆涓嬪垪榪欎簺鎺ユ敹妯″紡錛?nbsp;
? RECEIVEMODE_ALL銆銆緙虹渷鐨勬帴鏀舵ā寮忥紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛?nbsp;
? RECEIVEMODE_IGNORESOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎺ュ彈錛岃岃鎷掔粷鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToIgnoreList()銆丏eleteFromIgnoreList() 鍜?nbsp;ClearIgnoreList() 鏂規硶鏉ヨ繘琛岃緗紱 
? RECEIVEMODE_ACCEPTSOME銆銆闄や簡鏌愪簺鐗瑰畾鐨勫彂閫佽呬箣澶栵紝鎵鏈夊埌杈劇殑 RTP 鏁版嵁鎶ラ兘灝嗚鎷掔粷錛岃岃鎺ュ彈鐨勫彂閫佽呭垪琛ㄥ彲浠ラ氳繃璋冪敤 AddToAcceptList ()銆丏eleteFromAcceptList 鍜?nbsp;ClearAcceptList () 鏂規硶鏉ヨ繘琛岃緗?nbsp;涓嬮潰鏄噰鐢ㄧ涓夌鎺ユ敹妯″紡鐨勭▼搴忕ず渚嬨?br> if (sess.GotoFirstSourceWithData()) {   
  do {   
   sess.AddToAcceptList(remoteIP, allports,portbase);
          sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
 
    RTPPacket *pack;         
    pack = sess.GetNextPacket();            // 澶勭悊鎺ユ敹鍒扮殑鏁版嵁    
    delete pack;   } 
  while (sess.GotoNextSourceWithData()); 
  }


  錛?錛夌▼搴忔祦紼嬪浘
鍙戦侊細鑾峰緱鎺ユ敹绔殑 IP 鍦板潃鍜岀鍙e彿        鍒涘緩 RTP 浼氳瘽        鎸囧畾 RTP 鏁版嵁鎺ユ敹绔?nbsp;璁劇疆 RTP 浼氳瘽榛樿鍙傛暟   鍙戦佹祦濯掍綋鏁版嵁
鎺ユ敹錛氳幏寰楃敤鎴鋒寚瀹氱殑绔彛鍙?nbsp; 鍒涘緩RTP浼氳瘽  璁劇疆鎺ユ敹妯″紡  鎺ュ彈RTP鏁版嵁  媯绱TP鏁版嵁婧?nbsp; 鑾峰彇RTP鏁版嵁鎶?nbsp; 鍒犻櫎RTP鏁版嵁鎶?br>

涓夈佺幆澧冩惌寤哄強緙栬瘧鏂規硶
錛?錛塗oolchain鐨勫畨瑁?br> 棣栧厛鎵懼埌xscale-arm-toolchain.tgz鏂囦歡錛屽亣璁捐鏂囦歡鍖呮斁鍦?tmp/涓?br> #cd /
 #tar -zxvf /tmp/xscale-arm-toolchain.tgz
 鍐嶈緗幆澧冨彉閲?br> #export PATH=/usr/local/arm-linux/bin:$PATH
 鏈鍚庢鏌ヤ竴涓嬩氦鍙夌紪璇戝伐鍏鋒槸鍚﹀畨瑁呮垚鍔?br> #arm-linux-g++ --version
 鐪嬫槸鍚︽樉紺篴rm-linux-g++鐨勭増鏈紝濡傛湁鍒欏畨瑁呮垚鍔熴?br>錛?錛塉RTPLIB 搴撶殑浜ゅ弶緙栬瘧鍙婂畨瑁?br> 棣栧厛浠?nbsp;JRTPLIB 鐨勭綉绔欙紙http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.htmll錛?nbsp;涓嬭澆鏈鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib-2.8.tar錛屽亣璁句笅杞藉悗鐨勬簮鐮佸寘鏀懼湪/tmp涓嬶紝鎵?nbsp;琛屼笅闈㈢殑鍛戒護瀵瑰叾瑙e帇緙╋細
 #cd /tmp
 #tar -zxvf jrtplib-2.8.tar
 鐒跺悗瑕佸jrtplib榪涜閰嶇疆鍜岀紪璇?br> #cd jrtplib-2.8
 #./configure CC=arm-linux-g++ cross-compile=yes
 淇敼Makefile鏂囦歡
 灝嗛摼鎺ュ懡浠d 鍜宎r鏀逛負arm-linux-ld鍜?nbsp;arm-linux-ar
 #make
 鏈鍚庡啀鎵ц濡備笅鍛戒護灝卞彲浠ュ畬鎴?nbsp;JRTPLIB 鐨勫畨瑁咃細
 #make install
(3)紼嬪簭緙栬瘧
 a銆侀厤緗紪璇戠幆澧?br> 鍙互鐢╡xport鏉ラ厤緗紝涔熷彲浠ョ敤緙栧啓Makefile鐨勬柟娉曘傝繖閲岄噰鐢∕akefile銆?br> 緙栧啓Makefile&:
INCL = -I/usr/local/include
CFLAGS = -pipe -O2 -fno-strength-reduce
LFLAGS = /usr/local/lib/libjrtp.a -L/usr/X11R6/lib
LIBS = -LX11 -LXext /usr/local/lib/libjrtp.a
CC = arm-linux-g++

main:main.o
 $(CC) $(LFLAGS) $(INCL) -o main main.o $(LIBS)
main.o:main.cpp

clean:
 rm -f main
 rm -f *.o
 
.SUFFIXES:.cpp
.cpp.o:
 $(CC) -c $(CFLAGS) $(INCL) -o $@ $<         /*  $@琛ㄧず鐩爣鐨勫畬鏁村悕瀛?nbsp;     */
          /* $<琛ㄧず絎竴涓緷璧栨枃浠剁殑鍚嶅瓧 */
 b銆佺紪璇?br> 鍋囪鍙戦佸拰鎺ユ敹紼嬪簭鍒嗗埆鏀懼湪/tmp/send鍜?tmp/receive鐩綍涓?br> #cd /tmp/send
 #make
 #cd /tmp/receive
 #make

鍥涖佹槗鍑洪敊璇強娉ㄦ剰闂
 1銆佹壘涓嶅埌涓浜涙爣鍑嗙殑鏈 鍩烘湰鐨勪竴浜涘ご鏂囦歡銆?br>  涓昏鏄洜涓篢oolchain璺緞娌″畨瑁呭錛岃 涓ユ牸鎸夌収姝ラ瀹夎銆?br> 2銆佹壘涓嶅埌浣跨敤鐨刯rtplib搴撲腑鐨勪竴浜涘ご鏂囦歡銆?br>  鍦?nbsp;jrtplib鐨勫畨瑁呯洰褰曚笅錛宨nclude璺緞涓嬩笉鑳藉啀鏈夊埆鐨勭洰褰曘?br> 3銆乺ecieve鍑芥暟鎺ユ敹鏁版嵁鍖呬笉鑳芥紜彁鍑烘墍瑕佹暟鎹?br>  鐢變簬姣忎竴涓猂TP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛圥ayload錛変袱涓儴鍒嗙粍鎴愶紝鑻ヤ嬌鐢╣etrawdata()鏄繑鍥炴暣涓暟鎹寘鐨勬暟鎹紝鍖呭惈浼犺緭濯掍綋鐨勭被鍨嬨佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅銆俫etpayload()鍑芥暟鏄繑鍥炴墍鍙戦佺殑鏁版嵁銆備袱鑰呬竴瀹氳鍒嗘竻銆?br> 4銆佽緗甊ECEIVEMODE_ACCEPTSOME銆銆鎺ユ敹妯″紡鍚庯紝榪愯紼嬪簭鎺ユ敹绔笉鑳芥帴鍖呫?br>  IP鍦板潃鏍煎紡鍑轟簡闂銆俰ner_addr()涓巒tohl()鍑芥暟瑕佺敤瀵癸紝鍚﹀垯鍙傛暟浼犱笉榪涘幓錛屾帴鍙楀垪琛ㄤ腑鏃犲鹼紝褰撶劧鎺ユ敹涓嶄簡鏁版嵁鍖呫?br> 5銆佺紪璇戦氳繃錛屼絾嫻嬭瘯鏃舵帴鏀剁涓嶈兘鎺ユ敹鍒版暟鎹?br>  鍙兘鏄帴鏀舵満闃茬伀澧欐湭鍏抽棴銆傝繍琛岋細
  #iptables -F
  涔熷彲鑳芥槸IP鍦板潃娌℃湁璁劇疆濂姐傝繍琛岋細
  #ifocnfig eth0  *.*.*.*  netmask *.*.*.*
 6銆佷嬌鐢╦rtolib搴撴椂錛屽湪紼嬪簭涓璱nclude 鍚庢渶濂藉姞涓婂簱鎵鍦ㄧ殑璺緞銆?br>浜斻佺▼搴?br>
send:

#include <stdio.h>
#include <string.h>
#include "rtpsession.h"

// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
  if (err < 0) {
    char* errstr = RTPGetErrorString(err);
    printf("Error:%s\\n", errstr);
    exit(-1);
  }
}

int main(int argc, char** argv)
{
  RTPSession sess;
  unsigned long destip;
  int destport;
  int portbase = 6000;
  int status, index;
  char buffer[128];

  if (argc != 3) {
    printf("Usage: ./sender destip destport\\n");
    return -1;
  }

  // 鑾峰緱鎺ユ敹绔殑IP鍦板潃鍜岀鍙e彿
  destip = inet_addr(argv[1]);
  if (destip == INADDR_NONE) {
    printf("Bad IP address specified.\\n");
    return -1;
  }
  destip = ntohl(destip);
  destport = atoi(argv[2]);

  // 鍒涘緩RTP浼氳瘽
  status = sess.Create(portbase);
  checkerror(status);

  // 鎸囧畾RTP鏁版嵁鎺ユ敹绔?br>  status = sess.AddDestination(destip, destport);
  checkerror(status);

  // 璁劇疆RTP浼氳瘽榛樿鍙傛暟
  sess.SetDefaultPayloadType(0);
  sess.SetDefaultMark(false);
  sess.SetDefaultTimeStampIncrement(10);

  // 鍙戦佹祦濯掍綋鏁版嵁
  index = 1;
  do {
    sprintf(buffer, "%d: RTP packet", index ++);
    sess.SendPacket(buffer, strlen(buffer));
    printf("Send packet !\\n");
  } while(1);

  return 0;
}






receive:

#include <stdio.h>
#include "rtpsession.h"
#include "rtppacket.h"

// 閿欒澶勭悊鍑芥暟
void checkerror(int err)
{
  if (err < 0) {
    char* errstr = RTPGetErrorString(err);
    printf("Error:%s\\n", errstr);
    exit(-1);
  }
}

int main(int argc, char** argv)
{
  RTPSession sess;
  int localport,portbase;
  int status;
  unsigned long remoteIP;
  if (argc != 4) {
    printf("Usage: ./sender localport\\n");
    return -1;
  }

   // 鑾峰緱鐢ㄦ埛鎸囧畾鐨勭鍙e彿
   
  remoteIP = inet_addr(argv[1]);
  localport = atoi(argv[2]);
  portbase = atoi(argv[3]);
  // 鍒涘緩RTP浼氳瘽
  status = sess.Create(localport);
  checkerror(status);
  
  //RTPHeader *rtphdr;
  unsigned long timestamp1;
  unsigned char * RawData;
  unsigned char temp[30];
  int lengh ,i;
  bool allports = 1;
  
  sess.AddToAcceptList(remoteIP, allports,portbase);
  
     do {
 //璁劇疆鎺ユ敹妯″紡
        sess.SetReceiveMode(RECEIVEMODE_ACCEPTSOME);
   sess.AddToAcceptList(remoteIP, allports,portbase);

    // 鎺ュ彈RTP鏁版嵁
    status = sess.PollData();

    
 // 媯绱TP鏁版嵁婧?br>    if (sess.GotoFirstSourceWithData()) {
      do {
        
        RTPPacket* packet;
        // 鑾峰彇RTP鏁版嵁鎶?br>        while ((packet = sess.GetNextPacket()) != NULL) {
          printf("Got packet !\n");

   timestamp1 = packet->GetTimeStamp();
   lengh=packet->GetPayloadLength();
   RawData=packet->GetPayload();
   
   for(i=0;i<lengh;i++){
      temp[i]=RawData[i];
  printf("%c",temp[i]);
   }
   temp[i]='\0';
   printf("  timestamp: %d lengh=%d data:%s\n",timestamp1,lengh,&temp);
          // 鍒犻櫎RTP鏁版嵁鎶?br>   
          delete packet;
        }
      } while (sess.GotoNextSourceWithData());
    }
  } while(1);

  return 0;
}



Xiao.Zhu 2007-08-08 16:39 鍙戣〃璇勮
]]>
RTPhttp://m.shnenglu.com/zzh/archive/2007/08/08/29577.htmlXiao.ZhuXiao.ZhuWed, 08 Aug 2007 08:38:00 GMThttp://m.shnenglu.com/zzh/archive/2007/08/08/29577.htmlhttp://m.shnenglu.com/zzh/comments/29577.htmlhttp://m.shnenglu.com/zzh/archive/2007/08/08/29577.html#Feedback1http://m.shnenglu.com/zzh/comments/commentRss/29577.htmlhttp://m.shnenglu.com/zzh/services/trackbacks/29577.html嫻佸獟浣撴寚鐨勬槸鍦ㄧ綉緇滀腑浣跨敤嫻佹妧鏈紶杈撶殑榪炵畫鏃跺熀濯掍綋錛屽叾鐗圭偣鏄湪鎾斁鍓嶄笉闇瑕佷笅杞芥暣涓枃浠訛紝鑰屾槸閲囩敤杈逛笅杞借竟鎾斁鐨勬柟寮忥紝瀹冩槸瑙嗛浼氳銆?span>IP鐢佃瘽絳夊簲鐢ㄥ満鍚堢殑鎶鏈熀紜銆?span>RTP鏄繘琛屽疄鏃舵祦濯掍綋浼犺緭鐨勬爣鍑嗗崗璁拰鍏抽敭鎶鏈紝鏈枃浠嬬粛濡備綍鍦?span>Linux涓嬪埄鐢?span>JRTPLIB榪涜瀹炴椂嫻佸獟浣撶紪紼嬨?nbsp;

  

涓銆佹祦濯掍綋綆浠?/span>
        
闅忕潃Internet鐨勬棩鐩婃櫘鍙婏紝鍦ㄧ綉緇滀笂浼犺緭鐨勬暟鎹凡緇忎笉鍐嶅眬闄愪簬鏂囧瓧鍜屽浘褰紝鑰屾槸閫愭笎鍚戝0闊沖拰瑙嗛絳夊濯掍綋鏍煎紡榪囨浮銆傜洰鍓嶅湪緗戠粶涓婁紶杈撻煶棰?span>/瑙嗛錛?span>Audio/Video錛岀畝縐?span>A/V錛夌瓑澶氬獟浣撴枃浠舵椂錛屽熀鏈笂鍙湁涓嬭澆鍜屾祦寮忎紶杈撲袱縐嶉夋嫨銆傞氬父璇存潵錛?span>A/V鏂囦歡鍗犳嵁鐨勫瓨鍌ㄧ┖闂撮兘姣旇緝澶э紝鍦ㄥ甫瀹藉彈闄愮殑緗戠粶鐜涓笅杞藉彲鑳借鑰楄垂鏁板垎閽熺敋鑷蟲暟灝忔椂錛屾墍浠ヨ繖縐嶅鐞嗘柟娉曠殑寤惰繜寰堝ぇ銆傚鏋滄崲鐢ㄦ祦寮忎紶杈撶殑璇濓紝澹伴煶銆佸獎鍍忋佸姩鐢葷瓑澶氬獟浣撴枃浠跺皢鐢變笓闂ㄧ殑嫻佸獟浣撴湇鍔″櫒璐熻矗鍚戠敤鎴瘋繛緇佸疄鏃跺湴鍙戦侊紝榪欐牱鐢ㄦ埛鍙互涓嶅繀絳夊埌鏁翠釜鏂囦歡鍏ㄩ儴涓嬭澆瀹屾瘯錛岃屽彧闇瑕佺粡榪囧嚑縐掗挓鐨勫惎鍔ㄥ歡鏃跺氨鍙互浜嗭紝褰撹繖浜涘濯掍綋鏁版嵁鍦ㄥ鎴鋒満涓婃挱鏀炬椂錛屾枃浠剁殑鍓╀綑閮ㄥ垎灝嗙戶緇粠嫻佸獟浣撴湇鍔″櫒涓嬭澆銆?/span>

 

        嫻侊紙Streaming錛夋槸榪戝勾鍦?span>Internet涓婂嚭鐜扮殑鏂版蹇碉紝鍏跺畾涔夐潪甯稿箍娉涳紝涓昏鏄寚閫氳繃緗戠粶浼犺緭澶氬獟浣撴暟鎹殑鎶鏈葷О銆傛祦濯掍綋鍖呭惈騫夸箟鍜岀嫮涔変袱縐嶅唴娑碉細騫夸箟涓婄殑嫻佸獟浣撴寚鐨勬槸浣塊煶棰戝拰瑙嗛褰㈡垚紼沖畾鍜岃繛緇殑浼犺緭嫻佸拰鍥炴斁嫻佺殑涓緋誨垪鎶鏈佹柟娉曞拰鍗忚鐨勬葷О錛屽嵆嫻佸獟浣撴妧鏈紱鐙箟涓婄殑嫻佸獟浣撴槸鐩稿浜庝紶緇熺殑涓嬭澆-鍥炴斁鏂瑰紡鑰岃█鐨勶紝鎸囩殑鏄竴縐嶄粠Internet涓婅幏鍙栭煶棰戝拰瑙嗛絳夊濯掍綋鏁版嵁鐨勬柊鏂規硶錛屽畠鑳藉鏀寔澶氬獟浣撴暟鎹祦鐨勫疄鏃朵紶杈撳拰瀹炴椂鎾斁銆傞氳繃榪愮敤嫻佸獟浣撴妧鏈紝鏈嶅姟鍣ㄨ兘澶熷悜瀹㈡埛鏈哄彂閫佺ǔ瀹氬拰榪炵畫鐨勫濯掍綋鏁版嵁嫻侊紝瀹㈡埛鏈哄湪鎺ユ敹鏁版嵁鐨勫悓鏃朵互涓涓ǔ瀹氱殑閫熺巼鍥炴斁錛岃屼笉鐢ㄧ瓑鏁版嵁鍏ㄩ儴涓嬭澆瀹屼箣鍚庡啀榪涜鍥炴斁銆?/span>

 

鐢變簬鍙楃綉緇滃甫瀹姐佽綆楁満澶勭悊鑳藉姏鍜屽崗璁鑼冪瓑鏂歸潰鐨勯檺鍒訛紝瑕佹兂浠?span>Internet涓婁笅杞藉ぇ閲忕殑闊抽鍜岃棰戞暟鎹紝鏃犺浠庝笅杞芥椂闂村拰瀛樺偍絀洪棿涓婃潵璁查兘鏄笉澶幇瀹炵殑錛岃屾祦濯掍綋鎶鏈殑鍑虹幇鍒欏緢濂藉湴瑙e喅浜嗚繖涓闅鵑銆傜洰鍓嶅疄鐜版祦濯掍綋浼犺緭涓昏鏈変袱縐嶆柟娉曪細欏哄簭嫻侊紙progressive streaming錛変紶杈撳拰瀹炴椂嫻侊紙realtime streaming錛変紶杈擄紝瀹冧滑鍒嗗埆閫傚悎浜庝笉鍚岀殑搴旂敤鍦哄悎銆?/span>

 

欏哄簭嫻佷紶杈?/span>

 

        欏哄簭嫻佷紶杈撻噰鐢ㄩ『搴忎笅杞界殑鏂瑰紡榪涜浼犺緭錛屽湪涓嬭澆鐨勫悓鏃剁敤鎴峰彲浠ュ湪綰垮洖鏀懼濯掍綋鏁版嵁錛屼絾緇欏畾鏃跺埢鍙兘瑙傜湅宸茬粡涓嬭澆鐨勯儴鍒嗭紝涓嶈兘璺沖埌灝氭湭涓嬭澆鐨勯儴鍒嗭紝涔熶笉鑳藉湪浼犺緭鏈熼棿鏍規嵁緗戠粶鐘跺喌瀵逛笅杞介熷害榪涜璋冩暣銆傜敱浜庢爣鍑嗙殑HTTP鏈嶅姟鍣ㄥ氨鍙互鍙戦佽繖縐嶅艦寮忕殑嫻佸獟浣擄紝鑰屼笉闇瑕佸叾浠栫壒孌婂崗璁殑鏀寔錛屽洜姝や篃甯稿父琚О浣?span>HTTP 嫻佸紡浼犺緭銆傞『搴忔祦寮忎紶杈撴瘮杈冮傚悎浜庨珮璐ㄩ噺鐨勫濯掍綋鐗囨錛屽鐗囧ご銆佺墖灝炬垨鑰呭箍鍛婄瓑銆?/span>

 

瀹炴椂嫻佷紶杈?/span>

 

        瀹炴椂嫻佸紡浼犺緭淇濊瘉濯掍綋淇″彿甯﹀鑳藉涓庡綋鍓嶇綉緇滅姸鍐電浉鍖歸厤錛屼粠鑰屼嬌寰楁祦濯掍綋鏁版嵁鎬繪槸琚疄鏃跺湴浼犻侊紝鍥犳鐗瑰埆閫傚悎浜庣幇鍦轟簨浠躲傚疄鏃舵祦浼犺緭鏀寔闅忔満璁塊棶錛屽嵆鐢ㄦ埛鍙互閫氳繃蹇繘鎴栬呭悗閫鎿嶄綔鏉ヨ鐪嬪墠闈㈡垨鑰呭悗闈㈢殑鍐呭銆備粠鐞嗚涓婅錛屽疄鏃舵祦濯掍綋涓緇忔挱鏀懼氨涓嶄細鍋滈】錛屼絾浜嬪疄涓婁粛鏈夊彲鑳藉彂鐢熷懆鏈熸х殑鏆傚仠鐜拌薄錛屽挨鍏舵槸鍦ㄧ綉緇滅姸鍐墊伓鍖栨椂鏇存槸濡傛銆備笌欏哄簭嫻佷紶杈撲笉鍚岀殑鏄紝瀹炴椂嫻佷紶杈撻渶瑕佺敤鍒扮壒瀹氱殑嫻佸獟浣撴湇鍔″櫒錛岃屼笖榪橀渶瑕佺壒瀹氱綉緇滃崗璁殑鏀寔銆?/span>

 

浜屻佹祦濯掍綋鍗忚
瀹炴椂浼犺緭鍗忚錛?span>Real-time Transport Protocol錛?span>PRT錛夋槸鍦?span>Internet涓婂鐞嗗濯掍綋鏁版嵁嫻佺殑涓縐嶇綉緇滃崗璁紝鍒╃敤瀹冭兘澶熷湪涓瀵逛竴錛?span>unicast錛屽崟鎾級鎴栬呬竴瀵瑰錛?span>multicast錛屽鎾級鐨勭綉緇滅幆澧冧腑瀹炵幇浼犳祦濯掍綋鏁版嵁鐨勫疄鏃朵紶杈撱?span>RTP閫氬父浣跨敤UDP鏉ヨ繘琛屽濯掍綋鏁版嵁鐨勪紶杈擄紝浣嗗鏋滈渶瑕佺殑璇濆彲浠ヤ嬌鐢?span>TCP鎴栬?span> ATM絳夊叾瀹冨崗璁紝鏁翠釜RTP鍗忚鐢變袱涓瘑鍒囩浉鍏崇殑閮ㄥ垎緇勬垚錛?span>RTP鏁版嵁鍗忚鍜?span>RTP鎺у埗鍗忚銆傚疄鏃舵祦鍗忚錛?span>Real Time Streaming Protocol錛?span>RTSP錛夋渶鏃╃敱Real Networks鍜?span>Netscape鍏徃鍏卞悓鎻愬嚭錛屽畠浣嶄簬RTP鍜?span>RTCP涔嬩笂錛屽叾鐩殑鏄笇鏈涢氳繃IP緗戠粶鏈夋晥鍦頒紶杈撳濯掍綋鏁版嵁銆?/span>

 

2.1 RTP鏁版嵁鍗忚

 

RTP鏁版嵁鍗忚璐熻矗瀵規祦濯掍綋鏁版嵁榪涜灝佸寘騫跺疄鐜板獟浣撴祦鐨勫疄鏃朵紶杈擄紝姣忎竴涓?span>RTP鏁版嵁鎶ラ兘鐢卞ご閮紙Header錛夊拰璐熻澆錛?span>Payload錛変袱涓儴鍒嗙粍鎴愶紝鍏朵腑澶撮儴鍓?span>12涓瓧鑺傜殑鍚箟鏄浐瀹氱殑錛岃岃礋杞藉垯鍙互鏄煶棰戞垨鑰呰棰戞暟鎹?span>RTP鏁版嵁鎶ョ殑澶撮儴鏍煎紡濡傚浘1鎵紺猴細

 

 
鍥?span>1 RTP澶撮儴鏍煎紡

 

鍏朵腑姣旇緝閲嶈鐨勫嚑涓煙鍙婂叾鎰忎箟濡備笅錛?nbsp;

 

  • CSRC璁版暟錛?span>CC錛?/span>銆銆琛ㄧずCSRC鏍囪瘑鐨勬暟鐩?span>CSRC鏍囪瘑绱ц窡鍦?span>RTP鍥哄畾澶撮儴涔嬪悗錛岀敤鏉ヨ〃紺?span>RTP鏁版嵁鎶ョ殑鏉ユ簮錛?span>RTP鍗忚鍏佽鍦ㄥ悓涓涓細璇濅腑瀛樺湪澶氫釜鏁版嵁婧愶紝瀹冧滑鍙互閫氳繃RTP娣峰悎鍣ㄥ悎騫朵負涓涓暟鎹簮銆備緥濡傦紝鍙互浜х敓涓涓?span>CSRC鍒楄〃鏉ヨ〃紺轟竴涓數璇濅細璁紝璇ヤ細璁氳繃涓涓?span> RTP娣峰悎鍣ㄥ皢鎵鏈夎璇濊呯殑璇煶鏁版嵁緇勫悎涓轟竴涓?span>RTP鏁版嵁婧愩?nbsp;
  • 璐熻澆綾誨瀷錛?span>PT錛?/span>銆銆鏍囨槑RTP璐熻澆鐨勬牸寮忥紝鍖呮嫭鎵閲囩敤鐨勭紪鐮佺畻娉曘侀噰鏍烽鐜囥佹壙杞介氶亾絳夈備緥濡傦紝綾誨瀷2琛ㄦ槑璇?span>RTP鏁版嵁鍖呬腑鎵胯澆鐨勬槸鐢?span>ITU G.721綆楁硶緙栫爜鐨勮闊蟲暟鎹紝閲囨牱棰戠巼涓?span>8000Hz錛屽茍涓旈噰鐢ㄥ崟澹伴亾銆?nbsp;
  • 搴忓垪鍙?/span>銆銆鐢ㄦ潵涓烘帴鏀舵柟鎻愪緵鎺㈡祴鏁版嵁涓㈠け鐨勬柟娉曪紝浣嗗浣曞鐞嗕涪澶辯殑鏁版嵁鍒欐槸搴旂敤紼嬪簭鑷繁鐨勪簨鎯咃紝RTP鍗忚鏈韓騫朵笉璐熻矗鏁版嵁鐨勯噸浼犮?nbsp;
  • 鏃墮棿鎴?/span>銆銆璁板綍浜嗚礋杞戒腑絎竴涓瓧鑺傜殑閲囨牱鏃墮棿錛屾帴鏀舵柟鑳藉鏃墮棿鎴寵兘澶熺‘瀹氭暟鎹殑鍒拌揪鏄惁鍙楀埌浜嗗歡榪熸姈鍔ㄧ殑褰卞搷錛屼絾鍏蜂綋濡備綍鏉ヨˉ鍋垮歡榪熸姈鍔ㄥ垯鏄簲鐢ㄧ▼搴忚嚜宸辯殑浜嬫儏銆?nbsp;

浠?span>RTP 鏁版嵁鎶ョ殑鏍煎紡涓嶉毦鐪嬪嚭錛屽畠鍖呭惈浜嗕紶杈撳獟浣撶殑綾誨瀷銆佹牸寮忋佸簭鍒楀彿銆佹椂闂存埑浠ュ強鏄惁鏈夐檮鍔犳暟鎹瓑淇℃伅錛岃繖浜涢兘涓哄疄鏃剁殑嫻佸獟浣撲紶杈撴彁渚涗簡鐩稿簲鐨勫熀紜銆?span>RTP鍗忚鐨勭洰鐨勬槸鎻愪緵瀹炴椂鏁版嵁錛堝浜や簰寮忕殑闊抽鍜岃棰戯級鐨勭鍒扮浼犺緭鏈嶅姟錛屽洜姝ゅ湪RTP涓病鏈夎繛鎺ョ殑姒傚康錛屽畠鍙互寤虹珛鍦ㄥ簳灞傜殑闈㈠悜榪炴帴鎴栭潰鍚戦潪榪炴帴鐨勪紶杈撳崗璁箣涓婏紱RTP涔熶笉渚濊禆浜庣壒鍒殑緗戠粶鍦板潃鏍煎紡錛岃屼粎浠呭彧闇瑕佸簳灞備紶杈撳崗璁敮鎸佺粍甯э紙Framing錛夊拰鍒嗘錛?span>Segmentation錛夊氨瓚沖浜嗭紱鍙﹀RTP 鏈韓榪樹笉鎻愪緵浠諱綍鍙潬鎬ф満鍒訛紝榪欎簺閮借鐢變紶杈撳崗璁垨鑰呭簲鐢ㄧ▼搴忚嚜宸辨潵淇濊瘉銆傚湪鍏稿瀷鐨勫簲鐢ㄥ満鍚堜笅錛?span>RTP 涓鑸槸鍦ㄤ紶杈撳崗璁箣涓婁綔涓哄簲鐢ㄧ▼搴忕殑涓閮ㄥ垎鍔犱互瀹炵幇鐨勶紝濡傚浘2鎵紺猴細

 


鍥?span>2 RTP涓庡悇縐嶇綉緇滃崗璁殑鍏崇郴

 

2.2 RTCP鎺у埗鍗忚

 

RTCP 鎺у埗鍗忚闇瑕佷笌RTP鏁版嵁鍗忚涓璧烽厤鍚堜嬌鐢紝褰撳簲鐢ㄧ▼搴忓惎鍔ㄤ竴涓?span>RTP浼氳瘽鏃跺皢鍚屾椂鍗犵敤涓や釜绔彛錛屽垎鍒緵RTP 鍜?span>RTCP浣跨敤銆?span>RTP鏈韓騫朵笉鑳戒負鎸夊簭浼犺緭鏁版嵁鍖呮彁渚涘彲闈犵殑淇濊瘉錛屼篃涓嶆彁渚涙祦閲忔帶鍒跺拰鎷ュ鎺у埗錛岃繖浜涢兘鐢?span>RTCP鏉ヨ礋璐e畬鎴愩傞氬父RTCP浼氶噰鐢ㄤ笌 RTP鐩稿悓鐨勫垎鍙戞満鍒訛紝鍚戜細璇濅腑鐨勬墍鏈夋垚鍛樺懆鏈熸у湴鍙戦佹帶鍒朵俊鎭紝搴旂敤紼嬪簭閫氳繃鎺ユ敹榪欎簺鏁版嵁錛屼粠涓幏鍙栦細璇濆弬涓庤呯殑鐩稿叧璧勬枡錛屼互鍙婄綉緇滅姸鍐點佸垎緇勪涪澶辨鐜囩瓑鍙嶉淇℃伅錛屼粠鑰岃兘澶熷鏈嶅姟璐ㄩ噺榪涜鎺у埗鎴栬呭緗戠粶鐘跺喌榪涜璇婃柇銆?/span>

 

RTCP鍗忚鐨勫姛鑳芥槸閫氳繃涓嶅悓鐨?span>RTCP鏁版嵁鎶ユ潵瀹炵幇鐨勶紝涓昏鏈夊涓嬪嚑縐嶇被鍨嬶細 

 

  • SR銆銆鍙戦佺鎶ュ憡錛屾墍璋撳彂閫佺鏄寚鍙戝嚭RTP鏁版嵁鎶ョ殑搴旂敤紼嬪簭鎴栬呯粓绔紝鍙戦佺鍚屾椂涔熷彲浠ユ槸鎺ユ敹绔?nbsp;
  • RR銆銆鎺ユ敹绔姤鍛婏紝鎵璋撴帴鏀剁鏄寚浠呮帴鏀朵絾涓嶅彂閫?span>RTP鏁版嵁鎶ョ殑搴旂敤紼嬪簭鎴栬呯粓绔?nbsp;
  • SDES銆銆婧愭弿榪幫紝涓昏鍔熻兘鏄綔涓轟細璇濇垚鍛樻湁鍏蟲爣璇嗕俊鎭殑杞戒綋錛屽鐢ㄦ埛鍚嶃侀偖浠跺湴鍧銆佺數璇濆彿鐮佺瓑錛屾澶栬繕鍏鋒湁鍚戜細璇濇垚鍛樹紶杈句細璇濇帶鍒朵俊鎭殑鍔熻兘銆?nbsp;
  • BYE銆銆閫氱煡紱誨紑錛屼富瑕佸姛鑳芥槸鎸囩ず鏌愪竴涓垨鑰呭嚑涓簮涓嶅啀鏈夋晥錛屽嵆閫氱煡浼氳瘽涓殑鍏朵粬鎴愬憳鑷繁灝嗛鍑轟細璇濄?nbsp;
  • APP銆銆鐢卞簲鐢ㄧ▼搴忚嚜宸卞畾涔夛紝瑙e喅浜?span>RTCP鐨勬墿灞曟ч棶棰橈紝騫朵笖涓哄崗璁殑瀹炵幇鑰呮彁渚涗簡寰堝ぇ鐨勭伒媧繪с?nbsp;

RTCP鏁版嵁鎶ユ惡甯︽湁鏈嶅姟璐ㄩ噺鐩戞帶鐨勫繀瑕佷俊鎭紝鑳藉瀵規湇鍔¤川閲忚繘琛屽姩鎬佺殑璋冩暣錛屽茍鑳藉瀵圭綉緇滄嫢濉炶繘琛屾湁鏁堢殑鎺у埗銆傜敱浜?span>RTCP鏁版嵁鎶ラ噰鐢ㄧ殑鏄鎾柟寮忥紝鍥犳浼氳瘽涓殑鎵鏈夋垚鍛橀兘鍙互閫氳繃RTCP鏁版嵁鎶ヨ繑鍥炵殑鎺у埗淇℃伅錛屾潵浜嗚В鍏朵粬鍙備笌鑰呯殑褰撳墠鎯呭喌銆?/span>

 

鍦ㄤ竴涓吀鍨嬬殑搴旂敤鍦哄悎涓嬶紝鍙戦佸獟浣撴祦鐨勫簲鐢ㄧ▼搴忓皢鍛ㄦ湡鎬у湴浜х敓鍙戦佺鎶ュ憡SR錛岃RTCP鏁版嵁鎶ュ惈鏈変笉鍚屽獟浣撴祦闂寸殑鍚屾淇℃伅錛屼互鍙婂凡緇忓彂閫佺殑鏁版嵁鎶ュ拰瀛楄妭鐨勮鏁幫紝鎺ユ敹绔牴鎹繖浜涗俊鎭彲浠ヤ及璁″嚭瀹為檯鐨勬暟鎹紶杈撻熺巼銆傚彟涓鏂歸潰錛屾帴鏀剁浼氬悜鎵鏈夊凡鐭ョ殑鍙戦佺鍙戦佹帴鏀剁鎶ュ憡RR錛岃RTCP鏁版嵁鎶ュ惈鏈夊凡鎺ユ敹鏁版嵁鎶ョ殑鏈澶у簭鍒楀彿銆佷涪澶辯殑鏁版嵁鎶ユ暟鐩佸歡鏃舵姈鍔ㄥ拰鏃墮棿鎴崇瓑閲嶈淇℃伅錛屽彂閫佺搴旂敤鏍規嵁榪欎簺淇℃伅鍙互浼拌鍑哄線榪旀椂寤訛紝騫朵笖鍙互鏍規嵁鏁版嵁鎶ヤ涪澶辨鐜囧拰鏃跺歡鎶栧姩鎯呭喌鍔ㄦ佽皟鏁村彂閫侀熺巼錛屼互鏀瑰杽緗戠粶鎷ュ鐘跺喌錛屾垨鑰呮牴鎹綉緇滅姸鍐靛鉤婊戝湴璋冩暣搴旂敤紼嬪簭鐨勬湇鍔¤川閲忋?/span>

 

2.3 RTSP瀹炴椂嫻佸崗璁?/span>

 

浣滀負涓涓簲鐢ㄥ眰鍗忚錛?span>RTSP鎻愪緵浜嗕竴涓彲渚涙墿灞曠殑妗嗘灦錛屽畠鐨勬剰涔夊湪浜庝嬌寰楀疄鏃舵祦濯掍綋鏁版嵁鐨勫彈鎺у拰鐐規挱鍙樺緱鍙兘銆傛葷殑璇存潵錛?span>RTSP鏄竴涓祦濯掍綋琛ㄧず鍗忚錛屼富瑕佺敤鏉ユ帶鍒跺叿鏈夊疄鏃剁壒鎬х殑鏁版嵁鍙戦侊紝浣嗗畠鏈韓騫朵笉浼犺緭鏁版嵁錛岃屾槸蹇呴』渚濊禆浜庝笅灞備紶杈撳崗璁墍鎻愪緵鐨勬煇浜涙湇鍔°?span>RTSP 鍙互瀵規祦濯掍綋鎻愪緵璇稿鎾斁銆佹殏鍋溿佸揩榪涚瓑鎿嶄綔錛屽畠璐熻矗瀹氫箟鍏蜂綋鐨勬帶鍒舵秷鎭佹搷浣滄柟娉曘佺姸鎬佺爜絳夛紝姝ゅ榪樻弿榪頒簡涓?span>RTP闂寸殑浜や簰鎿嶄綔銆?/span>

 

RTSP 鍦ㄥ埗瀹氭椂杈冨鍦板弬鑰冧簡HTTP/1.1鍗忚錛岀敋鑷寵澶氭弿榪頒笌HTTP/1.1瀹屽叏鐩稿悓銆?span>RTSP涔嬫墍浠ョ壒鎰忎嬌鐢ㄤ笌HTTP/1.1綾諱技鐨勮娉曞拰鎿嶄綔錛屽湪寰堝ぇ紼嬪害涓婃槸涓轟簡鍏煎鐜版湁鐨?span>Web鍩虹緇撴瀯錛屾鍥犲姝わ紝HTTP/1.1鐨勬墿灞曟満鍒跺ぇ閮藉彲浠ョ洿鎺ュ紩鍏ュ埌RTSP 涓?/span>

 

鐢?span>RTSP 鎺у埗鐨勫獟浣撴祦闆嗗悎鍙互鐢ㄨ〃紺烘弿榪幫紙Presentation Description錛夋潵瀹氫箟錛屾墍璋撹〃紺烘槸鎸囨祦濯掍綋鏈嶅姟鍣ㄦ彁渚涚粰瀹㈡埛鏈虹殑涓涓垨鑰呭涓獟浣撴祦鐨勯泦鍚堬紝鑰岃〃紺烘弿榪板垯鍖呭惈浜嗕竴涓〃紺轟腑鍚勪釜濯掍綋嫻佺殑鐩稿叧淇℃伅錛屽鏁版嵁緙栫爜/瑙g爜綆楁硶銆佺綉緇滃湴鍧銆佸獟浣撴祦鐨勫唴瀹圭瓑銆?/span>

 

铏界劧RTSP鏈嶅姟鍣ㄥ悓鏍蜂篃浣跨敤鏍囪瘑絎︽潵鍖哄埆姣忎竴嫻佽繛鎺ヤ細璇濓紙Session錛夛紝浣?span>RTSP榪炴帴騫舵病鏈夎緇戝畾鍒頒紶杈撳眰榪炴帴錛堝TCP絳夛級錛屼篃灝辨槸璇村湪鏁翠釜 RTSP榪炴帴鏈熼棿錛?span>RTSP鐢ㄦ埛鍙墦寮鎴栬呭叧闂涓RTSP鏈嶅姟鍣ㄧ殑鍙潬浼犺緭榪炴帴浠ュ彂鍑?span>RTSP 璇鋒眰銆傛澶栵紝RTSP榪炴帴涔熷彲浠ュ熀浜庨潰鍚戞棤榪炴帴鐨勪紶杈撳崗璁紙濡?span>UDP絳夛級銆?/span>

 

RTSP鍗忚鐩墠鏀寔浠ヤ笅鎿嶄綔錛?nbsp;

 

  • 媯绱㈠獟浣?/span>銆銆鍏佽鐢ㄦ埛閫氳繃HTTP鎴栬呭叾瀹冩柟娉曞悜濯掍綋鏈嶅姟鍣ㄦ彁浜や竴涓〃紺烘弿榪般傚琛ㄧず鏄粍鎾殑錛屽垯琛ㄧず鎻忚堪灝卞寘鍚敤浜庤濯掍綋嫻佺殑緇勬挱鍦板潃鍜岀鍙e彿錛涘鏋滆〃紺烘槸鍗曟挱鐨勶紝涓轟簡瀹夊叏鍦ㄨ〃紺烘弿榪頒腑搴旇鍙彁渚涚洰鐨勫湴鍧銆?nbsp;
  • 閭璇峰姞鍏?/span>銆銆濯掍綋鏈嶅姟鍣ㄥ彲浠ヨ閭璇峰弬鍔犳鍦ㄨ繘琛岀殑浼氳錛屾垨鑰呭湪琛ㄧず涓洖鏀懼獟浣擄紝鎴栬呭湪琛ㄧず涓綍鍒跺叏閮ㄥ獟浣撴垨鍏跺瓙闆嗭紝闈炲父閫傚悎浜庡垎甯冨紡鏁欏銆?nbsp;
  • 娣誨姞濯掍綋銆銆閫氱煡鐢ㄦ埛鏂板姞鍏ョ殑鍙埄鐢ㄥ獟浣撴祦錛岃繖瀵圭幇鍦鴻搴ф潵璁叉樉寰楀挨鍏舵湁鐢ㄣ備笌HTTP/1.1綾諱技錛?span>RTSP璇鋒眰涔熷彲浠ヤ氦鐢變唬鐞嗐侀氶亾鎴栬呯紦瀛樻潵榪涜澶勭悊銆?nbsp;

涓夈佹祦濯掍綋緙栫▼ 
RTP 
鏄洰鍓嶈В鍐蟲祦濯掍綋瀹炴椂浼犺緭闂鐨勬渶濂藉姙娉曪紝濡傛灉闇瑕佸湪Linux騫沖彴涓婅繘琛屽疄鏃舵祦濯掍綋緙栫▼錛屽彲浠ヨ冭檻浣跨敤涓浜涘紑鏀炬簮浠g爜鐨?span>RTP搴擄紝濡?span>LIBRTP銆?span> JRTPLIB絳夈?span>JRTPLIB鏄竴涓潰鍚戝璞$殑RTP搴擄紝瀹冨畬鍏ㄩ伒寰?span>RFC 1889璁捐錛屽湪寰堝鍦哄悎涓嬫槸涓涓潪甯鎬笉閿欑殑閫夋嫨錛屼笅闈㈠氨浠?span>JRTPLIB涓轟緥錛岃榪板浣曞湪Linux騫沖彴涓婅繍鐢?span>RTP鍗忚榪涜瀹炴椂嫻佸獟浣撶紪紼嬨?/span>

 

3.1 鐜鎼緩

 

JRTPLIB 鏄竴涓敤C++璇█瀹炵幇鐨?span>RTP搴擄紝鐩墠宸茬粡鍙互榪愯鍦?span>Windows銆?span>Linux銆?span>FreeBSD銆?span> Solaris銆?span>Unix鍜?span>VxWorks絳夊縐嶆搷浣滅郴緇熶笂銆傝涓?span>Linux 緋葷粺瀹夎JRTPLIB錛岄鍏堜粠JRTPLIB鐨勭綉绔欙紙http: //lumumba.luc.ac.be/jori/jrtplib/jrtplib.html錛変笅杞芥渶鏂扮殑婧愮爜鍖咃紝姝ゅ浣跨敤鐨勬槸jrtplib- 2.7b.tar.bz2銆傚亣璁句笅杞藉悗鐨勬簮鐮佸寘淇濆瓨鍦?span>/usr/local/src鐩綍涓嬶紝鎵ц涓嬮潰鐨勫懡浠ゅ彲浠ュ鍏惰繘琛岃В鍘嬬緝錛?/span>

 



[root@linuxgam src]# bzip2 -dc jrtplib-2.7b.tar.bz2 | tar xvf -

 



Xiao.Zhu 2007-08-08 16:38 鍙戣〃璇勮
]]>
灝嗚繘紼嬪彉鎴愪竴涓嚎紼嬫墽琛屼唬鐮?/title><link>http://m.shnenglu.com/zzh/archive/2007/08/08/29574.html</link><dc:creator>Xiao.Zhu</dc:creator><author>Xiao.Zhu</author><pubDate>Wed, 08 Aug 2007 08:23:00 GMT</pubDate><guid>http://m.shnenglu.com/zzh/archive/2007/08/08/29574.html</guid><wfw:comment>http://m.shnenglu.com/zzh/comments/29574.html</wfw:comment><comments>http://m.shnenglu.com/zzh/archive/2007/08/08/29574.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.shnenglu.com/zzh/comments/commentRss/29574.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zzh/services/trackbacks/29574.html</trackback:ping><description><![CDATA[     鎽樿:     1  2//*******************************************************************************************************   3// loadEXE.cpp : Defines&nb...  <a href='http://m.shnenglu.com/zzh/archive/2007/08/08/29574.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/zzh/aggbug/29574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zzh/" target="_blank">Xiao.Zhu</a> 2007-08-08 16:23 <a href="http://m.shnenglu.com/zzh/archive/2007/08/08/29574.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>涓浗鑱屽憳鐨勪節縐嶅姡鏍規?/title><link>http://m.shnenglu.com/zzh/archive/2007/07/12/27900.html</link><dc:creator>Xiao.Zhu</dc:creator><author>Xiao.Zhu</author><pubDate>Thu, 12 Jul 2007 04:46:00 GMT</pubDate><guid>http://m.shnenglu.com/zzh/archive/2007/07/12/27900.html</guid><wfw:comment>http://m.shnenglu.com/zzh/comments/27900.html</wfw:comment><comments>http://m.shnenglu.com/zzh/archive/2007/07/12/27900.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://m.shnenglu.com/zzh/comments/commentRss/27900.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/zzh/services/trackbacks/27900.html</trackback:ping><description><![CDATA[     鎽樿: 涓浗浜轟笉鏄枃浜虹浉杞伙紝鑰屾槸浜轟漢鐩歌交錛屽彧瑕佹兂杞昏鍒漢錛屾繪湁鐩歌交鐨勭悊鐢便傛瘮濡傚寳浜漢杞昏澶栧湴浜猴紝涓婃搗浜鴻交瑙嗗鍦頒漢錛屽煄閲屼漢杞昏鍐滄潙浜猴紝鍗楁柟浜鴻交瑙嗗寳鏂逛漢錛屾湁閽變漢杞昏絀蜂漢錛屽紑杞︾殑杞昏璧拌礬鐨勶紝璧拌礬鐨勮交瑙嗘壂璺殑錛屽悆楗殑杞昏鍋氶キ鐨勨︹﹀氨鏄笉浼氱浉浜掑皧閲嶃?nbsp; <a href='http://m.shnenglu.com/zzh/archive/2007/07/12/27900.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/zzh/aggbug/27900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/zzh/" target="_blank">Xiao.Zhu</a> 2007-07-12 12:46 <a href="http://m.shnenglu.com/zzh/archive/2007/07/12/27900.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>娣卞湷http://m.shnenglu.com/zzh/archive/2007/06/20/26730.htmlXiao.ZhuXiao.ZhuWed, 20 Jun 2007 15:12:00 GMThttp://m.shnenglu.com/zzh/archive/2007/06/20/26730.htmlhttp://m.shnenglu.com/zzh/comments/26730.htmlhttp://m.shnenglu.com/zzh/archive/2007/06/20/26730.html#Feedback0http://m.shnenglu.com/zzh/comments/commentRss/26730.htmlhttp://m.shnenglu.com/zzh/services/trackbacks/26730.html銆銆涓釜閮借娣卞湷濂斤紝涓釜閮藉線娣卞湷璺戯紱娣卞湷鎸i挶娣卞湷鑺憋紝鍝湁閽炵エ瀵勫洖瀹躲?
銆銆閮借榪欓噷宸ヨ祫楂橈紝瀹蟲垜娌¢挶涔扮墮鑶忥紱閮借榪欓噷浼欓濂斤紝闈掕彍閲岄潰鍔犻潚鑽夈?
銆銆閮借榪欓噷鐜濂斤紝锜戣瀭铓傝殎鍥涘璺戯紱閮借榪欓噷棰嗙彮甯咃紝涓釜騫沖ご鍍忛攨鐩栥?
銆銆騫村勾鎵撳伐騫村勾鎰侊紝澶╁ぉ鍔犵彮鍍忓彧鐚達紱鍔犵彮鍔犵偣鏃犳姤閰紝澶╁ぉ鎸ㄩ獋鏃犵悊鐢便?
銆銆紕拌鑰佹澘浣庣潃澶達紝鍙戜簡宸ヨ祫鎽囨憞澶達紱鍒頒簡鏈堝熬灝卞彂鎰侊紝涓嶇煡浣曞勾鎵嶅嚭澶淬?
銆銆緗楁箹鐨勭編濂籌紝紱忕敯鐨勬眽錛屽竷鍚夎鐨勭棡瀛愭弧琛椾覆錛屽崡灞辯殑鑺憋紝瑗夸附鐨勮崏錛屼粰婀栭噷鐨勫拰灝氭弧琛楄窇銆?br>         鍗庝鯨鍩庣殑甯呭摜錛屾矙澶磋鐨勭嫾錛岀殗宀楀埌澶勬槸嫻佹皳錛岃佹垚閮界殑楗紝褰勾鐨勫簥錛屽矖鍘︾殑濂崇敓鍚撴閮庛?br>         鐩愮敯鐨勭敯錛屽ぇ楣忔咕鐨勬咕錛屽皬姊呮矙鐨勭敺濂沖お鐤銆傚崡澶村叧鐨勭棿錛屾鏋楀叧鐨勬紝緗楁箹鍏崇殑鎯呬荊棣欐腐杞?br>         紱忔案鐨勫鑹詫紝鏉懼矖鐨勪貢錛屽叕鏄庣殑濂沖伐娌$敺浼淬傝タ涔$殑鍦燂紝娌欎簳鐨勮嫤錛屽疂瀹夌殑鐢蜂漢蹇冮噷鍫點?br>         鍏沖唴鐨勫伔,鍏沖鐨勬姠娣卞湷鐨勬不瀹夋病娉曡


Xiao.Zhu 2007-06-20 23:12 鍙戣〃璇勮
]]>
涓插彛http://m.shnenglu.com/zzh/archive/2007/06/16/26461.htmlXiao.ZhuXiao.ZhuSat, 16 Jun 2007 15:25:00 GMThttp://m.shnenglu.com/zzh/archive/2007/06/16/26461.htmlhttp://m.shnenglu.com/zzh/comments/26461.htmlhttp://m.shnenglu.com/zzh/archive/2007/06/16/26461.html#Feedback0http://m.shnenglu.com/zzh/comments/commentRss/26461.htmlhttp://m.shnenglu.com/zzh/services/trackbacks/26461.html 

鏃犺閭g鎿嶄綔鏂瑰紡錛屼竴鑸兘閫氳繃鍥涗釜姝ラ鏉ュ畬鎴愶細
錛?span>1
錛?鎵撳紑涓插彛

Win32緋葷粺鎶婃枃浠剁殑姒傚康榪涜浜嗘墿灞曘傛棤璁烘槸鏂囦歡銆侀氫俊璁懼銆佸懡鍚嶇閬撱侀偖浠舵Ы銆佺鐩樸佽繕鏄帶鍒跺彴錛岄兘鏄敤API鍑芥暟CreateFile鏉ユ墦寮鎴栧垱寤虹殑銆傝鍑芥暟鐨勫師鍨嬩負錛?/span>

HANDLE CreateFile( LPCTSTR lpFileName, 
                
DWORD dwDesiredAccess,  
               
DWORD dwShareMode,    
              
LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
              
DWORD dwCreationDistribution,
               DWORD dwFlagsAndAttributes,
               HANDLE hTemplateFile);

·           lpFileName錛氬皢瑕佹墦寮鐨勪覆鍙i昏緫鍚嶏紝濡?span>“COM1”錛?/span>

·           dwDesiredAccess錛氭寚瀹氫覆鍙h闂殑綾誨瀷錛屽彲浠ユ槸璇誨彇銆佸啓鍏ユ垨浜岃呭茍鍒楋紱

·           dwShareMode錛氭寚瀹氬叡浜睘鎬э紝鐢變簬涓插彛涓嶈兘鍏變韓錛岃鍙傛暟蹇呴』緗負0錛?/span>

·           lpSecurityAttributes錛氬紩鐢ㄥ畨鍏ㄦу睘鎬х粨鏋勶紝緙虹渷鍊間負NULL錛?/span>

·           dwCreationDistribution錛氬垱寤烘爣蹇楋紝瀵逛覆鍙f搷浣滆鍙傛暟蹇呴』緗負OPEN_EXISTING錛?/span>

·           dwFlagsAndAttributes錛氬睘鎬ф弿榪幫紝鐢ㄤ簬鎸囧畾璇ヤ覆鍙f槸鍚﹁繘琛屽紓姝ユ搷浣滐紝璇ュ間負FILE_FLAG_OVERLAPPED錛岃〃紺轟嬌鐢ㄥ紓姝ョ殑I/O錛涜鍊間負0錛岃〃紺哄悓姝?span>I/O鎿嶄綔錛?/span>

·           hTemplateFile錛氬涓插彛鑰岃█璇ュ弬鏁板繀欏葷疆涓?span>NULL錛?/span>

鍚屾I/O鏂瑰紡鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?br>hCom=CreateFile("COM1",//COM1鍙?span>         
  
GENERIC_READ|GENERIC_WRITE, //
鍏佽璇誨拰鍐?span>         
    
0, //鐙崰鏂瑰紡         
 
      NULL,   
    
OPEN_EXISTING, //
鎵撳紑鑰屼笉鏄垱寤?span>             
  
   0, //鍚屾鏂瑰紡       
  
NULL);    
if(hCom==(HANDLE)-1)  
{              
         AfxMessageBox("
鎵撳紑COM澶辮觸!");    
   
     return FALSE; 
}  
    
return TRUE;

閲嶅彔I/O鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?span> 
hCom =CreateFile("COM1", //COM1
鍙?span>          
  
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?span>     
       
0, //鐙崰鏂瑰紡            
       
NULL,           
  
   OPEN_EXISTING, //
鎵撳紑鑰屼笉鏄垱寤?span>       
  
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡 
     
NULL);
 
if(hCom ==INVALID_HANDLE_VALUE)     
{           
          
AfxMessageBox("
鎵撳紑COM澶辮觸!"); 
          
return FALSE; 
}        
 
return TRUE;

錛?span>2錛夈?a name=閰嶇疆涓插彛>閰嶇疆涓插彛

鍦ㄦ墦寮閫氳璁懼鍙ユ焺鍚庯紝甯稿父闇瑕佸涓插彛榪涜涓浜涘垵濮嬪寲閰嶇疆宸ヤ綔銆傝繖闇瑕侀氳繃涓涓?span>DCB緇撴瀯鏉ヨ繘琛屻?span>DCB緇撴瀯鍖呭惈浜嗚濡傛嘗鐗圭巼銆佹暟鎹綅鏁般佸鍋舵牎楠屽拰鍋滄浣嶆暟絳変俊鎭傚湪鏌ヨ鎴栭厤緗覆鍙g殑灞炴ф椂錛岄兘瑕佺敤DCB緇撴瀯鏉ヤ綔涓虹紦鍐插尯銆?span>
銆銆涓鑸敤CreateFile鎵撳紑涓插彛鍚庯紝鍙互璋冪敤GetCommState鍑芥暟鏉ヨ幏鍙栦覆鍙g殑鍒濆閰嶇疆銆傝淇敼涓插彛鐨勯厤緗紝搴旇鍏堜慨鏀?span>DCB緇撴瀯錛岀劧鍚庡啀璋冪敤SetCommState鍑芥暟璁劇疆涓插彛銆?span>
銆銆DCB緇撴瀯鍖呭惈浜嗕覆鍙g殑鍚勯」鍙傛暟璁劇疆錛屼笅闈粎浠嬬粛鍑犱釜璇ョ粨鏋勫父鐢ㄧ殑鍙橀噺錛?/span>

typedef struct _DCB{ 
 
………   //
娉㈢壒鐜囷紝鎸囧畾閫氫俊璁懼鐨勪紶杈撻熺巼銆傝繖涓垚鍛樺彲浠ユ槸瀹為檯娉㈢壒鐜囧兼垨鑰呬笅闈㈢殑甯擱噺鍊間箣涓錛?br>   DWORD BaudRate;
CBR_110
錛?br>CBR_300錛?br>CBR_600錛?br>CBR_1200錛?br>CBR_2400錛?span>
CBR_4800
錛?br>CBR_9600錛?br>CBR_19200錛?br>CBR_38400錛?br>CBR_56000錛?br>CBR_57600錛?span>
CBR_115200錛?span>
CBR_128000錛?span>
CBR_256000錛?span>
CBR_14400DWORD fParity; // 鎸囧畾濂囧伓鏍¢獙浣胯兘銆傝嫢姝ゆ垚鍛樹負1錛屽厑璁稿鍋舵牎楠屾鏌?span>   
…BYTE ByteSize; // 閫氫俊瀛楄妭浣嶆暟錛?span>4鈥?BYTE
Parity; //鎸囧畾濂囧伓鏍¢獙鏂規硶銆傛鎴愬憳鍙互鏈変笅鍒楀鹼細EVENPARITY 鍋舵牎楠?span>     NOPARITY 鏃犳牎楠?span>MARKPARITY 鏍囪鏍¢獙   ODDPARITY 濂囨牎楠?span>BYTE
StopBits; //鎸囧畾鍋滄浣嶇殑浣嶆暟銆?br>姝ゆ垚鍛樺彲浠ユ湁涓嬪垪鍊鹼細
ONESTOPBIT 1浣嶅仠姝綅  
TWOSTOPBITS 2
浣嶅仠姝綅
ONE5STOPBITS   1.5
浣嶅仠姝綅   ……… } DCB;
winbase.h
鏂囦歡涓畾涔変簡浠ヤ笂鐢ㄥ埌鐨勫父閲忋?br>濡備笅錛?br>#define NOPARITY            0
#define ODDPARITY           1
#define EVENPARITY          2
#define ONESTOPBIT          0
#define ONE5STOPBITS        1
#define TWOSTOPBITS         2
#define CBR_110             110
#define CBR_300             300
#define CBR_600             600
#define CBR_1200            1200
#define CBR_2400            2400
#define CBR_4800            4800
#define CBR_9600            9600
#define CBR_14400           14400
#define CBR_19200           19200
#define CBR_38400           38400
#define CBR_56000           56000
#define CBR_57600           57600
#define CBR_115200          115200
#define CBR_128000          128000
#define CBR_256000          256000

GetCommState鍑芥暟鍙互鑾峰緱COM鍙g殑璁懼鎺у埗鍧楋紝浠庤岃幏寰楃浉鍏沖弬鏁幫細

BOOL GetCommState(   HANDLE hFile, //鏍囪瘑閫氳绔彛鐨勫彞鏌?span>  
LPDCB lpDCB //
鎸囧悜涓涓澶囨帶鍒跺潡錛?span>DCB緇撴瀯錛夌殑鎸囬拡 );
SetCommState
鍑芥暟璁劇疆COM鍙g殑璁懼鎺у埗鍧楋細
BOOL SetCommState(   HANDLE hFile,    LPDCB lpDCB   );

闄や簡鍦?span>BCD涓殑璁劇疆澶栵紝紼嬪簭涓鑸繕闇瑕佽緗?span>I/O緙撳啿鍖虹殑澶у皬鍜岃秴鏃躲?span>Windows鐢?span>I/O緙撳啿鍖烘潵鏆傚瓨涓插彛杈撳叆鍜岃緭鍑虹殑鏁版嵁銆傚鏋滈氫俊鐨勯熺巼杈冮珮錛屽垯搴旇璁劇疆杈冨ぇ鐨勭紦鍐插尯銆傝皟鐢?span>SetupComm鍑芥暟鍙互璁劇疆涓茶鍙g殑杈撳叆鍜岃緭鍑虹紦鍐插尯鐨勫ぇ灝忋?/span>

BOOL SetupComm(    HANDLE hFile,    // 閫氫俊璁懼鐨勫彞鏌?span>    
DWORD dwInQueue, //
杈撳叆緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?span>    
DWORD dwOutQueue   // 杈撳嚭緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?span>   );

鍦ㄧ敤ReadFile鍜?span>WriteFile璇誨啓涓茶鍙f椂錛岄渶瑕佽冭檻瓚呮椂闂銆傝秴鏃剁殑浣滅敤鏄湪鎸囧畾鐨勬椂闂村唴娌℃湁璇誨叆鎴栧彂閫佹寚瀹氭暟閲忕殑瀛楃錛?span>ReadFile鎴?span>WriteFile鐨勬搷浣滀粛鐒朵細緇撴潫銆?span>
銆銆瑕佹煡璇㈠綋鍓嶇殑瓚呮椂璁劇疆搴旇皟鐢?span>GetCommTimeouts鍑芥暟錛岃鍑芥暟浼氬~鍏呬竴涓?span>COMMTIMEOUTS緇撴瀯銆傝皟鐢?span>SetCommTimeouts鍙互鐢ㄦ煇涓涓?span>COMMTIMEOUTS緇撴瀯鐨勫唴瀹規潵璁劇疆瓚呮椂銆?span>
銆銆璇誨啓涓插彛鐨勮秴鏃舵湁涓ょ錛氶棿闅旇秴鏃跺拰鎬昏秴鏃躲傞棿闅旇秴鏃舵槸鎸囧湪鎺ユ敹鏃朵袱涓瓧絎︿箣闂寸殑鏈澶ф椂寤躲傛昏秴鏃舵槸鎸囪鍐欐搷浣滄誨叡鑺辮垂鐨勬渶澶ф椂闂淬傚啓鎿嶄綔鍙敮鎸佹昏秴鏃訛紝鑰岃鎿嶄綔涓ょ瓚呮椂鍧囨敮鎸併傜敤COMMTIMEOUTS緇撴瀯鍙互瑙勫畾璇誨啓鎿嶄綔鐨勮秴鏃躲?span>
COMMTIMEOUTS緇撴瀯鐨勫畾涔変負錛?/span>

typedef struct _COMMTIMEOUTS {      
DWORD ReadIntervalTimeout; //
璇婚棿闅旇秴鏃?span>   
DWORD ReadTotalTimeoutMultiplier; //
璇繪椂闂寸郴鏁?span>   
DWORD ReadTotalTimeoutConstant; //璇繪椂闂村父閲?span>   
DWORD WriteTotalTimeoutMultiplier; // 鍐欐椂闂寸郴鏁?span>   
DWORD WriteTotalTimeoutConstant; //鍐欐椂闂村父閲?span>
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS緇撴瀯鐨勬垚鍛橀兘浠ユ縐掍負鍗曚綅銆傛昏秴鏃剁殑璁$畻鍏紡鏄細
鎬昏秴鏃訛紳鏃墮棿緋繪暟×瑕佹眰璇?span>/
鍐欑殑瀛楃鏁幫紜鏃墮棿甯擱噺
渚嬪錛岃璇誨叆10涓瓧絎︼紝閭d箞璇繪搷浣滅殑鎬昏秴鏃剁殑璁$畻鍏紡涓猴細
璇繪昏秴鏃訛紳ReadTotalTimeoutMultiplier×10錛?span>ReadTotalTimeoutConstant
鍙互鐪嬪嚭錛氶棿闅旇秴鏃跺拰鎬昏秴鏃剁殑璁劇疆鏄笉鐩稿叧鐨勶紝榪欏彲浠ユ柟渚塊氫俊紼嬪簭鐏墊椿鍦拌緗悇縐嶈秴鏃躲?span>

濡傛灉鎵鏈夊啓瓚呮椂鍙傛暟鍧囦負0錛岄偅涔堝氨涓嶄嬌鐢ㄥ啓瓚呮椂銆傚鏋?span>ReadIntervalTimeout涓?span>0錛岄偅涔堝氨涓嶄嬌鐢ㄨ闂撮殧瓚呮椂銆傚鏋?span>ReadTotalTimeoutMultiplier 鍜?span> ReadTotalTimeoutConstant 閮戒負0錛屽垯涓嶄嬌鐢ㄨ鎬昏秴鏃躲傚鏋滆闂撮殧瓚呮椂琚緗垚MAXDWORD騫朵笖璇繪椂闂寸郴鏁板拰璇繪椂闂村父閲忛兘涓?span>0錛岄偅涔堝湪璇諱竴嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛岃屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span>
銆銆鍦ㄧ敤閲嶅彔鏂瑰紡璇誨啓涓插彛鏃訛紝铏界劧ReadFile鍜?span>WriteFile鍦ㄥ畬鎴愭搷浣滀互鍓嶅氨鍙兘榪斿洖錛屼絾瓚呮椂浠嶇劧鏄搗浣滅敤鐨勩傚湪榪欑鎯呭喌涓嬶紝瓚呮椂瑙勫畾鐨勬槸鎿嶄綔鐨勫畬鎴愭椂闂達紝鑰屼笉鏄?span>ReadFile鍜?span>WriteFile鐨勮繑鍥炴椂闂淬?span>
閰嶇疆涓插彛鐨勭ず渚嬩唬鐮侊細

SetupComm(hCom,1024,1024); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024
COMMTIMEOUTS TimeOuts;     //
璁懼畾璇昏秴鏃?span>  
TimeOuts.ReadIntervalTimeout=1000;    
TimeOuts.ReadTotalTimeoutMultiplier=500;     
TimeOuts.ReadTotalTimeoutConstant=5000;     //
璁懼畾鍐欒秴鏃?span>   T
imeOuts.WriteTotalTimeoutMultiplier=500;    
TimeOuts.WriteTotalTimeoutConstant=2000;     
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;      
GetCommState(hCom,&dcb);      
dcb.BaudRate=9600; //
娉㈢壒鐜囦負9600    
dcb.ByteSize=8; //
姣忎釜瀛楄妭鏈?span>8浣?span>     
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅    
dcb.StopBits=TWOSTOPBITS; //
涓や釜鍋滄浣?span>       
SetCommState(hCom,&dcb);    
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

鍦ㄨ鍐欎覆鍙d箣鍓嶏紝榪樿鐢?span>PurgeComm()鍑芥暟娓呯┖緙撳啿鍖猴紝璇ュ嚱鏁板師鍨嬶細

BOOL PurgeComm(    HANDLE hFile,    //涓插彛鍙ユ焺    
                                    DWORD dwFlags    //
闇瑕佸畬鎴愮殑鎿嶄綔  
);

鍙傛暟dwFlags鎸囧畾瑕佸畬鎴愮殑鎿嶄綔錛屽彲浠ユ槸涓嬪垪鍊肩殑緇勫悎錛?/span>

PURGE_TXABORT        涓柇鎵鏈夊啓鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌鍐欐搷浣滆繕娌℃湁瀹屾垚銆?span>PURGE_RXABORT       涓柇鎵鏈夎鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌璇繪搷浣滆繕娌℃湁瀹屾垚銆?span>PURGE_TXCLEAR      娓呴櫎杈撳嚭緙撳啿鍖?span>PURGE_RXCLEAR        娓呴櫎杈撳叆緙撳啿鍖?/span>

錛?span>3錛夈?a name=璇誨啓涓插彛>璇誨啓涓插彛

鎴戜滑浣跨敤ReadFile鍜?span>WriteFile璇誨啓涓插彛錛屼笅闈㈡槸涓や釜鍑芥暟鐨勫0鏄庯細

BOOL ReadFile(    HANDLE hFile,     //涓插彛鐨勫彞鏌?span>        // 璇誨叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?span>    // 鍗寵鍏ョ殑鏁版嵁灝嗗瓨鍌ㄥ湪浠ヨ鎸囬拡鐨勫間負棣栧湴鍧鐨勪竴鐗囧唴瀛樺尯   
LPVOID lpBuffer,         
DWORD nNumberOfBytesToRead,       //
瑕佽鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟        // 鎸囧悜涓涓?span>DWORD鏁板鹼紝璇ユ暟鍊艱繑鍥炶鎿嶄綔瀹為檯璇誨叆鐨勫瓧鑺傛暟   
LPDWORD lpNumberOfBytesRead,             //
閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓?span>OVERLAPPED緇撴瀯錛屽悓姝ユ搷浣滄椂錛岃鍙傛暟涓?span>NULL銆?span>   
LPOVERLAPPED lpOverlapped        );    
BOOL WriteFile(    HANDLE hFile,      //涓插彛鐨勫彞鏌?span>            // 鍗充互璇ユ寚閽堢殑鍊間負棣栧湴鍧鐨?span>nNumberOfBytesToWrite    // 涓瓧鑺傜殑鏁版嵁灝嗚鍐欏叆涓插彛鐨勫彂閫佹暟鎹紦鍐插尯銆?span>   
LPCVOID lpBuffer,       // 鍐欏叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?/span>       
DWORD nNumberOfBytesToWrite, //
瑕佸啓鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟        // 鎸囧悜鎸囧悜涓涓?span>DWORD鏁板鹼紝璇ユ暟鍊艱繑鍥炲疄闄呭啓鍏ョ殑瀛楄妭鏁?span>   
LPDWORD lpNumberOfBytesWritten,             // 閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓?span>OVERLAPPED緇撴瀯錛?span>    // 鍚屾鎿嶄綔鏃訛紝璇ュ弬鏁頒負NULL銆?span>  
 
LPOVERLAPPED lpOverlapped        );

鍦ㄧ敤ReadFile鍜?span>WriteFile璇誨啓涓插彛鏃訛紝鏃㈠彲浠ュ悓姝ユ墽琛岋紝涔熷彲浠ラ噸鍙犳墽琛屻傚湪鍚屾鎵ц鏃訛紝鍑芥暟鐩村埌鎿嶄綔瀹屾垚鍚庢墠榪斿洖銆傝繖鎰忓懗鐫鍚屾鎵ц鏃剁嚎紼嬩細琚樆濉烇紝浠庤屽鑷存晥鐜囦笅闄嶃傚湪閲嶅彔鎵ц鏃訛紝鍗充嬌鎿嶄綔榪樻湭瀹屾垚錛岃繖涓や釜鍑芥暟涔熶細绔嬪嵆榪斿洖錛岃垂鏃剁殑I/O鎿嶄綔鍦ㄥ悗鍙拌繘琛屻?span>
銆銆ReadFile鍜?span>WriteFile鍑芥暟鏄悓姝ヨ繕鏄紓姝ョ敱CreateFile鍑芥暟鍐沖畾錛屽鏋滃湪璋冪敤CreateFile鍒涘緩鍙ユ焺鏃舵寚瀹氫簡FILE_FLAG_OVERLAPPED鏍囧織錛岄偅涔堣皟鐢?span>ReadFile鍜?span>WriteFile瀵硅鍙ユ焺榪涜鐨勬搷浣滃氨搴旇鏄噸鍙犵殑錛涘鏋滄湭鎸囧畾閲嶅彔鏍囧織錛屽垯璇誨啓鎿嶄綔搴旇鏄悓姝ョ殑銆?span>ReadFile鍜?span>WriteFile鍑芥暟鐨勫悓姝ユ垨鑰呭紓姝ュ簲璇ュ拰CreateFile鍑芥暟鐩鎬竴鑷淬?span>
銆銆ReadFile鍑芥暟鍙鍦ㄤ覆鍙h緭鍏ョ紦鍐插尯涓鍏ユ寚瀹氭暟閲忕殑瀛楃錛屽氨綆楀畬鎴愭搷浣溿傝?span>WriteFile鍑芥暟涓嶄絾瑕佹妸鎸囧畾鏁伴噺鐨勫瓧絎︽嫹鍏ュ埌杈撳嚭緙撳啿鍖猴紝鑰屼笖瑕佺瓑榪欎簺瀛楃浠庝覆琛屽彛閫佸嚭鍘誨悗鎵嶇畻瀹屾垚鎿嶄綔銆?span>
銆銆濡傛灉鎿嶄綔鎴愬姛錛岃繖涓や釜鍑芥暟閮借繑鍥?span>TRUE銆傞渶瑕佹敞鎰忕殑鏄紝褰?span>ReadFile鍜?span>WriteFile榪斿洖FALSE鏃訛紝涓嶄竴瀹氬氨鏄搷浣滃け璐ワ紝綰跨▼搴旇璋冪敤GetLastError鍑芥暟鍒嗘瀽榪斿洖鐨勭粨鏋溿備緥濡傦紝鍦ㄩ噸鍙犳搷浣滄椂濡傛灉鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥烇紝閭d箞鍑芥暟灝辮繑鍥?span>FALSE錛岃屼笖GetLastError鍑芥暟榪斿洖ERROR_IO_PENDING銆傝繖璇存槑閲嶅彔鎿嶄綔榪樻湭瀹屾垚銆?span>

鍚屾鏂瑰紡璇誨啓涓插彛姣旇緝綆鍗曪紝涓嬮潰鍏堜緥涓懼悓姝ユ柟寮忚鍐欎覆鍙g殑浠g爜錛?/span>

//鍚屾璇諱覆鍙?span>char str[100];
DWORD wCount;//
璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,100,&wCount,NULL);
if(!bReadStat){  
AfxMessageBox("
璇諱覆鍙eけ璐?span>!");
return FALSE;
}
return TRUE;
//鍚屾鍐欎覆鍙?span>       
char lpOutBuffer[100];
DWORD dwBytesWrite=100;  
COMSTAT ComStat;      
DWORD dwErrorFlags;   
BOOL bWriteStat;    
ClearCommError(hCom,&dwErrorFlags,&ComStat);    
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);    
if(!bWriteStat) { 
            
AfxMessageBox("鍐欎覆鍙eけ璐?span>!");
 }      
PurgeComm(hCom, PURGE_TXABORT|              PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

鍦ㄩ噸鍙犳搷浣滄椂,鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥炪?span>

銆銆閲嶅彔I/O闈炲父鐏墊椿錛屽畠涔熷彲浠ュ疄鐜伴樆濉烇紙渚嬪鎴戜滑鍙互璁劇疆涓瀹氳璇誨彇鍒頒竴涓暟鎹墠鑳借繘琛屽埌涓嬩竴姝ユ搷浣滐級銆傛湁涓ょ鏂規硶鍙互絳夊緟鎿嶄綔瀹屾垚錛氫竴縐嶆柟娉曟槸鐢ㄨ薄WaitForSingleObject榪欐牱鐨勭瓑寰呭嚱鏁版潵絳夊緟OVERLAPPED緇撴瀯鐨?span>hEvent鎴愬憳錛涘彟涓縐嶆柟娉曟槸璋冪敤GetOverlappedResult鍑芥暟絳夊緟錛屽悗闈㈠皢婕旂ず璇存槑銆?span>
涓嬮潰鎴戜滑鍏堢畝鍗曡涓涓?span>OVERLAPPED緇撴瀯鍜?span>GetOverlappedResult鍑芥暟錛?span>
OVERLAPPED緇撴瀯
OVERLAPPED
緇撴瀯鍖呭惈浜嗛噸鍙?span>I/O鐨勪竴浜涗俊鎭紝瀹氫箟濡備笅錛?/span>

typedef struct _OVERLAPPED { // o      DWORD Internal;     DWORD InternalHigh;     DWORD Offset;     DWORD OffsetHigh;     HANDLE hEvent; } OVERLAPPED;

鍦ㄤ嬌鐢?span>ReadFile鍜?span>WriteFile閲嶅彔鎿嶄綔鏃訛紝綰跨▼闇瑕佸垱寤?span>OVERLAPPED緇撴瀯浠ヤ緵榪欎袱涓嚱鏁頒嬌鐢ㄣ傜嚎紼嬮氳繃OVERLAPPED緇撴瀯鑾峰緱褰撳墠鐨勬搷浣滅姸鎬侊紝璇ョ粨鏋勬渶閲嶈鐨勬垚鍛樻槸hEvent銆?span>hEvent鏄鍐欎簨浠躲傚綋涓插彛浣跨敤寮傛閫氳鏃訛紝鍑芥暟榪斿洖鏃舵搷浣滃彲鑳借繕娌℃湁瀹屾垚錛岀▼搴忓彲浠ラ氳繃媯鏌ヨ浜嬩歡寰楃煡鏄惁璇誨啓瀹屾瘯銆?span>
銆銆褰撹皟鐢?span>ReadFile, WriteFile 鍑芥暟鐨勬椂鍊欙紝璇ユ垚鍛樹細鑷姩琚疆涓烘棤淇″彿鐘舵侊紱褰撻噸鍙犳搷浣滃畬鎴愬悗錛岃鎴愬憳鍙橀噺浼氳嚜鍔ㄨ緗負鏈変俊鍙風姸鎬併?/span>

GetOverlappedResult鍑芥暟BOOL GetOverlappedResult(    HANDLE hFile,        // 涓插彛鐨勫彞鏌?span>          // 鎸囧悜閲嶅彔鎿嶄綔寮濮嬫椂鎸囧畾鐨?span>OVERLAPPED緇撴瀯    LPOVERLAPPED lpOverlapped,         // 鎸囧悜涓涓?span>32浣嶅彉閲忥紝璇ュ彉閲忕殑鍊艱繑鍥炲疄闄呰鍐欐搷浣滀紶杈撶殑瀛楄妭鏁般?span>    LPDWORD lpNumberOfBytesTransferred,             // 璇ュ弬鏁扮敤浜庢寚瀹氬嚱鏁版槸鍚︿竴鐩寸瓑鍒伴噸鍙犳搷浣滅粨鏉熴?span>    // 濡傛灉璇ュ弬鏁頒負TRUE錛屽嚱鏁扮洿鍒版搷浣滅粨鏉熸墠榪斿洖銆?span>    // 濡傛灉璇ュ弬鏁頒負FALSE錛屽嚱鏁扮洿鎺ヨ繑鍥烇紝榪欐椂濡傛灉鎿嶄綔娌℃湁瀹屾垚錛?span>    // 閫氳繃璋冪敤GetLastError()鍑芥暟浼氳繑鍥?span>ERROR_IO_INCOMPLETE銆?span>    BOOL bWait    );

璇ュ嚱鏁拌繑鍥為噸鍙犳搷浣滅殑緇撴灉錛岀敤鏉ュ垽鏂紓姝ユ搷浣滄槸鍚﹀畬鎴愶紝瀹冩槸閫氳繃鍒ゆ柇OVERLAPPED緇撴瀯涓殑hEvent鏄惁琚疆浣嶆潵瀹炵幇鐨勩?span>

寮傛璇諱覆鍙g殑紺轟緥浠g爜錛?/span>

char lpInBuffer[1024];
DWORD dwBytesRead=1024;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
if(!dwBytesRead)
return FALSE;
BOOL bReadStatus;
bReadStatus=ReadFile(hCom,
lpInBuffer,                               
dwBytesRead,
&dwBytesRead,
&m_osRead);
if(!bReadStatus) //
濡傛灉ReadFile鍑芥暟榪斿洖FALSE
{    
if(GetLastError()==ERROR_IO_PENDING) //GetLastError()
鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?span>  
{             
WaitForSingleObject(m_osRead.hEvent,2000);         //
浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓        //褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨?span>hEvent浜嬩歡浼氬彉涓烘湁淇″彿              
PurgeComm(hCom, PURGE_TXABORT|                      PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  
 
     return dwBytesRead;   
}      
return 0;
}
PurgeComm(hCom, PURGE_TXABORT|               PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return dwBytesRead;

瀵逛互涓婁唬鐮佸啀浣滅畝瑕佽鏄庯細鍦ㄤ嬌鐢?span>ReadFile 鍑芥暟榪涜璇繪搷浣滃墠錛屽簲鍏堜嬌鐢?span>ClearCommError鍑芥暟娓呴櫎閿欒銆?span>ClearCommError鍑芥暟鐨勫師鍨嬪涓嬶細

BOOL ClearCommError(    HANDLE hFile,      // 涓插彛鍙ユ焺   
LPDWORD lpErrors,      //
鎸囧悜鎺ユ敹閿欒鐮佺殑鍙橀噺   
LPCOMSTAT lpStat //
鎸囧悜閫氳鐘舵佺紦鍐插尯  
);

璇ュ嚱鏁拌幏寰楅氫俊閿欒騫舵姤鍛婁覆鍙g殑褰撳墠鐘舵侊紝鍚屾椂錛岃鍑芥暟娓呴櫎涓插彛鐨勯敊璇爣蹇椾互渚跨戶緇緭鍏ャ佽緭鍑烘搷浣溿?span>
鍙傛暟lpStat鎸囧悜涓涓?span>COMSTAT緇撴瀯錛岃緇撴瀯榪斿洖涓插彛鐘舵佷俊鎭?span> COMSTAT緇撴瀯 COMSTAT緇撴瀯鍖呭惈涓插彛鐨勪俊鎭紝緇撴瀯瀹氫箟濡備笅錛?/span>

typedef struct _COMSTAT { // cst     
DWORD fCtsHold : 1; // Tx waiting for CTS signal    
DWORD fDsrHold : 1;   // Tx waiting for DSR signal    
DWORD fRlsdHold : 1; // Tx waiting for RLSD signal    
DWORD fXoffHold : 1; // Tx waiting, XOFF char rec''d    
DWORD fXoffSent : 1; // Tx waiting, XOFF char sent    
DWORD fEof : 1;       // EOF character sent    
DWORD fTxim : 1;      // character waiting for Tx    
DWORD fReserved : 25; // reserved    
DWORD cbInQue;        // bytes in input buffer    
DWORD cbOutQue;       // bytes in output buffer
} COMSTAT, *LPCOMSTAT;

鏈枃鍙敤鍒頒簡cbInQue鎴愬憳鍙橀噺錛岃鎴愬憳鍙橀噺鐨勫間唬琛ㄨ緭鍏ョ紦鍐插尯鐨勫瓧鑺傛暟銆?span>

銆銆鏈鍚庣敤PurgeComm鍑芥暟娓呯┖涓插彛鐨勮緭鍏ヨ緭鍑虹紦鍐插尯銆?/span>

榪欐浠g爜鐢?span>WaitForSingleObject鍑芥暟鏉ョ瓑寰?span>OVERLAPPED緇撴瀯鐨?span>hEvent鎴愬憳錛屼笅闈㈡垜浠啀婕旂ず涓孌佃皟鐢?span>GetOverlappedResult鍑芥暟絳夊緟鐨勫紓姝ヨ涓插彛紺轟緥浠g爜錛?/span>

char lpInBuffer[1024];
DWORD dwBytesRead=1024;     
BOOL bReadStatus;     
DWORD dwErrorFlags;      
COMSTAT ComStat;
OVERLAPPED m_osRead;    
ClearCommError(hCom,&dwErrorFlags,&ComStat); 
if(!ComStat.cbInQue)           return 0;
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue); 
bReadStatus=ReadFile(hCom,
lpInBuffer,
dwBytesRead,            
&dwBytesRead,
&m_osRead);      
if(!bReadStatus) //
濡傛灉ReadFile鍑芥暟榪斿洖FALSE     
{             
if(GetLastError()==ERROR_IO_PENDING)         
{             
GetOverlappedResult(hCom,                         
&m_osRead,&dwBytesRead,TRUE);           // GetOverlappedResult
鍑芥暟鐨勬渶鍚庝竴涓弬鏁拌涓?span>TRUE
錛?span>           //鍑芥暟浼氫竴鐩寸瓑寰咃紝鐩村埌璇繪搷浣滃畬鎴愭垨鐢變簬閿欒鑰岃繑鍥炪?span>                   return dwBytesRead;           
}             
return 0;     
}      
return dwBytesRead;

寮傛鍐欎覆鍙g殑紺轟緥浠g爜錛?/span>

char buffer[1024];
DWORD dwBytesWritten=1024;      
DWORD dwErrorFlags;   
COMSTAT ComStat;
OVERLAPPED m_osWrite;      
BOOL bWriteStat;    
bWriteStat=WriteFile(hCom,buffer,dwBytesWritten,           &dwBytesWritten,&m_OsWrite);  
if(!bWriteStat) {           
if(GetLastError()==ERROR_IO_PENDING)         
{                  
WaitForSingleObject(m_osWrite.hEvent,1000);                 
return dwBytesWritten; 
}            
return 0;     
}      
return dwBytesWritten;

錛?span>4錛夈?a name=鍏抽棴涓插彛>鍏抽棴涓插彛

鍒╃敤API鍑芥暟鍏抽棴涓插彛闈炲父綆鍗曪紝鍙渶浣跨敤CreateFile鍑芥暟榪斿洖鐨勫彞鏌勪綔涓哄弬鏁拌皟鐢?span>CloseHandle鍗沖彲錛?/span>

BOOL CloseHandle(    HANDLE hObject; //handle to object to close );

涓插彛緙栫▼鐨勪竴涓疄渚?/span>

涓轟簡璁╂偍鏇村ソ鍦扮悊瑙d覆鍙g紪紼?span>,涓嬮潰鎴戜滑鍒嗗埆緙栧啓涓や釜渚嬬▼錛堣闄勫甫鐨勬簮鐮侀儴鍒嗭級,榪欎袱涓緥紼嬮兘瀹炵幇浜嗗伐鎺ф満涓庣櫨鐗規樉紺轟華琛ㄩ氳繃RS485鎺ュ彛榪涜鐨勪覆鍙i氫俊銆傚叾涓涓涓緥紼嬮噰鐢ㄥ悓姝ヤ覆鍙f搷浣?span>,絎簩涓緥紼嬮噰鐢ㄥ紓姝ヤ覆鍙f搷浣溿?span>
銆銆鎴戜滑鍙粙緇嶈蔣浠墮儴鍒嗭紝RS485鎺ュ彛鎺ョ嚎鏂規硶涓嶄綔浠嬬粛錛屾劅鍏磋叮鐨勮鑰呭彲浠ユ煡闃呯浉鍏寵祫鏂欍?/span>

渚嬬▼1

鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼?span>RS485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓?span>IDC_SEND鍜?span>IDC_RECEIVE錛屾爣棰樺垎鍒負鍙戦?span>”鍜?span>“鎺ユ敹錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣?span>

鍦?span>RS485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?/span>

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?/span>

鍦?span>RS485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?/span>

// TODO: Add extra initialization here    
hCom=CreateFile("COM1",//COM1
鍙?span>           
GENERIC_READ|GENERIC_WRITE, //
鍏佽璇誨拰鍐?span>             
0, //鐙崰鏂瑰紡         
NULL,       
OPEN_EXISTING, //
鎵撳紑鑰屼笉鏄垱寤?span>              
0, //鍚屾鏂瑰紡         
NULL);    
if(hCom==(HANDLE)-1)  
{             
AfxMessageBox("
鎵撳紑COM澶辮觸!");           
return FALSE; 
}      
SetupComm(hCom,100,100); //
杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024    
COMMTIMEOUTS TimeOuts; //
璁懼畾璇昏秴鏃?span>  
TimeOuts.ReadIntervalTimeout=MAXDWORD;    
TimeOuts.ReadTotalTimeoutMultiplier=0;       
TimeOuts.ReadTotalTimeoutConstant=0;     //鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?span>        //鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span>     //璁懼畾鍐欒秴鏃?span>   TimeOuts.WriteTotalTimeoutMultiplier=100;    
TimeOuts.WriteTotalTimeoutConstant=500;      
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;      
GetCommState(hCom,&dcb);      
dcb.BaudRate=9600; //
娉㈢壒鐜囦負9600    
dcb.ByteSize=8; //
姣忎釜瀛楄妭鏈?span>8浣?span>     
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅    
dcb.StopBits=TWOSTOPBITS; //
涓や釜鍋滄浣?span>       
SetCommState(hCom,&dcb);    
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜?span>IDC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?/span>

void CRS485CommDlg::OnSend() {     
// TODO: Add your control notification handler code here    
//
鍦ㄦ闇瑕佺畝鍗曚粙緇嶇櫨鐗瑰叕鍙?span>XMA5000鐨勯氳鍗忚錛?span>      
//璇ヤ華琛?span>RS485閫氳閲囩敤涓繪満騫挎挱鏂瑰紡閫氳銆?span>    
//涓茶鍗婂弻宸ワ紝甯?span>11浣嶏紝1涓搗濮嬩綅(0)錛?span>8涓暟鎹綅錛?span>2涓仠姝綅(1)      
//
濡傦細璇諱華琛ㄦ樉紺虹殑鐬椂鍊鹼紝涓繪満鍙戦侊細DC1 AAA BB ETX  
//
鍏朵腑錛?span>DC1鏄爣鍑?span>ASCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負11H(鍗佽繘鍒剁殑17)    
//
鍦?span>XMA5000鐨勯氳鍗忚涓紝DC1琛ㄧず璇葷灛鏃跺?span>   
//AAA鏄粠鏈哄湴鍧鐮侊紝涔熷氨鏄?span>XMA5000鏄劇ず浠〃鐨勯氳鍦板潃 
//BB
涓洪氶亾鍙鳳紝璇葷灛鏃跺兼椂璇ュ間負01    
//ETX
涔熸槸鏍囧噯ASCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負03H     
//
鍦?span>XMA5000鐨勯氳鍗忚涓紝ETX琛ㄧず涓繪満緇撴潫絎?span> 
char lpOutBuffer[7];    
memset(lpOutBuffer,''\0'',7); //鍓?span>7涓瓧鑺傚厛娓呴浂     l
pOutBuffer[0]=''\x11''; //
鍙戦佺紦鍐插尯鐨勭1涓瓧鑺備負DC1     
lpOutBuffer[1]=''0''; //
絎?span>2涓瓧鑺備負瀛楃0(30H)  
lpOutBuffer[2]=''0''; //
絎?span>3涓瓧鑺備負瀛楃0(30H)    
lpOutBuffer[3]=''1''; //
絎?span>4涓瓧鑺備負瀛楃1(31H)     
lpOutBuffer[4]=''0''; //
絎?span>5涓瓧鑺備負瀛楃0(30H)     
lpOutBuffer[5]=''1''; //
絎?span>6涓瓧鑺備負瀛楃1(31H)    
lpOutBuffer[6]=''\x03''; //
絎?span>7涓瓧鑺備負瀛楃ETX       //浠庤孌典唬鐮佸彲浠ョ湅鍑猴紝浠〃鐨勯氳鍦板潃涓?span>001          
DWORD dwBytesWrite=7; 
COMSTAT ComStat;      
DWORD dwErrorFlags;    
BOOL bWriteStat;      
ClearCommError(hCom,&dwErrorFlags,&ComStat);    
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);    
if(!bWriteStat) {             
AfxMessageBox("鍐欎覆鍙eけ璐?span>!"); 
}
}
void CRS485CommDlg::OnReceive() {       
// TODO: Add your control notification handler code here    
char str[100];
memset(str,''\0'',100);       
DWORD wCount=100;//璇誨彇鐨勫瓧鑺傛暟    
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);    
if(!bReadStat)     
AfxMessageBox("
璇諱覆鍙eけ璐?span>!"); 
PurgeComm(hCom, PURGE_TXABORT|      PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  
m_disp=str;   
UpdateData(FALSE);    
}

鎮ㄥ彲浠ヨ瀵熻繑鍥炵殑瀛楃涓詫紝鍏朵腑鏈夊拰浠〃鏄劇ず鍊肩浉鍚岀殑閮ㄥ垎錛屾偍鍙互榪涜鐩稿簲鐨勫瓧絎︿覆鎿嶄綔鍙栧嚭浠〃鐨勬樉紺哄箋?span>
鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔?span>WM_CLOSE鐨勭浉搴斿嚱鏁幫細

void CRS485CommDlg::OnClose() {    
// TODO: Add your message handler code here and/or call default   
CloseHandle(hCom);       //
紼嬪簭閫鍑烘椂鍏抽棴涓插彛  
CDialog::OnClose();
}

紼嬪簭鐨勭浉搴旈儴鍒嗗凡緇忓湪浠g爜鍐呴儴浣滀簡璇︾粏浠嬬粛銆傝繛鎺ュソ紜歡閮ㄥ垎錛岀紪璇戣繍琛岀▼搴忥紝緇嗗績浣撲細涓插彛鍚屾鎿嶄綔閮ㄥ垎銆?/span>

渚嬬▼2

鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼?span>RS485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓?span>IDC_SEND鍜?span>IDC_RECEIVE錛屾爣棰樺垎鍒負鍙戦?span>”鍜?span>“鎺ユ敹錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣傚湪RS485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?/span>

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛?/span>

涓插彛鍙ユ焺鍦?span>RS485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?/span>

hCom=CreateFile("COM1",//COM1鍙?span>           
GENERIC_READ|GENERIC_WRITE, //
鍏佽璇誨拰鍐?span>          
0, //鐙崰鏂瑰紡         
NULL,         
OPEN_EXISTING, //
鎵撳紑鑰屼笉鏄垱寤?span>           
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡              
NULL);    
if(hCom==(HANDLE)-1)   {             
AfxMessageBox("
鎵撳紑COM澶辮觸!");           
return FALSE; 
}      
SetupComm(hCom,100,100); //
杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸100    
COMMTIMEOUTS TimeOuts; //
璁懼畾璇昏秴鏃?span>  
TimeOuts.ReadIntervalTimeout=MAXDWORD;    
TimeOuts.ReadTotalTimeoutMultiplier=0;       
TimeOuts.ReadTotalTimeoutConstant=0;     //鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?span>        //鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?span>     //璁懼畾鍐欒秴鏃?span>   TimeOuts.WriteTotalTimeoutMultiplier=100;    
TimeOuts.WriteTotalTimeoutConstant=500;      
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;      
GetCommState(hCom,&dcb);      
dcb.BaudRate=9600; //
娉㈢壒鐜囦負9600    
dcb.ByteSize=8; //
姣忎釜瀛楄妭鏈?span>8浣?span>     
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅    
dcb.StopBits=TWOSTOPBITS; //
涓や釜鍋滄浣?span>       
SetCommState(hCom,&dcb);    
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜?span>IDC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?/span>

void CRS485CommDlg::OnSend() {     
// TODO: Add your control notification handler code here    
OVERLAPPED m_osWrite;
 memset(&m_osWrite,0,sizeof(OVERLAPPED)); 
   
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);  
char lpOutBuffer[7];    
memset(lpOutBuffer,''\0'',7); 
lpOutBuffer[0]=''\x11'';      
lpOutBuffer[1]=''0'';    
lpOutBuffer[2]=''0''; 
lpOutBuffer[3]=''1''; 
lpOutBuffer[4]=''0'';    
lpOutBuffer[5]=''1''; 
lpOutBuffer[6]=''\x03'';             
DWORD dwBytesWrite=7;    
COMSTAT ComStat;      
DWORD dwErrorFlags;   
BOOL bWriteStat;    
ClearCommError(hCom,&dwErrorFlags,&ComStat); 
bWriteStat=WriteFile(hCom,lpOutBuffer,      dwBytesWrite,& dwBytesWrite,&m_osWrite);     
if(!bWriteStat) {           
if(GetLastError()==ERROR_IO_PENDING)         
{                  
WaitForSingleObject(m_osWrite.hEvent,1000);
}      
}
}
void CRS485CommDlg::OnReceive()
{       
// TODO: Add your control notification handler code here    
OVERLAPPED m_osRead;  
memset(&m_osRead,0,sizeof(OVERLAPPED));    
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);   
COMSTAT ComStat;      
DWORD dwErrorFlags;              
char str[100]; memset(str,''\0'',100);       
DWORD dwBytesRead=100;//
璇誨彇鐨勫瓧鑺傛暟     
BOOL bReadStat;    
ClearCommError(hCom,&dwErrorFlags,&ComStat); 
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);   
bReadStat=ReadFile(hCom,str,        dwBytesRead,&dwBytesRead,&m_osRead); 
if(!bReadStat) {           
if(GetLastError()==ERROR_IO_PENDING)     //GetLastError()
鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?span>       
{                  
WaitForSingleObject(m_osRead.hEvent,2000);                //
浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓               //褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨?span>hEvent浜嬩歡浼氬彉涓烘湁淇″彿            
}      
}      
PurgeComm(hCom, PURGE_TXABORT|      PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  
m_disp=str;   
UpdateData(FALSE);
}

鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔?span>WM_CLOSE鐨勭浉搴斿嚱鏁幫細

void CRS485CommDlg::OnClose() {    
// TODO: Add your message handler code here and/or call default   
CloseHandle(hCom);       //
紼嬪簭閫鍑烘椂鍏抽棴涓插彛  
CDialog::OnClose();
}

 



Xiao.Zhu 2007-06-16 23:25 鍙戣〃璇勮
]]>
Windows Sockets 2.0:浣跨敤瀹屾垚绔彛楂樻ц兘錛屽彲鎵╁睍鎬insock鏈嶅姟紼嬪簭 (杞?http://m.shnenglu.com/zzh/archive/2007/05/18/24318.htmlXiao.ZhuXiao.ZhuFri, 18 May 2007 01:52:00 GMThttp://m.shnenglu.com/zzh/archive/2007/05/18/24318.htmlhttp://m.shnenglu.com/zzh/comments/24318.htmlhttp://m.shnenglu.com/zzh/archive/2007/05/18/24318.html#Feedback0http://m.shnenglu.com/zzh/comments/commentRss/24318.htmlhttp://m.shnenglu.com/zzh/services/trackbacks/24318.html闃呰鍏ㄦ枃

Xiao.Zhu 2007-05-18 09:52 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品五月| 久久久人人人| 好吊色欧美一区二区三区视频| 欧美日韩精品一本二本三本| 欧美高清在线观看| 欧美国产在线视频| 欧美日韩免费一区二区三区| 欧美四级电影网站| 国产片一区二区| 一区二区三区在线观看欧美| 亚洲国产毛片完整版| 99riav1国产精品视频| 亚洲尤物在线| 午夜在线视频观看日韩17c| 久久国产福利国产秒拍| 欧美freesex交免费视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲日本中文字幕区| 亚洲美女91| 亚洲欧美综合v| 久久综合狠狠| 日韩亚洲欧美精品| 欧美在线视屏| 欧美在现视频| 亚洲国产一区二区a毛片| 夜夜嗨av一区二区三区中文字幕 | 亚洲影院免费观看| 久久青草久久| aa级大片欧美三级| 久久久久网址| 国产精品资源| 亚洲免费观看| 久久免费视频在线| 99精品热6080yy久久| 裸体女人亚洲精品一区| 国产精品一区二区视频| 99精品国产在热久久下载| 久久激情综合| 亚洲桃花岛网站| 欧美激情国产日韩| 在线免费日韩片| 欧美一区二区三区成人| 亚洲精品欧美激情| 免费不卡在线视频| 国内综合精品午夜久久资源| 亚洲在线电影| 日韩西西人体444www| 欧美激情综合色综合啪啪| 在线观看国产成人av片| 久久精品中文字幕一区二区三区| 日韩视频―中文字幕| 欧美激情第9页| 日韩亚洲欧美精品| 欧美+亚洲+精品+三区| 欧美一二区视频| 国产伦精品一区二区三区免费迷| 亚洲天堂久久| 一区二区三区久久精品| 欧美日韩一级黄| 亚洲午夜久久久久久尤物 | 欧美一区观看| 激情懂色av一区av二区av| 久久精品视频网| 性做久久久久久久免费看| 欧美性色综合| 欧美尤物一区| 久久精品国产亚洲一区二区| 国内精品伊人久久久久av影院| 久久精品日韩一区二区三区| 亚洲欧美日韩天堂一区二区| 国产精品影片在线观看| 久久九九热免费视频| 久久全球大尺度高清视频| 亚洲激情视频| 99精品国产99久久久久久福利| 欧美三级视频在线播放| 欧美中文字幕不卡| 久久精品视频网| 亚洲日韩视频| 在线天堂一区av电影| 日韩亚洲精品视频| 日韩午夜精品视频| 欧美韩日精品| 亚洲女人天堂av| 久久国产夜色精品鲁鲁99| 永久免费毛片在线播放不卡| 亚洲国产美女| 国产精品一区二区三区乱码| 欧美二区乱c少妇| 欧美视频一区二区在线观看 | 性刺激综合网| 久久久久久久综合| 制服诱惑一区二区| 性久久久久久久| 亚洲精品久久久久久久久久久| 99ri日韩精品视频| 精品1区2区3区4区| 一区二区高清视频| 禁久久精品乱码| 亚洲天堂视频在线观看| 亚洲风情亚aⅴ在线发布| 洋洋av久久久久久久一区| 国产综合色产| 亚洲一二三区在线观看| 91久久精品久久国产性色也91| 夜夜嗨一区二区| 亚洲国产另类精品专区| 亚洲综合国产激情另类一区| 亚洲九九精品| 久久久久国产一区二区| 午夜在线视频一区二区区别| 欧美精品一区二区精品网| 久久久蜜桃精品| 国产精品网站在线| 亚洲美女免费视频| 亚洲经典三级| 久久午夜激情| 久久久久久久一区二区| 国产精品国产福利国产秒拍| 91久久精品国产91久久性色| 韩国成人精品a∨在线观看| 亚洲在线观看视频| 宅男噜噜噜66国产日韩在线观看| 老司机免费视频一区二区三区 | 亚洲素人在线| 亚洲一区二区毛片| 欧美激情一区二区三区成人 | 久久精品中文| 久久蜜桃资源一区二区老牛| 国产精品视频第一区| 中国成人黄色视屏| 中文精品视频一区二区在线观看| 欧美电影在线观看完整版| 欧美国产亚洲另类动漫| 亚洲第一在线综合在线| 久久尤物电影视频在线观看| 久久综合免费视频影院| 国产亚洲欧美色| 欧美一级大片在线观看| 久久久久久午夜| 伊人久久大香线蕉av超碰演员| 久久国产欧美精品| 老司机aⅴ在线精品导航| 亚洲成色777777女色窝| 国产亚洲一区二区三区| 亚洲一区欧美二区| 香蕉视频成人在线观看| 国产精品一区二区视频| 先锋影音一区二区三区| 久久久久国产一区二区| 精品成人一区二区| 蜜桃av一区二区三区| 亚洲国产精品久久久久婷婷老年| 日韩视频永久免费| 欧美色欧美亚洲另类二区| 亚洲私人影吧| 欧美www视频在线观看| 日韩图片一区| 欧美先锋影音| 欧美主播一区二区三区美女 久久精品人| 久久久久国产精品一区三寸| 亚洲国产精品一区制服丝袜| 欧美日韩国产成人精品| 午夜精品久久久久久久男人的天堂| 久久精品国产久精国产思思| 亚洲国产精品成人| 欧美视频免费看| 久久精品亚洲精品| 亚洲人成网站影音先锋播放| 性色av一区二区三区| 亚洲高清视频一区| 欧美日韩伦理在线免费| 欧美亚洲在线观看| 亚洲精品老司机| 久久狠狠婷婷| 亚洲最新合集| 永久域名在线精品| 国产精品亚发布| 欧美精品aa| 久久久久久久网| 亚洲一区二区三区免费视频| 欧美成人精品在线| 欧美怡红院视频| 日韩亚洲一区二区| 国内精品久久久久影院 日本资源| 欧美日产国产成人免费图片| 久久成人人人人精品欧| 夜夜嗨av一区二区三区四季av| 男人的天堂亚洲| 欧美一区三区二区在线观看| 欧美成人综合| 久久亚洲精品一区| 亚洲综合国产激情另类一区| 亚洲精品在线二区| 欧美激情久久久久| 久久久久久久久久久久久女国产乱| av成人手机在线| 亚洲人成在线观看| 亚洲第一页中文字幕| 国语自产偷拍精品视频偷|