锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍦╓inMain()鍑芥暟涓紝紼嬪簭鎵榪涜鐨勬渶閲嶈宸ヤ綔鏄敞鍐岀獥鍙g被錛屼粠鑰屾妸鑷畾涔夌殑紿楀彛榪囩▼鎻愪緵緇橶indows銆傜劧鍚庣▼搴忚皟鐢╓indows鍒涘緩鍜屾樉紺虹獥鍙o紝鐢辨鍚姩鍚岀敤鎴風殑浜や簰榪囩▼銆傚湪娑堟伅寰幆涓紝紼嬪簭涓嶆柇鍙栧緱娑堟伅錛屼絾騫朵笉榪涜澶勭悊錛岃屾槸灝嗗叾鍙戝洖Windows錛岀敱Windows灝嗘秷鎭彂緇欑浉搴旂殑紿楀彛榪囩▼銆傛秷鎭驚鐜殑浣滅敤鍦ㄤ簬鎺у埗鐢熷懡鏈燂紝濡傛灉娌℃湁娑堟伅寰幆錛岃繘紼嬪皢绔嬪嵆緇撴潫銆?
鍦ㄨ緝楂樺眰嬈′笂鏉ョ湅錛屼竴涓彲鎵╁睍鐨勭郴緇熶細緇欐ā鍧楁彁渚涜祫婧愬拰鑷敱錛岃屾ā鍧楀簲褰撻厤鍚堢郴緇熺殑鏁翠綋緇撴瀯銆傜▼搴忔墽琛屾椂錛學indows浼氫負鍏跺垱寤鴻繘紼嬶紝鍒嗛厤璧勬簮錛屽茍璋冪敤WinMain()銆俉inMain()鏄繘紼嬪叆鍙o紝涔熸槸榪涚▼鍑哄彛錛屽湪姝ゆ湡闂磋繘紼嬪彲浠ュ仛浠諱綍浜嬫儏錛屼絾鏄負浜嗕嬌鐢╓indows鎻愪緵鐨勫悇縐嶄究鍒╋紝瀹冨繀欏葷鍚圵indows紼嬪簭妯″瀷錛屽皢鑷繁鐨勮繍琛岀粨鍚堝埌Windows鐜涓備綔涓鴻繘紼嬪嚭鍙o紝WinMain()鍐沖畾鐫紼嬪簭鐢熷懡鏈熴備竴涓彁渚涚獥鍙h繃紼嬭岀瓑寰匴indows璋冪敤鐨勭▼搴忓浣曠淮鎸佸拰緇撴潫鑷繁鐨勭敓鍛芥湡鍛紝搴旇鐢辨秷鎭潵鍐沖畾銆傚綋榪涚▼娌℃湁瑕佸鐞嗙殑娑堟伅鏃訛紝瀹冨簲璇ョ瓑寰咃紝鎵浠inMain()蹇呴』鐭ラ亾鏈夋病鏈夋秷鎭紝Windows鍙戠粰紿楀彛榪囩▼鐨勬秷鎭笉鑳界粫榪嘩inMain()錛涘綋榪涚▼鏀跺埌鐗瑰畾鐨勬秷鎭椂錛屽畠緇撴潫鐢熷懡鏈燂紝鎵浠inMain()榪樺簲璇ヤ簡瑙f秷鎭殑鍐呭銆傝繖姝f槸GetMessage()鎵鍋氱殑錛屽鏋滃彇涓嶅埌娑堟伅灝遍樆濉烇紝濡傛灉鍙栧埌WM_QUIT娑堟伅灝辮繑鍥?錛岀粨鏉熸秷鎭驚鐜傞偅涔堝鏋滃彇鍒版櫘閫氱殑娑堟伅鍛紝鐢盬inMain()鐩存帴璋冪敤紿楀彛榪囩▼涓嶅彲浠ュ悧錛熻繖縐嶅仛娉曟湁鎮栦簬紼嬪簭鐢盬indows璋冪敤鐨勫熀鏈濇兂錛岃屽疄闄呬笂涔熶細鍑虹幇闂銆備竴涓獥鍙g▼搴忓彲鑳芥湁寰堝紿楀彛綾伙紝涓浜涚獥鍙g被鍙婂叾紿楀彛榪囩▼鏄▼搴忚嚜瀹氫箟鐨勶紝鍙︿竴浜涘垯鏄湪Windows鍐呴儴瀹氫箟鐨勶紝紼嬪簭鐪嬩笉鍒板叾紿楀彛榪囩▼錛屾瘮濡傚悇縐嶆帶浠剁獥鍙c傜獥鍙g▼搴忚繍琛岃搗鏉ヤ互鍚庯紝榪欎簺紿楀彛綾諱簰鐩擱厤鍚堬紝瀹冧滑閫氫俊鐨勬柟寮忓氨鏄秷鎭傜敱浜庢秷鎭寚鍚戠殑紿楀彛榪囩▼鍙兘鏄嚜瀹氫箟鐨勶紝涔熷彲鑳芥槸Windows鍐呴儴鐨勶紝鍙湁Windows鎵嶈兘鎶婂畠浠兘閫佸埌鐩殑鍦幫紝騫朵繚鎸佸彂閫佹柟寮忕殑涓鑷存с傛墍浠inMain()鍙栧埌娑堟伅鍚庯紝閫氳繃DispatchMessage()灝嗗叾鍙戝洖Windows錛岀敱Windows涓哄叾璋冪敤閫傚綋鐨勭獥鍙h繃紼嬶紝鐩村埌紿楀彛榪囩▼璋冪敤鍚庤繑鍥濿indows錛孌ispatchMessage()鎵嶈繑鍥炪?Windows璋冪敤紿楀彛榪囩▼涔嬪悗鎺у埗棣栧厛榪斿洖Windows錛岀敱WinMain()璋冪敤紿楀彛榪囩▼涔嬪悗鎺у埗淇濇寔鍦ㄧ▼搴忎腑錛岃繖縐嶅尯鍒槸鍚︿篃鏈変綔鐢紵涓嶈繃緇忔垜璇曢獙錛屽湪涓涓猈in32 SDK鐨凥ello紼嬪簭涓敼鐢盬inMain()璋冪敤紿楀彛榪囩▼錛屾病鏈夊彂鐜頒粈涔堥棶棰?
鍙傝冭祫鏂欙細
1.銆奧indows紼嬪簭璁捐銆?Charles Petzold 钁?鍖椾含鍗氬濺縐戞妧鍙戝睍鏈夐檺鍏徃 璇?鍖楀ぇ鍑虹増紺?
]]>
浜х敓榪欎釜闂鐨勫師鍥犳槸錛欵XE鍜孌LL涓垎鍒潤鎬侀摼鎺ヤ簡C榪愯鏃跺簱錛屼粠鑰宯ew鍜宒elete榪愮畻絎︽潵鑷狢榪愯鏃跺簱鐨勪笉鍚岀増鏈侰榪愯鏃跺簱鍦ㄧ鐞嗗爢鍐呭瓨鏃訛紝浼氫嬌鐢ㄤ竴浜涘叏灞鍙橀噺鏉ヨ窡韙唴瀛樺垎閰嶆儏鍐碉紝鍥犳紼嬪簭涓摼鎺ョ殑C榪愯鏃跺簱蹇呴』鍞竴錛屽惁鍒欏氨浼氬紩璧蜂笉涓鑷淬?br />
瑙e喅鐨勫姙娉曞緢綆鍗曪細鍦‥XE鍜孌LL涓兘鍔ㄦ侀摼鎺榪愯鏃跺簱錛屼篃灝辨槸鍦ㄥ伐紼嬭緗殑Link闈㈡澘閫夋嫨"蹇界暐鎵鏈夐粯璁ょ殑搴?錛屽啀鍔犲叆msvcrt.lib銆?br />
瀵硅繖涓棶棰樻湁涓ょ閿欒鐨勮鐐歸渶瑕佹緞娓咃細涓縐嶄互涓篍XE鍜孌LL鏈変笉鍚岀殑鍫嗭紝瀹為檯涓奃LL鎬繪槸琚槧灝勫埌鍔犺澆瀹冪殑榪涚▼鐨勫湴鍧絀洪棿錛屽畠娌℃湁鑷繁鐨勫爢錛涗竴縐嶄互涓篋LL鍜孍XE鐩稿浜庝笉鍚岀殑璧峰鍦板潃錛屽姩鎬侀摼鎺ョ殑鍦板潃鏄犲皠鏈哄埗寮曡搗浜嗗墠闈㈢殑闂錛屽疄闄呬笂DLL鏄拰OBJ涓鏍風殑鐩爣妯″潡錛屾瘡涓洰鏍囨ā鍧楅兘鏈夎嚜宸辯殑璧峰鍦板潃錛屼絾鏄摼鎺ユ垚鍔犺澆妯″潡浠ュ悗灝變細緇熶竴鍒頒竴涓搗濮嬪湴鍧錛屼竴涓洰鏍囨ā鍧楀鍏跺畠妯″潡鐨勫紩鐢ㄥ湪閾炬帴鍓嶆槸浠ョ鍙鋒柟寮忚〃紺虹殑錛岄摼鎺ュ悗浼氳淇敼鎴愬湴鍧鏂瑰紡銆傞潤鎬侀摼鎺ュ拰鍔ㄦ侀摼鎺ラ兘浼氫繚璇侊細鍔犺澆妯″潡鏄粺涓緙栧潃鐨勩?br />
鍙傝冭祫鏂欙細
1. http://topic.csdn.net/t/20020714/19/873683.html
2. MSDN July 2000/Knowledge Base/Windows Development/Win32 Software Development Kit/HOWTO: Use the C Run-Time
3. 銆婃搷浣滅郴緇燂紞鍐呮牳涓庤璁″師鐞?絎洓鐗?銆?William Stallings 钁楋紝欖忚繋姊呯瓑璇?鐢靛瓙宸ヤ笟鍑虹増紺?br />
1) 榛樿鏄彲浠ュ拷鐣ョ殑錛屽洜涓鴻皟鐢ㄥ嚱鏁版椂鍙互涓嶅鐞嗗叾榪斿洖鍊鹼紝浠庤岄敊璇鐞嗚渚濊禆浜庣▼搴忓憳鐨勪富鍔ㄦэ紝鑰屼笉鏄▼搴忔満鍒剁殑瑕佹眰錛?/span>
2) 涓嶈兘璺ㄤ綔鐢ㄥ煙浼犻侊紝蹇呴』閫愬眰鍚戜笂杞彂錛屽嵆浣夸腑闂存病鏈夊閿欒鐮佽繘琛岄噸鏂板畾涔夛紱
浣跨敤寮傚父鍙互瑙e喅瑙e喅榪欎袱涓棶棰橈細
1) 寮傚父榛樿鏄笉鍙拷鐣ョ殑錛屾姏鍑虹殑寮傚父蹇呴』鎹曡幏錛屽惁鍒欏氨浼氭姤閿欙紱
2) 寮傚父鍙互璺ㄤ綔鐢ㄥ煙浼犻侊紝浠庤岄敊璇殑鍙戠幇鍜屽鐞嗚寰堝ソ鍦板垎紱誨紑鏉ワ紱
2. 寮傚父鍜屾柇璦鐨勫尯鍒細
寮傚父琚崟鑾峰悗鍙互涓嶄綔澶勭悊錛岀▼搴忎粠鎹曡幏浣嶇疆緇х畫鎵ц銆傝屾柇璦鏄畬鍏ㄦ棤娉曞拷鐣ョ殑錛岀▼搴忓湪鏂█澶辮觸澶勭珛鍗崇粓姝€傚洜姝ゆ柇璦閫氬父鐢ㄤ簬璋冭瘯鐗堟湰錛岀敤鏉ュ彂鐜扮▼搴忎腑鐨勯昏緫閿欒銆傝櫧鐒跺紓甯鎬篃鑳借搗鍒拌繖鏍風殑浣滅敤錛屼絾鏄笉搴旇鐢ㄥ紓甯鎬唬鏇挎柇璦錛?br />1) 濡傛灉鍙戠幇浜嗛昏緫閿欒錛屽繀欏諱慨鏀圭▼搴忥紝鑰屼笉鍙兘鍦ㄧ▼搴忎腑榪涜澶勭悊鍜屾仮澶嶏紝鎵浠ヤ笉闇瑕佸悜澶栦紶閫侊紝娌℃湁蹇呰浣跨敤寮傚父銆?br />2) 浣跨敤鏂█鐨勫紑閿姣斿紓甯稿皬寰楀錛岃屼笖鏂█鍙互浠庡彂甯冪増涓畬鍏ㄥ幓闄ゃ?br />
寮傚父鐢ㄤ簬澶勭悊姝g‘紼嬪簭涓殑榪愯鏈熼棶棰?span lang="EN-US">(姣斿鍐呭瓨鍒嗛厤澶辮觸錛岀獥鍙e垱寤哄け璐ワ紝綰跨▼鍒涘緩澶辮觸錛屾墦寮鏂囦歡澶辮觸)錛屼互灝藉彲鑳芥仮澶嶏紝鑰屼笉鏄粓姝㈢▼搴忋傚浜庤繍琛屽紓甯革紝浣跨敤鏂█鏄潪甯鎬笉鍚堥傜殑錛岀悊鐢卞緢鏄劇劧錛?br />1) 鏂█鍦ㄥ彂甯冪増涓嶈搗浣滅敤錛?br />2) 鏂█鐨勫鐞嗘柟寮忎笉澶熷弸濂斤紱
3) 榪愯寮傚父涓嶆槸紼嬪簭閿欒錛屾病鏈夊繀瑕佹姤鍛婃簮浠g爜鍑洪敊浣嶇疆錛?br />
鍙傝冭祫鏂欙細
1.銆奀++緙栫▼瑙勮寖-101鏉¤鍒欍佸噯鍒欎笌鏈浣沖疄璺點?Herb Sutter錛孉ndrei Alexandrescu 钁?鍒樺熀璇?璇?浜烘皯閭數鍑虹増紺?br />2.銆奀++紼嬪簭璁捐璇█銆?Bjarne Stroustrup 钁椔犺瀹楃嚂 璇?鏈烘宸ヤ笟鍑虹増紺?br />3.銆奀涓嶤++涓殑寮傚父澶勭悊銆?Robert Schmidt 钁?鏃犳儏 璇?http://download.pchome.net/development/reference/11135.html
涓轟竴綾諱駭鍝?/span> ( 涓涓娊璞′駭鍝佸強鍏舵墍鏈夊叿浣撲駭鍝?/span> ) 鎻愪緵涓涓伐鍘傦紝璇ョ被鐨勬瘡涓縐嶅叿浣撲駭鍝佺敱宸ュ巶涓殑涓涓柟娉曞垱寤恒傜縐嶅仛娉曠殑緙虹偣鏄笉鏄撳鍔犳柊鐨勫叿浣撲駭鍝侊紝姣忓鍔犱竴涓叿浣撲駭鍝侊紝宸ュ巶涓氨瑕佸鍔犱竴涓柟娉曪紝榪欐剰鍛崇潃宸ュ巶鐨勬墍鏈変嬌鐢ㄨ呴兘瑕侀噸鏂扮紪璇?/font>銆傚彲浠ョ敤鍙傛暟鍖栫殑鏂規硶鏉ユ敼榪涳紝宸ュ巶鍙彁渚涗竴涓帴鍙楀弬鏁扮殑鍒涘緩鍑芥暟錛屽弬鏁扮殑鍙栧兼爣蹇椾簡鏌愮鍏蜂綋浜у搧錛屽湪鍒涘緩鍑芥暟涓鍙傛暟榪涜鍒ゆ柇錛屾牴鎹笉鍚岀殑鍙傛暟鍊煎垱寤轟笉鍚岀殑鍏蜂綋浜у搧騫惰繑鍥炪傝繖灝卞噺灝忎簡澧炲姞鍏蜂綋浜у搧鐨勪唬浠鳳紝姣忓鍔犱竴縐嶅叿浣撲駭鍝佹椂鍙淇敼宸ュ巶鐨勫垱寤哄嚱鏁扮殑瀹炵幇鍗沖彲銆?/span>
鍘熸潵鏄敤宸ュ巶鐨勪笉鍚屾柟娉曞垱寤轟笉鍚岀殑鍏蜂綋瀵硅薄錛岀幇鍦ㄦ槸鐢ㄥ悓涓涓柟娉曠殑涓嶅悓鍙傛暟鍒涘緩涓嶅悓鐨勫叿浣撳璞°傝繕鍙互鐢ㄦ娊璞″伐鍘傜殑涓嶅悓媧劇敓綾繪潵鍒涘緩涓嶅悓鐨勫叿浣撳璞★紝榪欑鍋氭硶姣旇緝絎ㄩ噸.
Abstract Factory-鍙浛鎹㈢殑宸ュ巶錛?/span>
瑙佸弬鑰冭祫鏂?
鍙傝冭祫鏂欙細
1.銆婅璁℃ā寮?鍙鐢ㄩ潰鍚戝璞¤蔣浠剁殑鍩虹銆?Erich Gamma絳夎憲錛屾潕鑻卞啗絳夎瘧 鏈烘宸ヤ笟鍑虹増紺?br />2.銆婃晱鎹瘋蔣浠跺紑鍙?鍘熷垯錛屾ā寮忎笌瀹炶返銆?Robert C.Martin钁?閭撹緣璇懧犅犳竻鍗庡ぇ瀛﹀嚭鐗堢ぞ

