锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鍏充簬鍐呭瓨鏄犲皠鏂囦歡澶勭悊
浠婂ぉ鐪嬪埌涓綃囨枃绔犺鍐呭瓨鏄犲皠鏂囦歡鐨勫鐞嗭紝铏界劧鑷繁娌℃湁澶勭悊榪囧姝ゅぇ鐨勬枃浠剁郴緇燂紝浣嗘槸濂藉灝變篃鐪嬩簡(jiǎn)涓嬶紝璋佺煡閬撹嚜宸變互鍚庝細(xì)涓嶄細(xì)鐢ㄥ埌鎴栬冨埌榪欐柟闈㈢殑鐭ヨ瘑銆傛墍浠ュ氨緇欒嚜宸?/span> mark 涓涓嬶紝澧炲姞鐐硅嚜宸辯殑鍗拌薄銆?/span>
棣栧厛錛岄氳繃 CreateFile() 鍑芥暟鏉ュ垱寤烘垨鎵撳紑涓涓枃浠跺唴鏍稿璞★紝榪欎釜瀵硅薄鏍囪瘑浜?jiǎn)纾佺洏涓姙畣瑕佺敤浣滃唴瀛樻槧灏勬枃錃g鐨勬枃浠躲傦紙鍏跺疄鏄幏鍙栨枃浠跺彞鏌勶級(jí)
鍏舵錛岄氳繃 CreateFileMapping() 鍑芥暟鏉ヤ負(fù)鍒氭墠鍒涘緩鐨勬枃浠跺唴鏍稿璞″垱寤轟竴涓枃浠舵槧灝勫唴鏍稿璞″茍鍛婅瘔緋葷粺鏂囦歡鐨勫昂瀵鎬互鍙?qiáng)璁块棶鏂囦欢鐨勬柟寮忋傦紙鑾峰彇鏂囦歡鏄犲皠鍐呮牳瀵硅薄鐨勫彞鏌勶級(jí)
鍐嶆錛岄氳繃 MapViewOfFile() 鍑芥暟灝嗘枃浠跺唴鏍告槧灝勫璞℃坊鍔犲埌榪涚▼涓傦紙鑾峰彇鏄犲皠鍐呮牳瀵硅薄鐨勬寚閽堬級(jí)
鎺ョ潃錛岀▼搴忓氨鍙互閫氳繃鎸囬拡榪涜甯歌鐨勬枃浠惰鍙栦簡(jiǎn)錛岃繖閲岀殑鎿嶄綔灝卞拰鏂囦歡鎿嶄綔涓鏍鳳紝涓嶅仛灞曞紑銆?/span>
鐢ㄥ畬涔嬪悗錛岃繕寰楀洖鏀訛紝鍏堢敤 UnmapViewOfFile() 灝嗛噴鏀炬槧灝勫唴鏍稿璞℃寚閽堬紝鐒跺悗閫氳繃 CloseHandle 鍏抽棴涔嬪墠鍒涘緩鐨勬枃浠舵槧灝勫唴鏍稿璞″彞鏌勫拰鏂囦歡鍐呮牳瀵硅薄鍙ユ焺銆?/span>
浠ヤ笅鏄垜鎵懼埌鐨勬枃绔犵殑鍑哄錛?/span> http://newcactus.bokee.com/viewdiary.15316244.html
涓嬮潰綰補(bǔ)鏄矘璐村埆浜虹殑浣滃搧錛?/span>
VC++
涓嬌鐢ㄥ唴瀛樻槧灝勬枃浠跺鐞嗗ぇ鏂囦歡
鎽樿錛?/span>
鏈枃緇欏嚭浜?jiǎn)涓縐嶆柟渚垮疄鐢ㄧ殑瑙e喅澶ф枃浠剁殑璇誨彇銆佸瓨鍌ㄧ瓑澶勭悊鐨勬柟娉曪紝騫剁粨鍚堢浉鍏崇▼搴忎唬鐮佸鍏蜂綋鐨勫疄鐜拌繃紼嬭繘琛屼簡(jiǎn)浠嬬粛銆?span lang="EN-US">
銆銆寮曡█
銆銆鏂囦歡鎿嶄綔鏄簲鐢ㄧ▼搴忔渶涓哄熀鏈殑鍔熻兘涔嬩竴錛?span lang="EN-US">Win32 API鍜?span lang="EN-US">MFC鍧囨彁渚涙湁鏀寔鏂囦歡澶勭悊鐨勫嚱鏁板拰綾伙紝甯哥敤鐨勬湁Win32 API鐨?span lang="EN-US">CreateFile()銆?span lang="EN-US">WriteFile()銆?span lang="EN-US">ReadFile()鍜?span lang="EN-US">MFC鎻愪緵鐨?span lang="EN-US">CFile綾葷瓑銆備竴鑸潵璇達(dá)紝浠ヤ笂榪欎簺鍑芥暟鍙互婊¤凍澶у鏁板満鍚堢殑瑕佹眰錛屼絾鏄浜庢煇浜涚壒孌婂簲鐢ㄩ鍩熸墍闇瑕佺殑鍔ㄨ緞鍑犲崄GB銆佸嚑鐧?span lang="EN-US">GB銆佷箖鑷沖嚑TB鐨勬搗閲忓瓨鍌紝鍐嶄互閫氬父鐨勬枃浠跺鐞嗘柟娉曡繘琛屽鐞嗘樉鐒舵槸琛屼笉閫氱殑銆傜洰鍓嶏紝瀵逛簬涓婅堪榪欑澶ф枃浠剁殑鎿嶄綔涓鑸槸浠ュ唴瀛樻槧灝勬枃浠剁殑鏂瑰紡鏉ュ姞浠ュ鐞嗙殑錛屾湰鏂囦笅闈㈠皢閽堝榪欑Windows鏍稿績(jī)緙栫▼鎶鏈睍寮璁ㄨ銆?span lang="EN-US">
銆銆鍐呭瓨鏄犲皠鏂囦歡
銆銆鍐呭瓨鏄犲皠鏂囦歡涓庤櫄鎷熷唴瀛樻湁浜涚被浼鹼紝閫氳繃鍐呭瓨鏄犲皠鏂囦歡鍙互淇濈暀涓涓湴鍧絀洪棿鐨勫尯鍩燂紝鍚屾椂灝嗙墿鐞嗗瓨鍌ㄥ櫒鎻愪氦緇欐鍖哄煙錛屽彧鏄唴瀛樻枃浠舵槧灝勭殑鐗╃悊瀛樺偍鍣ㄦ潵鑷竴涓凡緇忓瓨鍦ㄤ簬紓佺洏涓婄殑鏂囦歡錛岃岄潪緋葷粺鐨勯〉鏂囦歡錛岃屼笖鍦ㄥ璇ユ枃浠惰繘琛屾搷浣滀箣鍓嶅繀欏婚鍏堝鏂囦歡榪涜鏄犲皠錛屽氨濡傚悓灝嗘暣涓枃浠朵粠紓佺洏鍔犺澆鍒板唴瀛樸傜敱姝ゅ彲浠ョ湅鍑猴紝浣跨敤鍐呭瓨鏄犲皠鏂囦歡澶勭悊瀛樺偍浜庣鐩樹笂鐨勬枃浠舵椂錛屽皢涓嶅繀鍐嶅鏂囦歡鎵цI/O鎿嶄綔錛岃繖鎰忓懗鐫鍦ㄥ鏂囦歡榪涜澶勭悊鏃跺皢涓嶅繀鍐嶄負(fù)鏂囦歡鐢寵騫跺垎閰嶇紦瀛橈紝鎵鏈夌殑鏂囦歡緙撳瓨鎿嶄綔鍧囩敱緋葷粺鐩存帴綆$悊錛岀敱浜庡彇娑堜簡(jiǎn)灝嗘枃浠舵暟鎹姞杞藉埌鍐呭瓨銆佹暟鎹粠鍐呭瓨鍒版枃浠剁殑鍥炲啓浠ュ強(qiáng)閲婃斁鍐呭瓨鍧楃瓑姝ラ錛屼嬌寰楀唴瀛樻槧灝勬枃浠跺湪澶勭悊澶ф暟鎹噺鐨勬枃浠舵椂鑳借搗鍒扮浉褰撻噸瑕佺殑浣滅敤銆傚彟澶栵紝瀹為檯宸ョ▼涓殑緋葷粺寰寰闇瑕佸湪澶氫釜榪涚▼涔嬮棿鍏變韓鏁版嵁錛屽鏋滄暟鎹噺灝忥紝澶勭悊鏂規(guī)硶鏄伒媧誨鍙樼殑錛屽鏋滃叡浜暟鎹閲忓法澶э紝閭d箞灝遍渶瑕佸熷姪浜庡唴瀛樻槧灝勬枃浠舵潵榪涜銆傚疄闄呬笂錛屽唴瀛樻槧灝勬枃浠舵鏄В鍐蟲湰鍦板涓繘紼嬮棿鏁版嵁鍏變韓鐨勬渶鏈夋晥鏂規(guī)硶銆?span lang="EN-US">
銆銆鍐呭瓨鏄犲皠鏂囦歡騫朵笉鏄畝鍗曠殑鏂囦歡I/O鎿嶄綔錛屽疄闄呯敤鍒頒簡(jiǎn)Windows鐨勬牳蹇?jī)缂柦E嬫妧鏈?span lang="EN-US">--鍐呭瓨綆$悊銆傛墍浠ワ紝濡傛灉鎯沖鍐呭瓨鏄犲皠鏂囦歡鏈夋洿娣卞埢鐨勮璇嗭紝蹇呴』瀵?span lang="EN-US">Windows鎿嶄綔緋葷粺鐨勫唴瀛樼鐞嗘満鍒舵湁娓呮鐨勮璇嗭紝鍐呭瓨綆$悊鐨勭浉鍏崇煡璇嗛潪甯稿鏉傦紝瓚呭嚭浜?jiǎn)鏈枃鐨勮璁鸿寖鐣村Q屽湪姝ゅ氨涓嶅啀璧樿堪錛屾劅鍏磋叮鐨勮鑰呭彲浠ュ弬闃呭叾浠栫浉鍏充功綾嶃備笅闈㈢粰鍑轟嬌鐢ㄥ唴瀛樻槧灝勬枃浠剁殑涓鑸柟娉曪細(xì)
銆銆棣栧厛瑕侀氳繃CreateFile()鍑芥暟鏉ュ垱寤烘垨鎵撳紑涓涓枃浠跺唴鏍稿璞★紝榪欎釜瀵硅薄鏍囪瘑浜?jiǎn)纾佺洏涓姙畣瑕佺敤浣滃唴瀛樻槧灏勬枃錃g鐨勬枃浠躲傚湪鐢?span lang="EN-US">CreateFile()灝嗘枃浠舵槧鍍忓湪鐗╃悊瀛樺偍鍣ㄧ殑浣嶇疆閫氬憡緇欐搷浣滅郴緇熷悗錛屽彧鎸囧畾浜?jiǎn)鏄犲儚鏂囦欢鐨勮矾寰勫Q屾槧鍍忕殑闀垮害榪樻病鏈夋寚瀹氥備負(fù)浜?jiǎn)鎸囧畾鏂囦欢鏄牉畡瀵硅薄闇瑕佸澶х殑鐗╃悊瀛樺偍絀洪棿榪橀渶瑕侀氳繃CreateFileMapping()鍑芥暟鏉ュ垱寤轟竴涓枃浠舵槧灝勫唴鏍稿璞′互鍛婅瘔緋葷粺鏂囦歡鐨勫昂瀵鎬互鍙?qiáng)璁块棶鏂囦欢鐨勬柟寮忋傚湪鍒涘緩浜?jiǎn)鏂囦欢鏄牉畡瀵硅薄鍚庡Q岃繕蹇呴』涓烘枃浠舵暟鎹繚鐣欎竴涓湴鍧絀洪棿鍖哄煙錛屽茍鎶婃枃浠舵暟鎹綔涓烘槧灝勫埌璇ュ尯鍩熺殑鐗╃悊瀛樺偍鍣ㄨ繘琛屾彁浜ゃ傜敱MapViewOfFile()鍑芥暟璐熻矗閫氳繃緋葷粺鐨勭鐞嗚屽皢鏂囦歡鏄犲皠瀵硅薄鐨勫叏閮ㄦ垨閮ㄥ垎鏄犲皠鍒拌繘紼嬪湴鍧絀洪棿銆傛鏃訛紝瀵瑰唴瀛樻槧灝勬枃浠剁殑浣跨敤鍜屽鐞嗗悓閫氬父鍔犺澆鍒板唴瀛樹腑鐨勬枃浠舵暟鎹殑澶勭悊鏂瑰紡鍩烘湰涓鏍鳳紝鍦ㄥ畬鎴愪簡(jiǎn)瀵瑰唴瀛樻槧灝勬枃浠剁殑浣跨敤鏃訛紝榪樿閫氳繃涓緋誨垪鐨勬搷浣滃畬鎴愬鍏剁殑娓呴櫎鍜屼嬌鐢ㄨ繃璧勬簮鐨勯噴鏀俱傝繖閮ㄥ垎鐩稿姣旇緝綆鍗曪紝鍙互閫氳繃UnmapViewOfFile()瀹屾垚浠庤繘紼嬬殑鍦板潃絀洪棿鎾ゆ秷鏂囦歡鏁版嵁鐨勬槧鍍忋侀氳繃CloseHandle()鍏抽棴鍓嶉潰鍒涘緩鐨勬枃浠舵槧灝勫璞″拰鏂囦歡瀵硅薄銆?span lang="EN-US">
銆銆鍐呭瓨鏄犲皠鏂囦歡鐩稿叧鍑芥暟
銆銆鍦ㄤ嬌鐢ㄥ唴瀛樻槧灝勬枃浠舵椂錛屾墍浣跨敤鐨?span lang="EN-US">API鍑芥暟涓昏灝辨槸鍓嶉潰鎻愬埌榪囩殑閭e嚑涓嚱鏁幫紝涓嬮潰鍒嗗埆瀵瑰叾榪涜浠嬬粛錛?span lang="EN-US">
HANDLE CreateFile(LPCTSTR lpFileName, |
銆銆鍑芥暟CreateFile()鍗充嬌鏄湪鏅氱殑鏂囦歡鎿嶄綔鏃朵篃緇忓父鐢ㄦ潵鍒涘緩銆佹墦寮鏂囦歡錛屽湪澶勭悊鍐呭瓨鏄犲皠鏂囦歡鏃訛紝璇ュ嚱鏁版潵鍒涘緩/鎵撳紑涓涓枃浠跺唴鏍稿璞★紝騫跺皢鍏跺彞鏌勮繑鍥烇紝鍦ㄨ皟鐢ㄨ鍑芥暟鏃墮渶瑕佹牴鎹槸鍚﹂渶瑕佹暟鎹鍐欏拰鏂囦歡鐨勫叡浜柟寮忔潵璁劇疆鍙傛暟dwDesiredAccess鍜?span lang="EN-US">dwShareMode錛岄敊璇殑鍙傛暟璁劇疆灝嗕細(xì)瀵艱嚧鐩稿簲鎿嶄綔鏃剁殑澶辮觸銆?span lang="EN-US">
HANDLE CreateFileMapping(HANDLE hFile, |
銆銆CreateFileMapping()鍑芥暟鍒涘緩涓涓枃浠舵槧灝勫唴鏍稿璞★紝閫氳繃鍙傛暟hFile鎸囧畾寰呮槧灝勫埌榪涚▼鍦板潃絀洪棿鐨勬枃浠跺彞鏌勶紙璇ュ彞鏌勭敱CreateFile()鍑芥暟鐨勮繑鍥炲艱幏鍙栵級(jí)銆傜敱浜庡唴瀛樻槧灝勬枃浠剁殑鐗╃悊瀛樺偍鍣ㄥ疄闄呮槸瀛樺偍浜庣鐩樹笂鐨勪竴涓枃浠訛紝鑰屼笉鏄粠緋葷粺鐨勯〉鏂囦歡涓垎閰嶇殑鍐呭瓨錛屾墍浠ョ郴緇熶笉浼?xì)涓诲姩湄?fù)鍏朵繚鐣欏湴鍧絀洪棿鍖哄煙錛屼篃涓嶄細(xì)鑷姩灝嗘枃浠剁殑瀛樺偍絀洪棿鏄犲皠鍒拌鍖哄煙錛屼負(fù)浜?jiǎn)璁┚p葷粺鑳藉紜畾瀵歸〉闈㈤噰鍙栦綍縐嶄繚鎶ゅ睘鎬э紝闇瑕侀氳繃鍙傛暟flProtect鏉ヨ瀹氾紝淇濇姢灞炴?span lang="EN-US">PAGE_READONLY銆?span lang="EN-US">PAGE_READWRITE鍜?span lang="EN-US">PAGE_WRITECOPY鍒嗗埆琛ㄧず鏂囦歡鏄犲皠瀵硅薄琚槧灝勫悗錛屽彲浠ヨ鍙栥佽鍐欐枃浠舵暟鎹傚湪浣跨敤PAGE_READONLY鏃訛紝蹇呴』紜繚CreateFile()閲囩敤鐨勬槸GENERIC_READ鍙傛暟錛?span lang="EN-US">PAGE_READWRITE鍒欒姹?span lang="EN-US">CreateFile()閲囩敤鐨勬槸GENERIC_READ|GENERIC_WRITE鍙傛暟錛涜嚦浜庡睘鎬?span lang="EN-US">PAGE_WRITECOPY鍒欏彧闇瑕佺‘淇?span lang="EN-US">CreateFile()閲囩敤浜?span lang="EN-US">GENERIC_READ鍜?span lang="EN-US">GENERIC_WRITE鍏朵腑涔嬩竴鍗沖彲銆?span lang="EN-US">DWORD鍨嬬殑鍙傛暟dwMaximumSizeHigh鍜?span lang="EN-US">dwMaximumSizeLow涔熸槸鐩稿綋閲嶈鐨勶紝鎸囧畾浜?jiǎn)鏂囦欢鐨勬渶澶у瓧鑺傛暟錛岀敱浜庤繖涓や釜鍙傛暟鍏?span lang="EN-US">64浣嶏紝鍥犳鎵鏀寔鐨勬渶澶ф枃浠墮暱搴︿負(fù)16EB錛屽嚑涔庡彲浠ユ弧瓚充換浣曞ぇ鏁版嵁閲忔枃浠跺鐞嗗満鍚堢殑瑕佹眰銆?span lang="EN-US">
LPVOID MapViewOfFile(HANDLE hFileMappingObject, |
銆銆MapViewOfFile()鍑芥暟璐熻矗鎶婃枃浠舵暟鎹槧灝勫埌榪涚▼鐨勫湴鍧絀洪棿錛屽弬鏁?span lang="EN-US">hFileMappingObject涓?span lang="EN-US">CreateFileMapping()榪斿洖鐨勬枃浠舵槧鍍忓璞″彞鏌勩傚弬鏁?span lang="EN-US">dwDesiredAccess鍒欏啀嬈℃寚瀹氫簡(jiǎn)瀵規(guī)枃浠舵暟鎹殑璁塊棶鏂瑰紡錛岃屼笖鍚屾牱瑕佷笌CreateFileMapping()鍑芥暟鎵璁劇疆鐨勪繚鎶ゅ睘鎬х浉鍖歸厤銆傝櫧鐒惰繖閲屼竴鍐嶅淇濇姢灞炴ц繘琛岄噸澶嶈緗湅浼煎浣欙紝浣嗗嵈鍙互浣垮簲鐢ㄧ▼搴忚兘鏇村鐨勫鏁版嵁鐨勪繚鎶ゅ睘鎬у疄琛屾湁鏁堟帶鍒躲?span lang="EN-US">MapViewOfFile()鍑芥暟鍏佽鍏ㄩ儴鎴栭儴鍒嗘槧灝勬枃浠訛紝鍦ㄦ槧灝勬椂錛岄渶瑕佹寚瀹氭暟鎹枃浠剁殑鍋忕Щ鍦板潃浠ュ強(qiáng)寰呮槧灝勭殑闀垮害銆傚叾涓紝鏂囦歡鐨勫亸縐誨湴鍧鐢?span lang="EN-US">DWORD鍨嬬殑鍙傛暟dwFileOffsetHigh鍜?span lang="EN-US">dwFileOffsetLow緇勬垚鐨?span lang="EN-US">64浣嶅兼潵鎸囧畾錛岃屼笖蹇呴』鏄搷浣滅郴緇熺殑鍒嗛厤綺掑害鐨勬暣鏁板嶏紝瀵逛簬Windows鎿嶄綔緋葷粺錛屽垎閰嶇矑搴﹀浐瀹氫負(fù)64KB銆傚綋鐒?dòng)灱屼篃鍙互閫氳繃濡備笅浠g爜鏉ュ姩鎬佽幏鍙栧綋鍓嶆搷浣滅郴緇熺殑鍒嗛厤綺掑害錛?span lang="EN-US">
SYSTEM_INFO sinf; |
銆銆鍙傛暟dwNumberOfBytesToMap鎸囧畾浜?jiǎn)鏁版嵁鏂囦欢鐨勬槧灏勯暱搴﹀Q岃繖閲岄渶瑕佺壒鍒寚鍑虹殑鏄紝瀵逛簬Windows 9x鎿嶄綔緋葷粺錛屽鏋?span lang="EN-US">MapViewOfFile()鏃犳硶鎵懼埌瓚沖澶х殑鍖哄煙鏉ュ瓨鏀炬暣涓枃浠舵槧灝勫璞★紝灝嗚繑鍥炵┖鍊鹼紙NULL錛夛紱浣嗘槸鍦?span lang="EN-US">Windows 2000涓嬶紝MapViewOfFile()鍙渶瑕佷負(fù)蹇呰鐨勮鍥炬壘鍒拌凍澶熷ぇ鐨勪竴涓尯鍩熷嵆鍙紝鑰屾棤欏昏冭檻鏁翠釜鏂囦歡鏄犲皠瀵硅薄鐨勫ぇ灝忋?span lang="EN-US">
銆銆鍦ㄥ畬鎴愬鏄犲皠鍒拌繘紼嬪湴鍧絀洪棿鍖哄煙鐨勬枃浠跺鐞嗗悗錛岄渶瑕侀氳繃鍑芥暟UnmapViewOfFile()瀹屾垚瀵規(guī)枃浠舵暟鎹槧鍍忕殑閲婃斁錛岃鍑芥暟鍘熷瀷澹版槑濡備笅錛?span lang="EN-US">
BOOL UnmapViewOfFile(LPCVOID lpBaseAddress); |
銆銆鍞竴鐨勫弬鏁?span lang="EN-US">lpBaseAddress鎸囧畾浜?jiǎn)杩斿洖鍖哄煙鐨勫熀鍦板潃錛屽繀欏誨皢鍏惰瀹氫負(fù)MapViewOfFile()鐨勮繑鍥炲箋傚湪浣跨敤浜?jiǎn)鍑芥?span lang="EN-US">MapViewOfFile()涔嬪悗錛屽繀欏昏鏈夊搴旂殑UnmapViewOfFile()璋冪敤錛屽惁鍒欏湪榪涚▼緇堟涔嬪墠錛屼繚鐣欑殑鍖哄煙灝嗘棤娉曢噴鏀俱傞櫎姝や箣澶栵紝鍓嶉潰榪樻浘鐢?span lang="EN-US">CreateFile()鍜?span lang="EN-US">CreateFileMapping()鍑芥暟鍒涘緩榪囨枃浠跺唴鏍稿璞″拰鏂囦歡鏄犲皠鍐呮牳瀵硅薄錛屽湪榪涚▼緇堟涔嬪墠鏈夊繀瑕侀氳繃CloseHandle()灝嗗叾閲婃斁錛屽惁鍒欏皢浼?xì)鍑虹幇璧勬簮娉勬紡鐨勯棶棰樸?span lang="EN-US">
銆銆闄や簡(jiǎn)鍓嶉潰榪欎簺蹇呴』鐨?span lang="EN-US">API鍑芥暟涔嬪錛屽湪浣跨敤鍐呭瓨鏄犲皠鏂囦歡鏃惰繕瑕佹牴鎹儏鍐墊潵閫夌敤鍏朵粬涓浜涜緟鍔╁嚱鏁般備緥濡傦紝鍦ㄤ嬌鐢ㄥ唴瀛樻槧灝勬枃浠舵椂錛屼負(fù)浜?jiǎn)鎻愰珮閫熷害錛岀郴緇熷皢鏂囦歡鐨勬暟鎹〉闈㈣繘琛岄珮閫熺紦瀛橈紝鑰屼笖鍦ㄥ鐞嗘枃浠舵槧灝勮鍥炬椂涓嶇珛鍗蟲洿鏂版枃浠剁殑紓佺洏鏄犲儚銆備負(fù)瑙e喅榪欎釜闂鍙互鑰冭檻浣跨敤FlushViewOfFile()鍑芥暟錛岃鍑芥暟寮哄埗緋葷粺灝嗕慨鏀硅繃鐨勬暟鎹儴鍒嗘垨鍏ㄩ儴閲嶆柊鍐欏叆紓佺洏鏄犲儚錛屼粠鑰屽彲浠ョ‘淇濇墍鏈夌殑鏁版嵁鏇存柊鑳藉強(qiáng)鏃朵繚瀛樺埌紓佺洏銆?span lang="EN-US">
浣跨敤鍐呭瓨鏄犲皠鏂囦歡澶勭悊澶ф枃浠跺簲鐢ㄧず渚?span lang="EN-US">
銆銆涓嬮潰緇撳悎涓涓叿浣撶殑瀹炰緥鏉ヨ繘涓姝ヨ榪板唴瀛樻槧灝勬枃浠剁殑浣跨敤鏂規(guī)硶銆傝瀹炰緥浠庣鍙f帴鏀舵暟鎹紝騫跺疄鏃跺皢鍏跺瓨鏀句簬紓佺洏錛岀敱浜庢暟鎹噺澶э紙鍑犲崄GB錛夛紝鍦ㄦ閫夌敤鍐呭瓨鏄犲皠鏂囦歡榪涜澶勭悊銆備笅闈㈢粰鍑虹殑鏄綅浜庡伐浣滅嚎紼?span lang="EN-US">MainProc涓殑閮ㄥ垎涓昏浠g爜錛岃綰跨▼鑷▼搴忚繍琛屾椂鍚姩錛屽綋绔彛鏈夋暟鎹埌杈炬椂灝嗕細(xì)鍙戝嚭浜嬩歡hEvent[0]錛?span lang="EN-US">WaitForMultipleObjects()鍑芥暟絳夊緟鍒拌浜嬩歡鍙戠敓鍚庡皢鎺ユ敹鍒扮殑鏁版嵁淇濆瓨鍒扮鐩橈紝濡傛灉緇堟鎺ユ敹灝嗗彂鍑轟簨浠?span lang="EN-US">hEvent[1]錛屼簨浠跺鐞嗚繃紼嬪皢璐熻矗瀹屾垚璧勬簮鐨勯噴鏀懼拰鏂囦歡鐨勫叧闂瓑宸ヤ綔銆備笅闈㈢粰鍑烘綰跨▼澶勭悊鍑芥暟鐨勫叿浣撳疄鐜拌繃紼嬶細(xì)
鈥︹?br />//
鍒涘緩鏂囦歡鍐呮牳瀵硅薄錛屽叾鍙ユ焺淇濆瓨浜?span lang="EN-US">hFile |
銆銆鍦ㄧ粓姝簨浠惰Е鍙戝鐞嗚繃紼嬩腑濡傛灉鍙畝鍗曠殑鎵цUnmapViewOfFile()鍜?span lang="EN-US">CloseHandle()鍑芥暟灝嗘棤娉曟紜爣璇嗘枃浠剁殑瀹為檯澶у皬錛屽嵆濡傛灉寮杈熺殑鍐呭瓨鏄犲皠鏂囦歡涓?span lang="EN-US">30GB錛岃屾帴鏀剁殑鏁版嵁鍙湁14GB錛岄偅涔堜笂榪扮▼搴忔墽琛屽畬鍚庯紝淇濆瓨鐨勬枃浠墮暱搴︿粛鏄?span lang="EN-US">30GB銆備篃灝辨槸璇達(dá)紝鍦ㄥ鐞嗗畬鎴愬悗榪樿鍐嶆閫氳繃鍐呭瓨鏄犲皠鏂囦歡鐨勫艦寮忓皢鏂囦歡鎭㈠鍒板疄闄呭ぇ灝忥紝涓嬮潰鏄疄鐜版瑕佹眰鐨勪富瑕佷唬鐮侊細(xì)
//
鍒涘緩鍙﹀涓涓枃浠跺唴鏍稿璞?span lang="EN-US"> |
銆銆緇撹
銆銆緇忓疄闄呮祴璇曪紝鍐呭瓨鏄犲皠鏂囦歡鍦ㄥ鐞嗗ぇ鏁版嵁閲忔枃浠舵椂琛ㄧ幇鍑轟簡(jiǎn)鑹ソ鐨勬ц兘錛屾瘮閫氬父浣跨敤CFile綾誨拰ReadFile()鍜?span lang="EN-US">WriteFile()絳夊嚱鏁扮殑鏂囦歡澶勭悊鏂瑰紡鍏鋒湁鏄庢樉鐨勪紭鍔褲傛湰鏂囨墍榪頒唬鐮佸湪Windows 98涓嬬敱Microsoft Visual C++ 6.0緙栬瘧閫氳繃銆?/span>
鏋氫婦涓插彛鍥涙硶
涓插彛浣滀負(fù)鏈鍩烘湰鐨勭數(shù)鑴戦氫俊 I/O 鎺ュ彛錛屽叾浣跨敤铏界劧鍦?nbsp;PC 涓婅秺鏉ヨ秺灝戯紝浣嗘槸鍦ㄥ伐涓氫華鍣ㄩ鍩熶粛鐒剁敤鐨勭浉褰撴櫘閬嶏紝鐢變簬絎旇呭伐浣滀腑闇瑕佺敤鍒頒覆鍙o紝鑰屼笖鍙戠幇鏋氫婦涓插彛鑷充粖浠嶆湭鎼炲緱寰堟竻妤氾紝涓烘鑷繁鍏堟暣鐞嗕笅錛屽笇鏈涘ぇ渚犲拰鍚岃浠鎴戜笉鎳傚拰閿欒鐨勫湴鏂規(guī)寚鐐逛竴涓嬨?/p>
1 銆佹煡璇㈡敞鍐岃〃
鏌ヨ娉ㄥ唽琛ㄧ殑鏂規(guī)硶鏄綉涓婅鍒扮殑姣旇緝甯歌鐨勬柟娉曪紝璇ユ柟娉曞氨鏄嬌鐢ㄧ紪紼嬫柟娉曡鍙栨敞鍐岃〃鍐呬俊鎭紝鐩稿綋浜庣敤鎴烽氳繃鍦ㄨ繍琛屾鍐呰緭鍏?nbsp;”regedit” 錛堟垨 regedit32 錛夌洿鎺ユ墦寮娉ㄥ唽琛紝鏌ョ湅“ HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM ”欏規(guī)潵鑾峰彇涓插彛淇℃伅銆備互涓嬫槸婧愪唬鐮侊細(xì)
CString strSerialList[256]; // 涓存椂瀹氫箟 256 涓瓧絎︿覆緇勶紝鍥犱負(fù)緋葷粺鏈澶氫篃灝?nbsp;256 涓?/p>
HKEY hKey;
LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if(ret0 != ERROR_SUCCESS)
{
return -1;
}
int i = 0;
CHAR Name[25];
UCHAR szPortName[25];
LONG Status;
DWORD dwIndex = 0;
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
do
{
Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,
szPortName, &dwSizeofPortName);
if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
{
strSerialList[i] = CString(szPortName); // 涓插彛瀛楃涓蹭繚瀛?/p>
i++;// 涓插彛璁℃暟
}
} while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));
RegCloseKey(hKey);
浠ヤ笂鏂規(guī)硶鍚屾牱涔熷彲浠ュ疄鐜板騫跺彛鐨勬煡璇紝鍙灝?nbsp;"HARDWARE \\ DEVICEMAP\\ SERIALCOMM\\" 鐢?nbsp;"HARDWARE\\DEVICEMAP\\PARALLEL PORTS\\" 浠f浛灝辮浜?jiǎn)銆?/p>
姣旇緝錛氳鏂規(guī)硶鏃墮棿鏈鐪侊紝絎旇呭湪鑷繁鐢?shù)鑴戜笂璇晿q囷紝鍦?nbsp;1ms 錛堝皯浜?nbsp;1ms 鐨勬垜涔熶笉鐭ラ亾鎬庝箞緙栫▼璁℃椂錛夊唴鍗沖彲瀹屾垚錛涘悓鏃朵篃鍙В鍐?nbsp;usb 杞覆鍙h澶囩殑闂錛屾瘮杈冨疄鐢紝鍞竴緙虹偣鏄紝濡傛灉鐢ㄦ埛鍦ㄨ鏌愪簺杞‖浠舵椂鍦ㄦ敞鍐岃〃涓敞鍐屼簡(jiǎn)铏氭嫙涓插彛涔嬬被鐨勶紝鐢ㄦ娉曟灇涓懼緱鍒扮殑璇ョ被涓插彛瀹為檯涓婃槸涓嶈兘褰撲覆鍙g敤鐨勩?/p>
2 銆佷嬌鐢?nbsp;EnumPort 鏂規(guī)硶
璇ユ柟娉曡皟鐢?nbsp;EnumPort 錛堬級(jí) API 鍑芥暟錛岃鍑芥暟鏈韓灝辨槸鏋氫婦鐢?shù)鑴戠鍙g敤鐨勫Q屽畠鏋氫婦鐨勫茍闈炲彧鏈変覆鍙o紝鎵浠ュ繀欏誨鍏舵墍寰椾覆鍙h繘琛屽垎鏋愰夋嫨錛屼互涓嬫槸婧愪唬鐮侊細(xì)
int m_nSerialPortNum(0);// 涓插彛璁℃暟
CString strSerialList[256]; // 涓存椂瀹氫箟 256 涓瓧絎︿覆緇?/p>
LPBYTE pBite = NULL;
DWORD pcbNeeded = 0; // bytes received or required
DWORD pcReturned = 0; // number of ports received
m_nSerialPortNum = 0;
// 鑾峰彇绔彛淇℃伅錛岃兘寰楀埌绔彛淇℃伅鐨勫ぇ灝?nbsp;pcbNeeded
EnumPorts(NULL, 2, pBite, 0, &pcbNeeded, &pcReturned);
pBite = new BYTE[pcbNeeded];
// 鏋氫婦绔彛錛岃兘寰楀埌绔彛鐨勫叿浣撲俊鎭?nbsp;pBite 浠ュ強(qiáng)绔彛鐨勭殑涓暟 pcReturned
EnumPorts(NULL, 2, pBite, pcbNeeded, &pcbNeeded, &pcReturned);
PORT_INFO_2 *pPort;
pPort = (PORT_INFO_2*)pBite;
for ( i = 0; i < pcReturned; i++)
{
CString str = pPort[i].pPortName;
// 涓插彛淇℃伅鐨勫叿浣撶‘瀹?/p>
if (str.Left(3) == "COM")
{
strSerialList[m_nSerialPortNum] = str.Left(strlen(str) - 1);
//CString temp = str.Right(strlen(str) - 3);// 涓嬮潰涓よ娉ㄩ噴鑾峰彇涓插彛搴忓彿鐢?/p>
//m_nSerialPortNo[m_nSerialPortNum] = atoi(temp.Left(strlen(temp) - 1));
m_nSerialPortNum++;
}
}
浠ヤ笂鏂規(guī)硶闄や簡(jiǎn)涓插彛錛岃繕鍙互鏋氫婦鎵鏈夌殑騫跺彛鍜屾墦鍗版満絳夋帴鍙o紝鑰屼笖鑳芥壘鍒拌櫄鎷熶覆鍙o紙榪欎簺涓插彛鏈変簺鏈嬌鐢ㄦ椂錛屽湪娉ㄥ唽琛ㄥ拰紜歡璁懼綆$悊鍣ㄤ腑鏄笉鑳藉彇寰楃殑錛夈備絾鏄鏂規(guī)硶紼嶅井鑰楁椂浜涳紝絎旇呭湪鑷繁鐢?shù)鑴戜笂璇晿q囷紝澶ф闇瑕佸嚑鍗?nbsp;ms 錛屼富瑕侀棶棰樻槸璇ユ柟娉曟湁浜?nbsp;usb 涓插彛騫朵笉鑳芥煡鍒幫紝鎵浠ヨ鏂規(guī)硶騫朵笉鍙潬銆?/p>
3 銆佷緷嬈℃墦寮涓插彛鐨勬柟娉?/p>
璇ユ柟娉曞氨鏄腑瑙勪腑鐭╃殑渚濇鎵撳紑涓插彛錛岀湅鎵撳紑鏄惁鎴愬姛鏉ュ垽鏂覆鍙g殑鏈夋棤錛岃鏂規(guī)硶婧愪唬鐮佸涓嬶細(xì)
int m_nSerialPortNum(0);// 涓插彛鏁?/p>
CString strSerialList[256]; // 涓存椂瀹氫箟 30 涓瓧絎︿覆緇?/p>
int nCom = 0;
int count = 0;
HANDLE hCom;
do {
nCom++;
strCom.Format("COM%d", nCom);
hCom = CreateFile(strCom, 0, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE == hCom )
break;
strSerialList[m_nSerialPortNum] = strCom;
m_nSerialPortNum++;
CloseHandle(hCom);
} while(1);
浠ヤ笂鏂規(guī)硶鏋氫婦鐨勯兘鏄綋鍓嶅彲鐢ㄧ殑涓插彛錛屽鏋滄湁涓涓覆鍙e綋鍓嶈鍗犵敤鍒欏叾鍚庣殑涓插彛涔熷皢鏃犳硶鏋氫婦寰楀埌錛屽綋鐒朵互涓婃柟娉曚篃鍙互鏀規(guī)垚璋冪敤 for 寰幆璁╁叾鏋氫婦鎵撳紑 256 涓覆鍙g殑鏂規(guī)硶浠ラ伩鍏嶄笂榪版儏鍐碉紝涓嶈繃璇ユ柟娉曟瘮鍓嶄袱縐嶆洿鑰楁椂錛堜竴鑸煡鎵句竴涓覆鍙e氨瑕?nbsp;15ms 宸﹀彸錛夛紝涓嶈繃鍙互鏋氫婦寰楀埌鎵鏈夊綋鍓嶅彲鎵撳紑鐨勪覆鍙o紝褰撶劧涓嶈兘鏋氫婦寰楀埌涓浜涜櫄鎷熶覆鍙c?/p>
4 銆佷嬌鐢?nbsp;SetupAPI 鍑芥暟闆嗙殑鏂規(guī)硶
姝ょ鏂規(guī)硶鏄垜鎵瑙佽繃鏈綆鍗曠殑鏂規(guī)硶錛屼箣鎵浠ョ畝鍗曟槸鍥犱負(fù)宸茬粡鏈変漢灝嗗鏉傜殑浠g爜灝佽璧鋒潵浜?jiǎn)锛屾垜鍙渶鍍忓偦瀛愪竴鏍瘋皟鐢ㄥ氨鍙互瀹屾垚宸ヤ綔浜?jiǎn)锛屽叿浣撶殑璇存槑璇风?a >http://www.codeguru.com/Cpp/W-P/system/hardwareinformation/article.php/c5721/ 錛屼笅闈㈢粰鍑烘湰浜鴻皟鐢ㄨ鏂規(guī)硶鐨勪緥瀛愪唬鐮侊細(xì)
int m_nSerialPortNum(0);// 涓插彛璁℃暟
CString strSerialList[256]; // 涓存椂瀹氫箟 256 涓瓧絎︿覆緇?/p>
CArray<SSerInfo,SSerInfo&> asi;
EnumSerialPorts(asi,TRUE);// 鍙傛暟涓?nbsp;TRUE 鏃舵灇涓懼綋鍓嶅彲浠ユ墦寮鐨勪覆鍙o紝
// 鍚﹀垯鏋氫婦鎵鏈変覆鍙?/p>
m_nSerialPortNum = asi.GetSize();
for (int i=0; i<asi.GetSize(); i++)
{
CString str = asi[i].strFrien dlyName;
}
琛ュ厖璇存槑涓涓嬶紝浣跨敤璇ユ柟娉曞彧瑕佸湪浣犵殑紼嬪簭涓紝娣誨姞“ EnumSerial.cpp ”鍜?#8220; EnumSerial.h ”涓や釜鏂囦歡錛屽茍涓斿皢 Setupapi.lib 鍖呭惈榪涗綘鐨勫伐紼嬫枃浠朵腑灝辮浜?jiǎn)锛岃鏂规硶鏃堕棿涓婃潵璇村彲鑳藉拰绗笁绉嶆栆?guī)硶宸笉澶氾紝浣嗚鏂規(guī)硶鑾峰彇鐨勪覆鍙e畬瀹屽叏鍏ㄥ氨鏄‖浠惰澶囩鐞嗗櫒涓殑涓插彛銆?/p>
浠ヤ笂鏄瑪鑰呭鏋氫婦涓插彛鍑犵鏂規(guī)硶鐨勫皬緇擄紝鏈変簺娌″紕鏄庣櫧鎴栧惈緋婄殑鍦版柟錛岃繕璇鋒寚姝c?/p>
濡備綍鍘婚櫎瀵硅瘽妗嗛粯璁ょ殑Enter鍜?span lang="EN-US">Esc鎸夐敭鍝嶅簲
MFC
浠庣畝鍖栨柟渚垮叆鎵嬶紝涓烘垜浠垱寤虹殑瀵硅瘽妗嗭紝閮藉鍔犱簡(jiǎn)涓涓己鐪佺殑
Enter
鍜?/span>
Esc
閿搷搴旓紝鍓嶈呭搷搴斿璇濇鐨?/span>
IDOK
鎸夐挳錛屽悗鑰呭搷搴?/span>
IDCANCEL
鎸夐挳錛屼絾鏄湁鏃舵垜浠垱寤虹殑瀵硅瘽妗嗕笉闇瑕佽繖涓畝渚跨殑鍝嶅簲鎿嶄綔錛屽鎬殑鏄垜浠湪鍘婚櫎
IDOK
鎸夐挳鍜?/span>
IDCANCEL
鎸夐挳鍚庤繕鏄疄鐜頒笉浜?jiǎn)绂佹濡備笂涓や釜缂虹渷鎸夐敭鐨勫搷搴斻傞偅涔堣濡備綍瀹炵幇鍛紝浠ヤ笅渚挎槸瑙e喅榪囩▼錛堜互鍘婚櫎
Enter
閿搷搴斾負(fù)渚嬶級(jí)錛?/span>
棣栧厛錛屽埄鐢?/span>
ClassWizard
涓哄璇濇鐨?/span>
IDOK
娣誨姞鍗曞嚮鍝嶅簲鍑芥暟錛屽幓闄よ鍑芥暟涓粯璁ょ殑
OnOK
鍑芥暟鍝嶅簲錛屽涓嬫墍紺?/span>
void CDialogDemoDlg::OnOK()
{
聽聽聽聽聽 CDialog::OnOK();
}
鏀逛負(fù)
void CDialogDemoDlg::OnOK()
{
聽聽聽聽聽 //CDialog::OnOK();
}
娉細(xì)榪涜濡備笂榪欐鍚庯紝鏄劇劧浣犱笉璁哄啀鎬庝箞鎸?/span>
Enter
閿兘鏃犳硶浣垮璇濇閫鍑轟簡(jiǎn)錛屼絾鏄篃瀵艱嚧璇ュ璇濇灝辯畻鐢ㄦ埛鐢ㄩ紶鏍囩偣鍑?/span>
IDOK
鎸夐挳涔熸棤娉曞疄鐜板璇濇榛樿鐨?/span>
OnOK
鍑芥暟浜?jiǎn)銆傛墍浠ヨ繖涓姝ュ彧鏄В鍐充簡(jiǎn)涓涓幇璞¢棶棰橈紝鏈病鏈夌湡姝hВ鍐抽棶棰樸備笅闈㈡垜浠鎭㈠榪欎釜鎸夐挳鐨勫姛鑳姐?/span>
鍏舵錛屽幓闄ょ己鐪佹寜閽傚湪璧勬簮瑙嗗浘涓嬶紝灝?/span>
IDOK
鎸夐挳灞炴ф爮涓殑
Default button
灞炴у嬀鍘匯備嬌寰楅粯璁?/span>
Enter
閿笉鍐嶇戶緇搷搴旇鎸夐挳銆?/span>
絎笁錛屾仮澶?/span>
OnOk
鍑芥暟鐨勫姛鑳姐傞鍏堝湪璧勬簮瑙嗗浘涓紝灝?/span>
IDOK
鎸夐挳鐨?/span>
ID
鏀瑰彉涓?/span>
IDC_OK(
榪欓噷鐢ㄦ埛鏍規(guī)嵁闇瑕佸彲浠ヨ嚜宸辮緗祫婧愮殑
ID)
錛涘叾嬈′負(fù)鍏舵坊鍔犲崟鍑誨搷搴斿嚱鏁幫紝騫跺湪闇瑕佹墽琛岀粨鏉熺殑浠g爜鍚庢坊鍔?/span>
CDialog::OnOK()
鍑芥暟錛屽涓嬫墍紺猴細(xì)
void CDialogDemoDlg::OnOk()
{
聽聽聽聽聽 ......//
鐪佸叾瀹冨鐞嗕唬鐮?/span>
聽聽聽聽聽 CDialog::OnOK();
}
濡備笂鎵榪拌繃紼嬪悗錛屾暣涓?/span>
Enter
閿粯璁ゅ搷搴斿凡緇忓幓闄わ紝鑰屼笖涔熶笉浼?xì)濯?jiǎng)鍝嶅璇濇姝e父鍝嶅簲
OnOK
鍑芥暟鐨勫姛鑳斤紝鍦ㄥ涓婂璇濇澶勭悊鍚庯紝濡傛灉
IDC_OK
鎸夐挳鐨?/span>
TabOrder
灞炴т負(fù)
1
鐨勮瘽錛屾寜
Enter
閿氨鐩稿綋浜庨紶鏍囧崟鍑?/span>
IDC_OK,
鎵浠ョ敤鎴峰繀欏誨湪鈥?/span>
Layout
鈥濈殑鈥?/span>
Tab Order
鈥濅笅闈㈤噸鏂板竷緗?/span>
IDC_OK
鎸夐挳鐨?/span>
TabOrder
欏哄簭銆?/span>
涔熻緇嗗績(jī)鐨勮鑰呬細(xì)鍙戠幇錛屾湁鏃跺綋涓嶇敤榪涜絎笁姝ユ搷浣滄椂錛岀洿鎺ュ皢絎竴姝?/span>
OnOK()
鍑芥暟涓敞閲婄殑
CDialog::OnOK()
浠g爜閲嶆柊鍚敤錛屼篃鏄彲浠モ滃畬鎴愨濆幓闄?/span>
Enter
閿粯璁ゅ搷搴旂殑鐗規(guī)э紝浣曞繀瑕佽繘琛岀涓夋榪欎箞澶嶆潅鐨勬搷浣滐紝鍏跺疄涓嶈繘琛岀涓夋鎿嶄綔錛屽茍闈炵湡姝e疄鐜頒簡(jiǎn)鍘婚櫎
Enter
閿搷搴旓紝姣斿瀵硅瘽妗嗕笂鏈変竴涓?/span>
Edit
鎺т歡鏃訛紝鍦ㄧ紪杈?/span>
Edit
緇撴潫鍚庯紝鐢ㄦ埛鎸変笅
Enter
閿紝紼嬪簭灝卞張椹笂鍘誨搷搴?/span>
OnOK
鍑芥暟浜?jiǎn)銆?/span>
濂戒簡(jiǎn)錛屽幓闄ゅ璇濇
Enter
閿己鐪佸搷搴旂殑榪囩▼灝變粙緇嶅埌榪欓噷錛岃鑰呭彲浠ヨ瘯鐫鍘誨幓闄?/span>
Esc
閿殑鍝嶅簲銆?/span>
錛堟敞錛岃鏂規(guī)硶鏈漢涔熸槸涔︿笂寰楁潵錛屼粎鍋氫釜浜烘葷粨錛?/span>
聽