MFC鐨勬枃妗?瑙嗗浘緇撴瀯(Document/View architecture)鏄疢VC妯″紡鐨勪竴縐嶅彉浣擄紝涓嬮潰璁ㄨ瀹冩槸鎬庢牱瀹炵幇鐨勩?br>
鏂囨。/瑙嗗浘緇撴瀯娌℃湁浣撶幇涓氬姟閫昏緫鍜岃鍥劇殑鍒嗙錛屼絾鏄皢鍝嶅簲絳栫暐鍜岃鍥懼尯鍒嗗紑鏉ャ傚畠涓昏鍖呭惈鍥涚瀵硅薄錛?/p>
榪欓噷鐨勮鍥炬鏋剁獥鍙e畾涔変簡瑙嗗浘瀵圭敤鎴瘋緭鍏ョ殑鍝嶅簲鏂瑰紡錛岃屾枃妗fā鏉跨敤鏉ョ鐞嗗墠涓夌瀵硅薄鐨勭粍鍚堛傛枃妗o紝瑙嗗浘錛岃鍥炬鏋剁獥鍙d笁鑰呮槸瀵瑰簲鐨勶紝浠庤屾瀯鎴愪竴涓笁鍏冪粍銆備竴涓簲鐢ㄧ▼搴忓彲鑳介渶瑕佸涓繖鏍風殑涓夊厓緇勶紝浠ュ疄鐜版枃妗g殑澶氳鍥撅紝鎵浠ュ紩鍏ユ枃妗fā鏉挎潵琛ㄧず璇ヤ笁鍏冪粍銆傚洜涓虹▼搴忎腑鍙兘浣跨敤澶氫釜鏂囨。妯℃澘錛孧FC鐢ㄤ竴涓枃妗g鐞嗚呭璞℃潵綆$悊瀹冧滑銆?br>
鍦∕FC涓紝搴旂敤紼嬪簭鍜屼富妗嗘灦紿楀彛鏄敤鏉ュ皝瑁呭簳灞傛満鍒剁殑瀵硅薄錛屾枃妗o紝瑙嗗浘錛岃鍥炬鏋剁獥鍙e拰鏂囨。妯℃澘鏄敤鏉ユ瀯鏋舵枃妗?瑙嗗浘緇撴瀯鐨勫璞°傚簲鐢ㄧ▼搴忛氳繃鏂囨。綆$悊鑰呮潵浣跨敤鏂囨。/瑙嗗浘緇撴瀯銆?br>
濡傛灉瑕佺粰鏂囨。澧炲姞涓縐嶈鍥撅紝鍙渶瑕佸鍔犱竴涓枃妗fā鏉匡紱濡傛灉瑕佹敼鍙樹竴縐嶈鍥劇殑鍝嶅簲絳栫暐錛屽彧瑕佹敼鍙樺搴旀枃妗fā鏉夸腑鐨勮鍥炬鏋剁獥鍙c?br>
<鏈畬寰呯畫>
鍙傝冭祫鏂欙細
1.銆婅璁℃ā寮?鍙鐢ㄩ潰鍚戝璞¤蔣浠剁殑鍩虹銆?Erich Gamma絳夎憲錛屾潕鑻卞啗絳夎瘧 鏈烘宸ヤ笟鍑虹増紺?br>2.銆奐ava涓庢ā寮忋?闃庡畯 鐢靛瓙宸ヤ笟鍑虹増紺?br>3. 妯″瀷-瑙嗗浘-鎺у埗鍣?/a> ( MSDN > 鎶鏈祫婧愬簱 > 浣撶郴緇撴瀯 > 浣跨敤 Microsoft .NET 鐨勪紒涓氳В鍐蟲柟妗堟ā寮?nbsp;>
4. 銆奐ava璁捐錛氬璞★紝UML鍜岃繃紼嬨?Kirk Knoernschild 钁楋紝緗楄嫳浼熺瓑璇?浜烘皯閭數鍑虹増紺?br>5. 銆婅綆楁満緗戠粶涓庡洜鐗圭綉銆?D.E.Comer 钁?寰愯壇璐ょ瓑璇?鏈烘宸ヤ笟鍑虹増紺?br>6.銆婃繁鍏ヨВ鏋怣FC銆?涓浗鐢靛姏鍑虹増紺?br>7.銆奦C鎶鏈唴騫曘嬬5鐗?/ 甯屾湜鐢靛瓙鍑虹増紺?/nobr>
榪欓噷闈㈡秹鍙婂埌涓浜涚▼搴忓拰鏁版嵁錛屽畠浠瓨鏀懼湪涓嶅悓鐨勫湴鏂癸紝鍦ㄤ笉鍚岄樁孌佃繍琛屻傜涓孌電▼搴廙BR錛屽畠鐨勬暟鎹槸DPT錛屽畠浠瓨鏀懼湪紓佺洏鐨勪富寮曞鎵囧尯銆傜浜屾紼嬪簭鏄郴緇熷紩瀵艱褰曪紝瀛樻斁鍦ㄧ郴緇熸墍鍦ㄥ垎鍖虹殑寮曞鎵囧尯銆傜涓夋紼嬪簭鏄郴緇熷惎鍔ㄦ枃浠訛紝瀛樻斁鍦ㄧ郴緇熸墍鍦ㄥ垎鍖虹郴緇熷畨瑁呯洰褰曚腑銆傝繖涓夋紼嬪簭鍍忔帴鍔涜窇涓鏍鳳紝鍓嶄竴孌電▼搴忕殑宸ヤ綔灝辨槸鍔犺澆鍚庝竴孌電▼搴忥紝騫舵妸鎺у埗浜ょ粰瀹冦?/span>
寮曞璁板綍鍜屽惎鍔ㄦ枃浠墮殢鎿嶄綔緋葷粺鑰屼笉鍚岋紝
鏄湪瀹夎鏃跺艦鎴愮殑錛屾瘡涓郴緇熺殑瀹夎紼嬪簭閮芥妸鍏跺紩瀵艱褰曞啓鍏ュ畨瑁呭垎鍖虹殑寮曞鎵囧尯錛岃屽惎鍔ㄦ枃浠舵槸緋葷粺鐨勪竴閮ㄥ垎銆?/span>
涓婇潰鐨勫紩瀵艱繃紼嬫湁涓涓熀鏈己闄鳳紝灝辨槸鍙兘寮曞涓涓郴緇燂紝騫朵笖鍙兘寮曞瑁呭湪絎竴媧誨姩鍒嗗尯鐨勭郴緇熴?br />
濡傛灉涓涓搷浣滅郴緇熶笉鍦ㄦ椿鍔ㄥ垎鍖猴紝閭d箞璇ョ郴緇熻琚紩瀵兼湁涓夌鍔炴硶錛屾敼鍐橫BR錛屾敼鍐欑涓媧誨姩鍒嗗尯寮曞璁板綍錛屾垨鎶婃墍鍦ㄥ垎鍖鴻涓虹涓媧誨姩鍒嗗尯銆傛渶鍚庝竴縐嶅仛娉曟槸涓嶆柟渚跨殑錛岀郴緇熼氬父浼氭敼鍐欏墠涓ゆ寮曞紼嬪簭錛岄偅涔堝畠鍦ㄨВ鍐寵嚜韜紩瀵奸棶棰樼殑鍚屾椂錛屼篃涓嶈兘鐮村潖鍏朵粬緋葷粺鐨勫紩瀵鹼紝榪欏氨寮曞嚭浜嗗緋葷粺鍦板紩瀵奸棶棰樸傚父瑙佺殑鍋氭硶鏄?/span>緋葷粺鎻愪緵涓涓惎鍔ㄧ鐞嗗櫒鎺ョ寮曞榪囩▼銆傚惎鍔ㄧ鐞嗗櫒鑳藉鑾峰緱鏈哄櫒涓婂涓郴緇熺殑寮曞璁板綍錛屼粠鑰屽彲浠ユ牴鎹敤鎴烽夋嫨鍚姩涓嶅悓鐨勭郴緇熴傜郴緇熷湪瀹夎鏃舵敼鍐欑鐩樼涓媧誨姩鍒嗗尯鐨勫紩瀵艱褰曪紝浣垮惎鍔ㄧ鐞嗗櫒琚綔涓虹涓夋紼嬪簭鍔犺澆銆?/span>
濡傛灉鍚姩綆$悊鍣ㄨ兘澶熺煡閬撴満鍣ㄤ笂姣忎釜緋葷粺鎵鍦ㄧ殑鍒嗗尯錛屽氨鑳借幏寰楄緋葷粺鐨勫紩瀵艱褰曪紝浠庤屽彲浠ュ紩瀵艱緋葷粺銆備絾瀹為檯涓婏紝鍚姩綆$悊鍣ㄦ墍灞炵郴緇熺殑寮曞璁板綍鏄笉鑳藉啀嬈¤鍔犺澆鐨勶紝蹇呴』鐗規畩瀵瑰緟銆傚悓涓緋誨垪鐨勭郴緇燂紝涔熷彲鑳芥湁綾諱技鐨勯棶棰樸傛墍浠ュ惎鍔ㄧ鐞嗗櫒鍙兘瑕佷簡瑙f満鍣ㄤ笂姣忎釜緋葷粺鍏蜂綋濡備綍鍚姩錛岀浉搴旇繘琛屽紩瀵箋傝繖鏍峰彧鏈夎楂樼増鏈殑緋葷粺鎻愪緵鍚姩綆$悊鍣紝鍥犱負浣庣増鏈殑鍚姩綆$悊鍣ㄦ棤娉曞惎鍔ㄩ珮鐗堟湰緋葷粺銆?/span>2000/XP鐨勫惎鍔ㄧ鐞嗗櫒鏄疧S Loader銆傚畠瀵?8鍜?000/XP鐨勫紩瀵煎氨鏄笉鍚岀殑錛屽98鏄姞杞?8寮曞璁板綍鐨勯暅鍍忔枃浠訛紝瀵?000/XP鏄姞杞紿AL.DLL絳夋枃浠躲侽S Loader鍦ㄥ紩瀵煎緋葷粺鏃訛紝瀵逛簬windows緋誨垪鐨勫紩瀵兼湁鐗規畩鎬э紝蹇呴』鍚戜笅鍏煎銆?/span>
OS Loader鐨勮澆浣撴槸ntldr鏂囦歡錛屽畠榪愯鏃惰繕浼氳鍙栦竴涓厤緗枃浠禸oot.ini錛屼袱涓枃浠墮兘瀛樻斁鍦ㄧ鐩樼涓媧誨姩鍒嗗尯鏍圭洰褰曘俠oot.ini璁板綍浜嗘瘡涓郴緇熸墍鍦ㄧ殑鍒嗗尯錛屾瘡涓増鏈殑windows鍦ㄥ畨瑁呮椂閮戒細鍦╞oot.ini涓~鍐欐湁鍏寵嚜韜殑涓欏廣?000/XP鍦ㄥ畨瑁呮椂閮戒細鏇存柊OS Loader鍜岄噸鍐欑涓媧誨姩鍒嗗尯鐨勫紩瀵艱褰曪紝鍚庡畨瑁呰呯殑涓や釜紼嬪簭鎵嶄細琚繚鐣欍傚鏋滃悗瑁?000錛岀敱浜庡墠榪扮殑OS Loader鐗堟湰闂錛屽氨鍙兘鏃犳硶寮曞XP銆?/span>
鍔ㄦ佸垱寤哄氨鏄垱寤烘煇縐嶇被鍨嬬殑瀵硅薄錛屽叿浣撶被鍨嬪湪榪愯鏃剁‘瀹氾紝緙栬瘧鏃跺彲鑳戒笉鐭ラ亾銆傛瘮濡傝繍琛屾椂鐢ㄦ埛杈撳叆涓涓被鍨嬪悕縐幫紝濡傛灉璇ョ被鍨嬫槸紼嬪簭綾誨瀷浣撶郴涓殑涓鍛橈紝鍒欑▼搴忎腑灝嗚兘澶熷垱寤鴻綾誨瀷鐨勫璞°備笅闈㈢殑浠g爜鏄嬌鐢∕FC鍔ㄦ佸垱寤烘満鍒剁殑涓涓畝鍖栫殑渚嬪瓙錛?/p>
CRuntimeClass* g_pFirstClass;
void func()
{
char szClassName[64];
CRuntimeClass* pClass;
CObject* pObject;
cout << "enter a class name... ";
cin >> szClassName;
for (pClass = g_pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass)
{
if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
pObject = pClass->CreateObject();
}
}
瀹炵幇鍔ㄦ佸垱寤虹殑鎬濊礬鏄妸鍔ㄦ佺殑綾誨瀷鍚嶇О涓庣▼搴忕被鍨嬩綋緋諱腑鐨勬瘡涓涓繘琛屾瘮杈冿紝涓庢煇涓被鍨嬪惢鍚堟椂璁╄綾誨瀷鍒涘緩鑷韓鐨勫璞°傝繖鏍鳳紝鏀寔鍔ㄦ佸垱寤虹殑綾誨簱涓殑姣忎竴涓被閮借棰濆瀹炵幇涓浜涘姛鑳斤紝鍗沖垽鍒竴涓悕縐版槸鍚︿笌鑷韓鐩哥錛屼互鍙婂垱寤鴻嚜韜殑瀵硅薄銆?/p>
鍒ゅ埆涓涓悕縐版槸鍚︿笌鑷韓鐩哥錛岃繖鏄繍琛屾椂綾昏瘑鍒殑鍐呭錛屾墍浠FC鍔ㄦ佸垱寤烘槸鍦≧TCI鍩虹涓婂疄鐜扮殑銆?/p>
RTCI鏄竴涓璞¤兘澶熷垽瀹氳嚜宸辨槸鍚﹀睘浜庢煇縐嶇被鍨嬶紝璇ョ被鍨嬬殑鍚嶇О鍦ㄨ繍琛屾椂紜畾錛岀紪璇戞椂鍙兘涓嶇煡閬撱備粠涓嬮潰鐨勪緥瀛愬緢瀹規槗鐞嗚ВRTCI錛?/p>
void Func()
{
char szClassName[64];
CDocument* pDoc = new CDocument;
cout << "enter a class name... ";
cin >> szClassName;
cout << pDoc->IsKindOf(szClassName); //鏄繑鍥?錛屽惁榪斿洖0
}
鏈変竴鐐歸渶瑕佽鏄庣殑鏄紝鍥犱負CDocument媧劇敓浜嶤Object錛屾墍浠sKindOf瀵逛簬CObject涔熻榪斿洖1銆傚洜涓烘垜浠槸浠庡姩鎬佸垱寤哄嚭鍙戠殑錛屾墍浠ュ鏋滄槸榪欐牱鍙兘浼氭湁涓鐐硅儗紱誨垵琛楓備絾鏄疪TCI鏄庢樉鍜屽姩鎬佸垱寤烘湁瀵嗗垏鑱旂郴錛孯TCI涔熷彲鑳芥湁鍗曠嫭鐨勪環鍊鹼紝鎵浠ュ厛鎶奟TCI瀹炵幇璧鋒潵銆?/p>
瀹炵幇RTCI鐨勬濊礬鏄姣忎竴涓被璁板綍鑷韓鐨勭被鍨嬩俊鎭紝騫舵彁渚汭sKindOf(char*)鍑芥暟榪涜鎵緇欑被鍨嬩笌鑷韓綾誨瀷鐨勬瘮杈冿紝鑰屼笖榪樿鑳借闂熀綾葷殑綾誨瀷淇℃伅錛岃繘琛屾瘮杈冿紝涓鐩村埌鏍圭被銆傛墍浠ヨ褰曠殑綾誨瀷淇℃伅瑕佹寜緇ф壙鍏崇郴榪炶搗鏉ワ紝姣忎釜綾葷殑IsKindOf()榪樿璋冪敤鍩虹被鐨処sKindOf()銆侻FC鎶婅璁板綍鐨勭被鍨嬩俊鎭娊鍙栧埌涓涓狢RuntimeClass緇撴瀯浣撲腑錛屾瘡涓被涓姞鍏ヤ竴涓狢RuntimeClass鎴愬憳鍗沖彲銆?/p>
鐜板湪鍥炲埌鍔ㄦ佸垱寤猴紝鍦≧TCI寤虹珛鐨勬暟鎹粨鏋勫熀紜涓婂皢鍙疄鐜板畠銆傚姩鎬佸垱寤轟粠涓嶅悓浜嶪sKindOf()鐨勮搴︿嬌鐢ㄨ繖涓鏁版嵁緇撴瀯錛屽畠瑕侀亶鍘嗘墍鏈夌被鍨嬬殑CRuntimeClass銆傞偅涔堜粎浠呮湁緇ф壙鍏崇郴鐨勭被鐨凜RuntimeClass鐩歌繛榪樹笉澶燂紝瑕佹妸鎵鏈夌被鐨凜RuntimeClass榪炴垚涓涓摼琛ㄣ傚叾瀹炲姩鎬佸垱寤哄茍涓嶅叧蹇冪被闂寸殑緇ф壙鍏崇郴錛屽畠騫崇瓑鐪嬪緟姣忎釜綾匯傜幇鍦ㄤ互CRuntimeClass涓虹粨鐐規瀯鎴愪竴涓旱妯袱涓柟鍚戠殑閾捐〃錛孖sKindOf()鍜屽姩鎬佸垱寤哄垎鍒嬌鐢ㄥ畠涓嶅悓鐨勪晶闈€?/p>
搴忓垪鍖栫殑姒傚康鏄湪鏂囦歡涓瓨鍌ㄥ璞′俊鎭紝騫惰兘鏍規嵁瀹冩仮澶嶅璞°傚浜庢枃妗h鍥劇粨鏋勭殑杞歡錛岀敤鎴烽渶瑕佷繚瀛樻墍緙栬緫鐨勬枃妗e拰鎵撳紑宸茬紪杈戠殑鏂囨。錛岃繖姝f槸搴忓垪鍖栫殑搴旂敤錛屾墍浠ュ簭鍒楀寲鏄潪甯擱噸瑕佺殑涓縐嶇壒鎬с傚湪搴忓垪鍖栨仮澶嶅璞℃椂錛屽氨鍙互鐢ㄥ埌鍔ㄦ佸垱寤恒?/p>
浣跨敤MFC搴忓垪鍖栫殑渚嬪瓙濡備笅錛?/p>
void CMyDocument::Serialize(CArichive &ar)
{
if (ar.IsStoring())
{
ar << m_pMyClass; //CMyClass m_pMyClass;
}
else
{
ar >> m_pMyClass;
}
}
涓涓敮鎸佸簭鍒楀寲鐨勭被鎻愪緵Serialize(CArchive &)鍑芥暟錛岄噸杞?lt;<鍜?gt;>鎿嶄綔銆傛敞鎰忎袱鑰呮槸涓嶅悓鐨勶紝鍦ㄤ笂渚嬩腑錛孋MyDocument綾葷殑淇℃伅騫朵笉琚簭鍒楀寲錛岃孋MyClass綾葷殑淇℃伅琚簭鍒楀寲銆傚疄闄呬笂涓涓簭鍒楀寲綾葷殑<<鍜?gt;>鎿嶄綔錛屽叾涓嶆秹鍙婄被淇℃伅鐨勯儴鍒嗘槸璋冪敤Serialize()瀹屾垚鐨勶紝瀹冨繀欏誨悓鏃跺疄鐜拌繖涓よ呫?/p>
鎸夌収MFC鐨勮姹傦紝闇瑕佸湪鏀寔搴忓垪鍖栫殑綾誨畾涔変腑浣跨敤DECLARE_SERIAL瀹忥紝鍦ㄧ被瀹炵幇涓嬌鐢↖MPLEMENT_SERIAL瀹忋傛垜浠湅涓涓嬭繖涓や釜瀹忓疄鐜頒簡浠涔堬紝
#define DECLARE_SERIAL(class_name) \
_DECLARE_DYNCREATE(class_name) \
AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject) \
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; } \
涓昏鏄姞鍏ヤ簡瀵?gt;>鐨勯噸杞斤紝浣嗘槸娌℃湁閲嶈澆<<錛孧FC浠呮彁渚涗簡CObject瀵?lt;<鐨勯噸杞斤紝濡備笅錛?/p>
_AFX_INLINE CArchive& AFXAPI operator<<(CArchive& ar, const CObject* pOb)
{ ar.WriteObject(pOb); return ar; }
榪欐槸鍥犱負鍦ㄥ簭鍒楀寲璇誨拰鍐欑殑鏃跺欙紝閮介渶瑕佸叿浣撶被鐨凜RuntimeClass淇℃伅銆傜浉搴旂殑GetRuntimeClass()鏄竴涓櫄鍑芥暟錛孋Object閲嶈澆<<錛屽湪鍐欑被淇℃伅鏃惰皟鐢ㄥ埌璇ュ嚱鏁幫紝鐢變簬铏氬嚱鏁版満鍒訛紝鍐欏叆鐨勬槸鍏蜂綋綾葷殑淇℃伅銆備絾鏄繖閲岄殣鍚潃涓涓潯浠訛紝灝辨槸璋冪敤<<鍜孏etRuntimeClass()鏃訛紝鍏蜂綋綾誨璞″凡緇忓瓨鍦ㄤ簡錛岃岃皟鐢?gt;>鍜岃鍏ョ被淇℃伅鏃訛紝璇ョ被瀵硅薄榪樻湭琚垱寤猴紝鎵浠ユ棤娉曞埄鐢ㄨ繖縐嶆満鍒訛紝鍙兘鍦ㄦ瘡涓叿浣撶被涓兘閲嶈澆涓嬈?gt;>銆傛垜瑙夊緱銆婃繁鍏ヨВ鏋怣FC銆嬪榪欎釜闂鐨勮В閲婁笉姝g‘銆?/p>
榪欓噷鏈変竴涓棶棰橀渶瑕佹槑紜竴涓嬶紝搴忓垪鍖栦負浠涔堣鍐欏叆綾諱俊鎭紵涓鏄畠搴旇淇濆瓨瀹屾暣鐨勮兘澶熺嫭绔嬫仮澶嶅璞$殑淇℃伅錛屼簩鏄湪紼嬪簭璇誨叆瀵硅薄鏃訛紝瑕佹妸瀹冪殑綾諱俊鎭拰紼嬪簭涓湡鏈涚殑(鎵鑳藉鐞嗙殑)綾諱俊鎭浉姣旇緝錛岃繘琛屾楠屻?/p>
鐪婭MPLEMENT_SERIAL瀹忓閲嶈澆>>鐨勫疄鐜幫紝鏄彁渚涗竴涓湡鏈涚殑CRuntimeClass緇撴瀯(鐢ㄤ簬媯楠?錛屽鎵楥Archive榪涜瀵硅薄璇誨彇銆傚洜涓鴻瀵硅薄鏃墮鍏堣璺熸枃浠舵墦浜ら亾錛屾墍浠ヤ氦緇機Archive澶勭悊錛岄殢鍚庢妸璇誨嚭鐨勬暟鎹啓鍏ュ璞℃椂錛孋Archive鍐嶈皟鐢ㄥ叿浣撶被鐨凷erialize()錛屽姝ゅ悎浣滄槸鍗佸垎鎭板綋鐨勩傚湪榪欓噷錛孋Archive榪樿礋璐d簡璇誨嚭鍜屾楠岀被淇℃伅錛岀劧鍚庡垱寤哄璞$殑榪囩▼銆傚洜涓轟竴鏂歸潰鍏蜂綋綾誨璞¤繕涓嶅瓨鍦紝鍙︿竴鏂歸潰榪欎簺鎿嶄綔瀵規墍鏈夊叿浣撶被閮芥病鏈夊垎鍒紝搴旇鎻愬嚭鏉ワ紝鍦ㄧ被綰у埆瀹炵幇鎴栬呰鍚堜綔鑰呭疄鐜般傚疄闄呬笂錛孧FC鍏堟妸榪欎釜榪囩▼浜ょ粰CArchive::ReadClass()錛屽悗鑰呭張璋冪敤CRuntimeClass::Load()銆?nbsp;
瀵逛簬搴忓垪鍖栨潵璇達紝鎼炴竻瀹冪殑姒傚康浠ュ悗錛屽氨鏄疄鐜癝erialzie()錛岄噸杞?lt;<鍜?gt;>銆傚<<鍜?gt;>鐨勯噸杞芥秹鍙婂緢澶氬伐浣滐紝MFC宸茬粡甯垜浠疄鐜頒簡錛屾垜浠篃鐪嬭浜嗗ぇ姒傜殑璁捐錛屼富瑕佹槸涓嶤Archive鍒嗗伐鍚堜綔錛屽叾嬈℃槸CRuntimeClass銆?/p>
鐜板湪鐪嬪埌CRuntimeClass緇撴瀯浣撳湪MFC瀵筊TCI錛屽姩鎬佸垱寤哄拰搴忓垪鍖栫殑瀹炵幇涓兘璧風潃閲嶈鐨勪綔鐢紝閲嶆柊璁よ瘑涓涓嬭繖涓暟鎹粨鏋勫緢鏈夊繀瑕併?/p>
CRuntimeClass鍖呭惈浜嗗叧浜庣被鐨勫悇縐嶄俊鎭拰鏈夊叧鎿嶄綔銆傛妸綾誨強鍏跺熀綾葷殑CRuntimeClass榪炴垚涓涓摼琛紝灝卞彲浠ュ緢鏂逛究鍦板疄鐜癛TCI鐨処sKindOf()錛涙妸鎵鏈夌被鐨凜RuntimeClass榪炴垚涓涓摼琛紝鍐嶅姞涓婁竴涓畝鍗曠殑CreateObject鍑芥暟錛屽氨鍙互瀵逛互浠繪剰綾誨悕榪涜鍔ㄦ佸垱寤虹殑浼佸浘鍋氬嚭鍙嶅簲錛汣RuntimeClass榪樺疄鐜頒簡鍚戞枃浠惰鍐欑被淇℃伅鐨凩oad()錛孲tore()錛岄厤鍚堝簭鍒楀寲鐨勫疄鐜般?/p>
鍦ㄥ垎鏋愭秷鎭槧灝勫拰鍛戒護浼犻掓満鍒朵箣鍓嶏紝闇瑕佸Windows紼嬪簭妯″瀷鏈夊緢濂界殑鐞嗚В銆?/p>
鏈畬寰呯畫...
鍙傝冿細
銆婃繁鍏ヨВ鏋怣FC銆?涓浗鐢靛姏鍑虹増紺?br>銆婃繁鍏ユ祬鍑篗FC銆?鍗庝腑縐戝ぇ鍑虹増紺?br>銆奧indows紼嬪簭璁捐銆?鍖楀ぇ鍑虹増紺?/p>
#define聽POW(c)聽(1<<(c))
#define聽MASK(c)聽(((unsigned聽long)-1)聽/聽(POW(POW(c))聽+聽1))
#define聽ROUND(n,聽c)聽(((n)聽&聽MASK(c))聽+聽((n)聽>>聽POW(c)聽&聽MASK(c)))
int聽bit_count(unsigned聽int聽n)

{
聽聽聽聽n聽=聽ROUND(n,聽0);
聽聽聽聽n聽=聽ROUND(n,聽1);
聽聽聽聽n聽=聽ROUND(n,聽2);
聽聽聽聽n聽=聽ROUND(n,聽3);
聽聽聽聽n聽=聽ROUND(n,聽4);
聽聽聽聽return聽n;
}