锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 涓插彛閫氳涓殑DCB緇撴瀯 typedef struct _DCB {// dcb DWORD DCBlength; // sizeof(DCB) DORD BaudRate; // current baud rate銆鎸囧畾褰撳墠鐨勬嘗鐗圭巼 DWORD fBinary: 1; // binary mode, no EOF check銆鎸囧畾鏄惁鍏佽浜岃繘鍒舵ā寮廤IN95涓』涓篢RUE DWORD fParity: 1; // enable parity checking銆鎸囧畾濂囧伓鏍¢獙鏄惁鍏佽 DWORD fOutxCtsFlow:1; // CTS output flow control 鎸囧畾CTS鏄惁鐢ㄤ簬媯嫻嬪彂閫佹帶鍒躲傚綋涓篢RUE鏄疌TS涓篛FF錛屽彂閫佸皢琚寕璧楓?/font> DTR_CONTROL_DISABLE 鍊煎皢DTR緗負OFF,DTR_CONTROL_ENABLE鍊煎皢DTR緗負ON, DTR_CONTROL_HANDSHAKE 鍏佽DTR"鎻℃墜", DWORD fDsrSensitivity:1;// DSR sensitivity 褰撹鍊間負TRUE鏃禗SR涓篛FF鏃舵帴鏀剁殑瀛楄妭琚拷鐣?/font> DWORD fTXContinueOnXoff:1; // XOFF continues Tx DWORD fInX: 1; // XON/XOFF in flow control DWORD fRtsControl:2; // RTS flow control RTS_CONTROL_HANDSHAKE鏃?褰撴帴鏀剁紦鍐插尯灝忎簬鍗婃弧鏃禦TS涓篛N褰撴帴鏀剁紦鍐插尯瓚呰繃鍥涘垎涔嬩笁婊℃椂RTS涓篛FF WORD wReserved; // not currently used銆銆鏈嬌鐢?蹇呴』涓? WORD XonLim; // transmit XON threshold BYTE Parity; // 0-4=no,odd,even,mark,space銆鎸囧畾绔彛褰撳墠浣跨敤鐨勫鍋舵牎楠屾柟娉?鍙兘涓? StopBits; char XoffChar; // Tx and Rx XOFF character銆銆鎸囧畾鐢ㄤ簬鍙戦佸拰鎺ユ敹瀛楃XOFF鍊?/font> char ErrorChar; // error replacement character鏈瓧絎︾敤鏉ヤ唬鏇挎帴鏀跺埌鐨勫鍋舵牎楠屽彂鐢熼敊璇椂鐨勫?/font> char EofChar; // end of input character銆褰撴病鏈変嬌鐢ㄤ簩榪涘埗妯″紡鏃?鏈瓧絎﹀彲鐢ㄦ潵鎸囩ず鏁版嵁鐨勭粨鏉?/font> char EvtChar; // received event character銆褰撴帴鏀跺埌姝ゅ瓧絎︽椂,浼氫駭鐢熶竴涓簨浠?/font> WORD wReserved1; // reserved; do not use 鏈嬌鐢?/font> } DCB; Murali R. Krishnan 1999 騫?2 鏈?/p>
鎽樿錛?/strong> 璁ㄨ甯歌鐨勫爢鎬ц兘闂浠ュ強濡備綍闃茶寖瀹冧滑銆傦紙鍏?9 欏碉級 鎮ㄦ槸鍚︽槸鍔ㄦ佸垎閰嶇殑 C/C++ 瀵硅薄蹇犲疄涓斿垢榪愮殑鐢ㄦ埛錛熸偍鏄惁鍦ㄦā鍧楅棿鐨勫線榪旈氫俊涓綣佸湴浣跨敤浜?#8220;鑷姩鍖?#8221;錛熸偍鐨勭▼搴忔槸鍚﹀洜鍫嗗垎閰嶈岃繍琛岃搗鏉ュ緢鎱紵涓嶄粎浠呮偍閬囧埌榪欐牱鐨勯棶棰樸傚嚑涔庢墍鏈夐」鐩繜鏃╅兘浼氶亣鍒板爢闂銆傚ぇ瀹墮兘鎯寵錛?#8220;鎴戠殑浠g爜鐪熸濂斤紝鍙槸鍫嗗お鎱?#8221;銆傞偅鍙槸閮ㄥ垎姝g‘銆傛洿娣卞叆鐞嗚В鍫嗗強鍏剁敤娉曘佷互鍙婁細鍙戠敓浠涔堥棶棰橈紝鏄緢鏈夌敤鐨勩?/p>
錛堝鏋滄偍宸茬粡鐭ラ亾浠涔堟槸鍫嗭紝鍙互璺沖埌“浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?#8221;閮ㄥ垎錛?/p>
鍦ㄧ▼搴忎腑錛屼嬌鐢ㄥ爢鏉ュ姩鎬佸垎閰嶅拰閲婃斁瀵硅薄銆傚湪涓嬪垪鎯呭喌涓嬶紝璋冪敤鍫嗘搷浣滐細 鍫嗕嬌鐢ㄤ簡鍦ㄨ繍琛屾椂鍒嗛厤緇欎唬鐮佸拰鍫嗘爤鐨勫唴瀛樹箣澶栫殑閮ㄥ垎鍐呭瓨銆備笅鍥劇粰鍑轟簡鍫嗗垎閰嶇▼搴忕殑涓嶅悓灞傘?/p>
GlobalAlloc/GlobalFree錛?/strong>Microsoft Win32 鍫嗚皟鐢紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>
LocalAlloc/LocalFree錛?/strong>Win32 鍫嗚皟鐢紙涓轟簡涓?Microsoft Windows NT 鍏煎錛夛紝榪欎簺璋冪敤鐩存帴涓庢瘡涓繘紼嬬殑榛樿鍫嗚繘琛屽璇濄?/p>
COM 鐨?IMalloc 鍒嗛厤紼嬪簭錛堟垨 CoTaskMemAlloc / CoTaskMemFree錛夛細鍑芥暟浣跨敤姣忎釜榪涚▼鐨勯粯璁ゅ爢銆傝嚜鍔ㄥ寲紼嬪簭浣跨敤“緇勪歡瀵硅薄妯″瀷 (COM)”鐨勫垎閰嶇▼搴忥紝鑰岀敵璇風殑紼嬪簭浣跨敤姣忎釜榪涚▼鍫嗐?/p>
C/C++ 榪愯鏃?(CRT) 鍒嗛厤紼嬪簭錛?/strong>鎻愪緵浜?malloc() 鍜?free() 浠ュ強 new 鍜?delete 鎿嶄綔絎︺傚 Microsoft Visual Basic 鍜?Java 絳夎璦涔熸彁渚涗簡鏂扮殑鎿嶄綔絎﹀茍浣跨敤鍨冨溇鏀墮泦鏉ヤ唬鏇垮爢銆侰RT 鍒涘緩鑷繁鐨勭鏈夊爢錛岄┗鐣欏湪 Win32 鍫嗙殑欏墮儴銆?/p>
Windows NT 涓紝Win32 鍫嗘槸 Windows NT 榪愯鏃跺垎閰嶇▼搴忓懆鍥寸殑钖勫眰銆傛墍鏈?API 杞彂瀹冧滑鐨勮姹傜粰 NTDLL銆?/p>
Windows NT 榪愯鏃跺垎閰嶇▼搴忔彁渚?Windows NT 鍐呯殑鏍稿績鍫嗗垎閰嶇▼搴忋傚畠鐢卞叿鏈?128 涓ぇ灝忎粠 8 鍒?1,024 瀛楄妭鐨勭┖闂插垪琛ㄧ殑鍓嶇鍒嗛厤紼嬪簭緇勬垚銆傚悗绔垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樻潵淇濈暀鍜屾彁浜ら〉銆?/p>
鍦ㄥ浘琛ㄧ殑搴曢儴鏄?#8220;铏氭嫙鍐呭瓨鍒嗛厤紼嬪簭”錛屾搷浣滅郴緇熶嬌鐢ㄥ畠鏉ヤ繚鐣欏拰鎻愪氦欏點傛墍鏈夊垎閰嶇▼搴忎嬌鐢ㄨ櫄鎷熷唴瀛樿繘琛屾暟鎹殑瀛樺彇銆?/p>
鍒嗛厤鍜岄噴鏀懼潡涓嶅氨閭d箞綆鍗曞悧錛熶負浣曡姳璐硅繖涔堥暱鏃墮棿錛?/p>
浼犵粺涓婏紝鎿嶄綔緋葷粺鍜岃繍琛屾椂搴撴槸涓庡爢鐨勫疄鐜板叡瀛樼殑銆傚湪涓涓繘紼嬬殑寮濮嬶紝鎿嶄綔緋葷粺鍒涘緩涓涓粯璁ゅ爢錛屽彨鍋?#8220;榪涚▼鍫?#8221;銆傚鏋滄病鏈夊叾浠栧爢鍙嬌鐢紝鍒欏潡鐨勫垎閰嶄嬌鐢?#8220;榪涚▼鍫?#8221;銆傝璦榪愯鏃朵篃鑳藉湪榪涚▼鍐呭垱寤哄崟鐙殑鍫嗐傦紙渚嬪錛孋 榪愯鏃跺垱寤哄畠鑷繁鐨勫爢銆傦級闄よ繖浜涗笓鐢ㄧ殑鍫嗗錛屽簲鐢ㄧ▼搴忔垨璁稿宸茶澆鍏ョ殑鍔ㄦ侀摼鎺ュ簱 (DLL) 涔嬩竴鍙互鍒涘緩鍜屼嬌鐢ㄥ崟鐙殑鍫嗐俉in32 鎻愪緵涓鏁村 API 鏉ュ垱寤哄拰浣跨敤縐佹湁鍫嗐傛湁鍏?a >鍫嗗嚱鏁幫紙鑻辨枃錛?/u>鐨勮灝芥寚瀵鹼紝璇峰弬瑙?MSDN銆?/p>
褰撳簲鐢ㄧ▼搴忔垨 DLL 鍒涘緩縐佹湁鍫嗘椂錛岃繖浜涘爢瀛樺湪浜庤繘紼嬬┖闂達紝騫朵笖鍦ㄨ繘紼嬪唴鏄彲璁塊棶鐨勩備粠緇欏畾鍫嗗垎閰嶇殑鏁版嵁灝嗗湪鍚屼竴涓爢涓婇噴鏀俱傦紙涓嶈兘浠庝竴涓爢鍒嗛厤鑰屽湪鍙︿竴涓爢閲婃斁銆傦級 鍦ㄦ墍鏈夎櫄鎷熷唴瀛樼郴緇熶腑錛屽爢椹葷暀鍦ㄦ搷浣滅郴緇熺殑“铏氭嫙鍐呭瓨綆$悊鍣?#8221;鐨勯《閮ㄣ傝璦榪愯鏃跺爢涔熼┗鐣欏湪铏氭嫙鍐呭瓨欏墮儴銆傛煇浜涙儏鍐典笅錛岃繖浜涘爢鏄搷浣滅郴緇熷爢涓殑灞傦紝鑰岃璦榪愯鏃跺爢鍒欓氳繃澶у潡鐨勫垎閰嶆潵鎵ц鑷繁鐨勫唴瀛樼鐞嗐備笉浣跨敤鎿嶄綔緋葷粺鍫嗭紝鑰屼嬌鐢ㄨ櫄鎷熷唴瀛樺嚱鏁版洿鍒╀簬鍫嗙殑鍒嗛厤鍜屽潡鐨勪嬌鐢ㄣ?/p>
鍏稿瀷鐨勫爢瀹炵幇鐢卞墠銆佸悗绔垎閰嶇▼搴忕粍鎴愩傚墠绔垎閰嶇▼搴忕淮鎸佸浐瀹氬ぇ灝忓潡鐨勭┖闂插垪琛ㄣ傚浜庝竴嬈″垎閰嶈皟鐢紝鍫嗗皾璇曚粠鍓嶇鍒楄〃鎵懼埌涓涓嚜鐢卞潡銆傚鏋滃け璐ワ紝鍫嗚榪粠鍚庣錛堜繚鐣欏拰鎻愪氦铏氭嫙鍐呭瓨錛夊垎閰嶄竴涓ぇ鍧楁潵婊¤凍璇鋒眰銆傞氱敤鐨勫疄鐜版湁姣忓潡鍒嗛厤鐨勫紑閿錛岃繖灝嗚楄垂鎵ц鍛ㄦ湡錛屼篃鍑忓皯浜嗗彲浣跨敤鐨勫瓨鍌ㄧ┖闂淬?/p>
Knowledge Base 鏂囩珷 Q10758錛?#8220;鐢?calloc() 鍜?malloc() 綆$悊鍐呭瓨” 錛堟悳绱㈡枃绔犵紪鍙鳳級, 鍖呭惈浜嗘湁鍏寵繖浜涗富棰樼殑鏇村鑳屾櫙鐭ヨ瘑銆傚彟澶栵紝鏈夊叧鍫嗗疄鐜板拰璁捐鐨勮緇嗚璁轟篃鍙湪涓嬪垪钁椾綔涓壘鍒幫細“Dynamic Storage Allocation: A Survey and Critical Review”錛屼綔鑰?Paul R. Wilson銆丮ark S. Johnstone銆丮ichael Neely 鍜?David Boles錛?#8220;International Workshop on Memory Management”, 浣滆?Kinross, Scotland, UK, 1995 騫?9 鏈?http://www.cs.utexas.edu/users/oops/papers.html)錛堣嫳鏂囷級銆?/p>
Windows NT 鐨勫疄鐜幫紙Windows NT 鐗堟湰 4.0 鍜屾洿鏂扮増鏈級 浣跨敤浜?127 涓ぇ灝忎粠 8 鍒?1,024 瀛楄妭鐨?8 瀛楄妭瀵歸綈鍧楃┖闂插垪琛ㄥ拰涓涓?#8220;澶у潡”鍒楄〃銆?#8220;澶у潡”鍒楄〃錛堢┖闂插垪琛╗0]錛?淇濆瓨澶т簬 1,024 瀛楄妭鐨勫潡銆傜┖闂插垪琛ㄥ綰充簡鐢ㄥ弻鍚戦摼琛ㄩ摼鎺ュ湪涓璧風殑瀵硅薄銆傞粯璁ゆ儏鍐典笅錛?#8220;榪涚▼鍫?#8221;鎵ц鏀墮泦鎿嶄綔銆傦紙鏀墮泦鏄皢鐩擱偦絀洪棽鍧楀悎騫舵垚涓涓ぇ鍧楃殑鎿嶄綔銆傦級鏀墮泦鑰楄垂浜嗛澶栫殑鍛ㄦ湡錛屼絾鍑忓皯浜嗗爢鍧楃殑鍐呴儴紕庣墖銆?/p>
鍗曚竴鍏ㄥ眬閿佷繚鎶ゅ爢錛岄槻姝㈠綰跨▼寮忕殑浣跨敤銆傦紙璇峰弬瑙?#8220;Server Performance and Scalability Killers”涓殑絎竴涓敞鎰忎簨欏? George Reilly 鎵钁楋紝鍦?“MSDN Online Web Workshop”涓婏紙绔欑偣錛?a >http://msdn.microsoft.com/workshop/server/iis/tencom.asp錛堣嫳鏂囷級銆傦級鍗曚竴鍏ㄥ眬閿佹湰璐ㄤ笂鏄敤鏉ヤ繚鎶ゅ爢鏁版嵁緇撴瀯錛岄槻姝㈣法澶氱嚎紼嬬殑闅忔満瀛樺彇銆傝嫢鍫嗘搷浣滃お棰戠箒錛屽崟涓鍏ㄥ眬閿佷細瀵規ц兘鏈変笉鍒╃殑褰卞搷銆?/p>
浠ヤ笅鏄偍浣跨敤鍫嗘椂浼氶亣鍒扮殑鏈甯歌闂錛? 绔炰簤閫氬父浼氬鑷寸嚎紼嬪拰榪涚▼鐨勪笂涓嬫枃鍒囨崲銆備笂涓嬫枃鍒囨崲鐨勫紑閿鏄緢澶х殑錛屼絾寮閿鏇村ぇ鐨勬槸鏁版嵁浠庡鐞嗗櫒楂橀熺紦瀛樹腑涓㈠け錛屼互鍙婂悗鏉ョ嚎紼嬪媧繪椂鐨勬暟鎹噸寤恒?/p>
绔炰簤鏄湪鍒嗛厤鍜岄噴鏀炬搷浣滀腑瀵艱嚧閫熷害鍑忔參鐨勯棶棰樸傜悊鎯蟲儏鍐典笅錛屽笇鏈涗嬌鐢ㄦ病鏈夌珵浜夊拰蹇熷垎閰?閲婃斁鐨勫爢銆傚彲鎯滐紝鐜板湪榪樻病鏈夎繖鏍風殑閫氱敤鍫嗭紝涔熻灝嗘潵浼氭湁銆?/p>
鍦ㄦ墍鏈夌殑鏈嶅姟鍣ㄧ郴緇熶腑錛堝 IIS銆丮SProxy銆丏atabaseStacks銆佺綉緇滄湇鍔″櫒銆?Exchange 鍜屽叾浠栵級, 鍫嗛攣瀹氬疄鍦ㄦ槸涓ぇ鐡墮銆傚鐞嗗櫒鏁拌秺澶氾紝绔炰簤灝辮秺浼氭伓鍖栥?/p>
鐜板湪鎮ㄦ槑鐧戒嬌鐢ㄥ爢鏃跺瓨鍦ㄧ殑闂浜嗭紝闅鵑亾鎮ㄤ笉鎯蟲嫢鏈夎兘瑙e喅榪欎簺闂鐨勮秴綰ч瓟媯掑悧錛熸垜鍙笇鏈涙湁銆備絾娌℃湁欖旀硶鑳戒嬌鍫嗚繍琛屽姞蹇斿洜姝や笉瑕佹湡鏈涘湪浜у搧鍑鴻揣涔嬪墠鐨勬渶鍚庝竴鏄熸湡鑳藉澶т負鏀硅銆傚鏋滄彁鍓嶈鍒掑爢絳栫暐錛屾儏鍐靛皢浼氬ぇ澶уソ杞傝皟鏁翠嬌鐢ㄥ爢鐨勬柟娉曪紝鍑忓皯瀵瑰爢鐨勬搷浣滄槸鎻愰珮鎬ц兘鐨勮壇鏂廣?/p>
濡備綍鍑忓皯浣跨敤鍫嗘搷浣滐紵閫氳繃鍒╃敤鏁版嵁緇撴瀯鍐呯殑浣嶇疆鍙噺灝戝爢鎿嶄綔鐨勬鏁般傝鑰冭檻涓嬪垪瀹炰緥錛?/p>
鍧楀寲鏄弸濂界殑澶勭悊鍣ㄩ珮閫熺紦瀛橈紝鐗瑰埆鏄浜?L1-楂橀熺紦瀛橈紝鍥犱負瀹冩彁渚涗簡澧炲姞鐨勪綅緗?鈥斾笉鐢ㄨ瀵逛簬鍧楀垎閰嶏紝寰堝鏁版嵁鍧椾細鍦ㄥ悓涓涓櫄鎷熼〉涓?/p>
浣跨敤涓婅堪鎶鏈皢鑾峰緱鐨勫ソ澶勪細鍥犲璞$被鍨嬨佸ぇ灝忓強宸ヤ綔閲忚屾湁鎵涓嶅悓銆備絾鎬昏兘鍦ㄦц兘鍜屽彲鍗囩緝鎬ф柟闈㈡湁鎵鏀惰幏銆傚彟涓鏂歸潰錛屼唬鐮佷細鏈夌偣鐗規畩錛屼絾濡傛灉緇忚繃娣辨濈啛铏戯紝浠g爜榪樻槸寰堝鏄撶鐞嗙殑銆?/p>
涓嬮潰鏄竴浜涙彁楂橀熷害鐨勬妧鏈細 鐢變簬鍑犱釜鍚屼簨鐨勫姫鍔涘拰杈涘嫟宸ヤ綔錛?998 騫村垵 Microsoft Windows(R) 2000 涓湁浜嗗嚑涓噸澶ф敼榪涳細 榪欎簺鏀硅繘閬垮厤浜嗗鍒嗛厤楂橀熺紦瀛樼殑闇姹傦紝浣嗕笉鎺掗櫎鍏朵粬鐨勪紭鍖栥備嬌鐢?Windows NT5 鍫嗚瘎浼版偍鐨勪唬鐮侊紱瀹冨灝忎簬 1,024 瀛楄妭 (1 KB) 鐨勫潡錛堟潵鑷墠绔垎閰嶇▼搴忕殑鍧楋級鏄渶浣崇殑銆?strong>GlobalAlloc() 涓婅堪鏀硅繘宸插湪 Windows 2000 beta 2 鍜?Windows NT 4.0 SP4 涓嬌鐢ㄣ傛敼榪涘悗錛屽爢閿佺殑绔炰簤鐜囨樉钁楅檷浣庛傝繖浣挎墍鏈?Win32 鍫嗙殑鐩存帴鐢ㄦ埛鍙楃泭銆侰RT 鍫嗗緩绔嬩簬 Win32 鍫嗙殑欏墮儴錛屼絾瀹冧嬌鐢ㄨ嚜宸辯殑灝忓潡鍫嗭紝鍥犺屼笉鑳戒粠 Windows NT 鏀硅繘涓彈鐩娿傦紙Visual C++ 鐗堟湰 6.0 涔熸湁鏀硅繘鐨勫爢鍒嗛厤紼嬪簭銆傦級 鍒嗛厤楂橀熺紦瀛樺厑璁擱珮閫熺紦瀛樺垎閰嶇殑鍧楋紝浠ヤ究灝嗘潵閲嶇敤銆傝繖鑳藉鍑忓皯瀵硅繘紼嬪爢錛堟垨鍏ㄥ眬鍫嗭級鐨勫垎閰?閲婃斁璋冪敤鐨勬鏁幫紝涔熷厑璁告渶澶ч檺搴︾殑閲嶇敤鏇劇粡鍒嗛厤鐨勫潡銆傚彟澶栵紝鍒嗛厤楂橀熺紦瀛樺厑璁告敹闆嗙粺璁′俊鎭?浠ヤ究杈冨ソ鍦扮悊瑙e璞″湪杈冮珮灞傛涓婄殑浣跨敤銆?/p>
鍏稿瀷鍦幫紝鑷畾涔夊爢鍒嗛厤紼嬪簭鍦ㄨ繘紼嬪爢鐨勯《閮ㄥ疄鐜般傝嚜瀹氫箟鍫嗗垎閰嶇▼搴忎笌緋葷粺鍫嗙殑琛屼負寰堢浉浼箋備富瑕佺殑宸埆鏄畠鍦ㄨ繘紼嬪爢鐨勯《閮ㄤ負鍒嗛厤鐨勫璞℃彁渚涢珮閫熺紦瀛樸傞珮閫熺紦瀛樿璁℃垚涓濂楀浐瀹氬ぇ灝忥紙濡?32 瀛楄妭銆?4 瀛楄妭銆?28 瀛楄妭絳夛級銆傝繖涓涓緢濂界殑絳栫暐錛屼絾榪欑鑷畾涔夊爢鍒嗛厤紼嬪簭涓㈠け涓庡垎閰嶅拰閲婃斁鐨勫璞$浉鍏崇殑“璇箟淇℃伅”銆? 涓庤嚜瀹氫箟鍫嗗垎閰嶇▼搴忕浉鍙嶏紝“鍒嗛厤楂橀熺紦瀛?#8221;浣滀負姣忕被鍒嗛厤楂橀熺紦瀛樻潵瀹炵幇銆傞櫎鑳藉鎻愪緵鑷畾涔夊爢鍒嗛厤紼嬪簭鐨勬墍鏈夊ソ澶勪箣澶栵紝瀹冧滑榪樿兘澶熶繚鐣欏ぇ閲忚涔変俊鎭傛瘡涓垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忎笌涓涓洰鏍囦簩榪涘埗瀵硅薄鍏寵仈銆傚畠鑳藉浣跨敤涓濂楀弬鏁拌繘琛屽垵濮嬪寲錛岃繖浜涘弬鏁拌〃紺哄茍鍙戠駭鍒佸璞″ぇ灝忓拰淇濇寔鍦ㄧ┖闂插垪琛ㄤ腑鐨勫厓绱犵殑鏁伴噺絳夈傚垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忓璞$淮鎸佽嚜宸辯殑縐佹湁絀洪棽瀹炰綋姹狅紙涓嶈秴榪囨寚瀹氱殑闃鍊鹼級騫朵嬌鐢ㄧ鏈変繚鎶ら攣銆傚悎鍦ㄤ竴璧鳳紝鍒嗛厤楂橀熺紦瀛樺拰縐佹湁閿佸噺灝戜簡涓庝富緋葷粺鍫嗙殑閫氫俊閲忥紝鍥犺屾彁渚涗簡澧炲姞鐨勫茍鍙戙佹渶澶ч檺搴︾殑閲嶇敤鍜岃緝楂樼殑鍙幾緙╂с?/p>
闇瑕佷嬌鐢ㄦ竻鐞嗙▼搴忔潵瀹氭湡媯鏌ユ墍鏈夊垎閰嶉珮閫熺紦瀛樺鐞嗙▼搴忕殑媧誨姩鎯呭喌騫跺洖鏀舵湭鐢ㄧ殑璧勬簮銆傚鏋滃彂鐜版病鏈夋椿鍔紝灝嗛噴鏀懼垎閰嶅璞$殑姹狅紝浠庤屾彁楂樻ц兘銆?/p>
鍙互瀹℃牳姣忎釜鍒嗛厤/閲婃斁媧誨姩銆傜涓綰т俊鎭寘鎷璞°佸垎閰嶅拰閲婃斁璋冪敤鐨勬繪暟銆傞氳繃鏌ョ湅瀹冧滑鐨勭粺璁′俊鎭彲浠ュ緱鍑哄悇涓璞′箣闂寸殑璇箟鍏崇郴銆傚埄鐢ㄤ互涓婁粙緇嶇殑璁稿鎶鏈箣涓錛岃繖縐嶅叧緋誨彲浠ョ敤鏉ュ噺灝戝唴瀛樺垎閰嶃?/p>
鍒嗛厤楂橀熺紦瀛樹篃璧峰埌浜嗚皟璇曞姪鎵嬬殑浣滅敤錛屽府鍔╂偍璺熻釜娌℃湁瀹屽叏娓呴櫎鐨勫璞℃暟閲忋傞氳繃鏌ョ湅鍔ㄦ佸爢鏍堣繑鍥炶釜榪瑰拰闄ゆ病鏈夋竻闄ょ殑瀵硅薄涔嬪鐨勭鍚嶏紝鐢氳嚦鑳藉鎵懼埌紜垏鐨勫け璐ョ殑璋冪敤鑰呫?/p>
MP 鍫嗘槸瀵瑰澶勭悊鍣ㄥ弸濂界殑鍒嗗竷寮忓垎閰嶇殑紼嬪簭鍖咃紝鍦?Win32 SDK錛圵indows NT 4.0 鍜屾洿鏂扮増鏈級涓彲浠ュ緱鍒般傛渶鍒濈敱 JVert 瀹炵幇錛屾澶勫爢鎶借薄寤虹珛鍦?Win32 鍫嗙▼搴忓寘鐨勯《閮ㄣ侻P 鍫嗗垱寤哄涓?Win32 鍫嗭紝騫惰瘯鍥懼皢鍒嗛厤璋冪敤鍒嗗竷鍒頒笉鍚屽爢錛屼互鍑忓皯鍦ㄦ墍鏈夊崟涓閿佷笂鐨勭珵浜夈?/p>
鏈▼搴忓寘鏄ソ鐨勬楠?鈥斾竴縐嶆敼榪涚殑 MP-鍙嬪ソ鐨勮嚜瀹氫箟鍫嗗垎閰嶇▼搴忋備絾鏄紝瀹冧笉鎻愪緵璇箟淇℃伅鍜岀己涔忕粺璁″姛鑳姐傞氬父灝?MP 鍫嗕綔涓?SDK 搴撴潵浣跨敤銆傚鏋滀嬌鐢ㄨ繖涓?SDK 鍒涘緩鍙噸鐢ㄧ粍浠訛紝鎮ㄥ皢澶уぇ鍙楃泭銆備絾鏄紝濡傛灉鍦ㄦ瘡涓?DLL 涓緩绔嬭繖涓?SDK 搴擄紝灝嗗鍔犲伐浣滆緗?/p>
瑕佸湪澶氬鐞嗗櫒鏈哄櫒涓婁幾緙╋紝鍒欑畻娉曘佸疄鐜般佹暟鎹粨鏋勫拰紜歡蹇呴』鍔ㄦ佷幾緙┿傝鐪嬫渶緇忓父鍒嗛厤鍜岄噴鏀劇殑鏁版嵁緇撴瀯銆傝瘯闂紝“鎴戣兘鐢ㄤ笉鍚岀殑鏁版嵁緇撴瀯瀹屾垚姝ゅ伐浣滃悧錛?#8221;渚嬪錛屽鏋滃湪搴旂敤紼嬪簭鍒濆鍖栨椂鍔犺澆浜嗗彧璇婚」鐨勫垪琛紝榪欎釜鍒楄〃涓嶅繀鏄嚎鎬ч摼鎺ョ殑鍒楄〃銆傚鏋滄槸鍔ㄦ佸垎閰嶇殑鏁扮粍灝遍潪甯稿ソ銆傚姩鎬佸垎閰嶇殑鏁扮粍灝嗗噺灝戝唴瀛樹腑鐨勫爢鍧楀拰紕庣墖錛屼粠鑰屽寮烘ц兘銆?/p>
鍑忓皯闇瑕佺殑灝忓璞$殑鏁伴噺鍑忓皯鍫嗗垎閰嶇▼搴忕殑璐熻澆銆備緥濡傦紝鎴戜滑鍦ㄦ湇鍔″櫒鐨勫叧閿鐞嗚礬寰勪笂浣跨敤浜斾釜涓嶅悓鐨勫璞★紝姣忎釜瀵硅薄鍗曠嫭鍒嗛厤鍜岄噴鏀俱備竴璧烽珮閫熺紦瀛樿繖浜涘璞★紝鎶婂爢璋冪敤浠庝簲涓噺灝戝埌涓涓紝鏄捐憲鍑忓皯浜嗗爢鐨勮礋杞斤紝鐗瑰埆褰撴瘡縐掗挓澶勭悊 1,000 涓互涓婄殑璇鋒眰鏃躲?/p>
濡傛灉澶ч噺浣跨敤“Automation”緇撴瀯錛岃鑰冭檻浠庝富綰夸唬鐮佷腑鍒犻櫎“Automation BSTR”錛屾垨鑷沖皯閬垮厤閲嶅鐨?BSTR 鎿嶄綔銆傦紙BSTR 榪炴帴瀵艱嚧榪囧鐨勯噸鍒嗛厤鍜屽垎閰?閲婃斁鎿嶄綔銆傦級 瀵規墍鏈夊鉤鍙板線寰閮藉瓨鍦ㄥ爢瀹炵幇錛屽洜姝ゆ湁宸ㄥぇ鐨勫紑閿銆傛瘡涓崟鐙唬鐮侀兘鏈夌壒瀹氱殑瑕佹眰錛屼絾璁捐鑳介噰鐢ㄦ湰鏂囪璁虹殑鍩烘湰鐞嗚鏉ュ噺灝戝爢涔嬮棿鐨勭浉浜掍綔鐢ㄣ? Murali Krishnan 鏄?Internet Information Server (IIS) 緇勭殑棣栧腑杞歡璁捐宸ョ▼甯堛備粠 1.0 鐗堟湰寮濮嬩粬灝辮璁?IIS錛屽茍鎴愬姛鍙戣浜?1.0 鐗堟湰鍒?4.0 鐗堟湰銆侻urali 緇勭粐騫墮瀵?IIS 鎬ц兘緇勪笁騫?(1995-1998), 浠庝竴寮濮嬪氨褰卞搷 IIS 鎬ц兘銆備粬鎷ユ湁濞佹柉搴鋒槦宸?Madison 澶у鐨?M.S.鍜屽嵃搴?Anna 澶у鐨?B.S.銆傚伐浣滀箣澶栵紝浠栧枩嬈㈤槄璇匯佹墦鎺掔悆鍜屽搴児楗?/p>
澶栧3瀵硅瘽妗?br>
澶栧3瀵硅瘽妗嗙殑縐樺瘑
甯歌鐨刉indows鐨勯氱敤瀵硅瘽妗嗚灝佽鍦–omdlg32.dll錛岃繖緇欐垜浠殑緙栫▼鎻愪緵浜嗗緢澶х殑渚垮埄銆備絾瀹冭繕涓嶅瀹屾暣錛屾垜浠湪緋葷粺閲岀粡甯歌兘鐪嬪埌澶ч噺鐨勫彲閲嶅浣跨敤鐨勫璇濇,浣嗗湪Windows鐨勬枃妗i噷浣犲嵈鎵句笉鍒板畠浠殑璋冪敤鏂規硶銆傝屽鏋滄垜浠嚜宸卞幓鍋氳繖鏍風殑鐣岄潰鏄潪甯歌垂鏃惰垂鍔涚殑鑰屼笖涔熸槸娌℃湁蹇呰鐨勶紝鍥犱負榪欎簺瀵硅瘽妗嗗疄闄呬笂寰堝鏄撳緱鍒般傝繖閲屾垜瑕佷粙緇嶄竴浜涘凡緇忎紬鎵鍛ㄧ煡鎴栦笉涓鴻鐭ョ殑瀵硅瘽妗嗭紝瀹冧滑鍙互搴旂敤鍦ㄦ垜浠殑紼嬪簭涓嬌紼嬪簭鏄懼緱闈炲父鍙嬪ソ鍜屼笓涓氥?br>
嫻忚鏂囦歡澶瑰璇濇
鍥?.23
澶у鏁癉elphi紼嬪簭鍛橀兘鐭ラ亾濡備綍浣跨敤VCL鐨凾OpenDialog鎺т歡鏉ヨ鐢ㄦ埛嫻忚灝嗚鎵撳紑鐨勬枃浠躲傜劧鑰屾湁鏃朵綘鍙兘鍙兂璁╃敤鎴烽夋嫨鏂囦歡澶硅屼笉鏄壒瀹氱殑鏂囦歡錛寃indows宸茬粡鎻愪緵浜嗕竴涓繖鏍風殑瀵硅瘽妗嗗鍥?.23鎵紺恒傛垜浠彲浠ラ氳繃鍏紑鐨勫嚱鏁癝HBrowseForFolder鏉ヨ皟鐢?(榪欎釜鍑芥暟瀹氫箟鍦⊿hlObj鍗曞厓)錛屽嚱鏁板畾涔夊涓嬶細
function SHBrowseForFolder(var BrowseInfo: TBrowseInfo): PItemIDList; stdcall;
榪欎釜鍑芥暟鍙湁涓涓弬鏁幫紝浣嗚繖涓弬鏁版槸涓涓瘮杈冨鏉傜殑璁板綍綾誨瀷
TBrowseInfo = packed record
hwndOwner: HWND;
pidlRoot: PItemIDList;
pszDisplayName: PChar;
lpszTitle: PChar;
ulFlags: UINT;
lpfn: TFNBFFCallBack;
lParam: LPARAM;
iImage: Integer;
end;
hwndOwner鏁版嵁鎴愬憳鍖呭惈瀵硅瘽妗嗙殑鐖剁獥浣撶殑紿楀彛鍙ユ焺錛屽彲浠ユ妸瀹冭鎴?銆侾IdlRoot鏁版嵁鎴愬憳鎸囧悜涓涓狿IDL鐨勬寚閽堝搴斾簬瀵硅瘽妗嗗垵濮嬪寲鏃剁殑鏍圭洰褰曘傛寚瀹氫簡PIdlRoot鍚庯紝灝卞彧鏈夋牴鐩綍鍙婂畠鐨勫瓙鐩綍浼氬嚭鐜板湪瀵硅瘽妗嗕腑銆傚彲浠ヨ瀹氬畠涓簄il錛岃繖鏃剁己鐪佺殑鏍圭洰褰曟槸妗岄潰錛宲szDisplayName 鏁版嵁鎴愬憳鎸囧悜涓涓紦鍐插尯鍙互鐢ㄦ潵鍌ㄥ瓨琚敤鎴烽変腑鐨勬枃浠跺悕錛岀紦鍐插尯鐨勫ぇ灝忚嚦灝戜負MAX_PATH 榪欎釜甯告暟閭d箞澶э紝鍚﹀垯閬囧埌鐗瑰埆闀跨殑鏂囦歡鍚嶄細婧㈠嚭銆俵pszTitle 鏁版嵁瀵硅薄鎸囧悜涓涓互null緇撳熬鐨勫瓧絎︿覆錛屽瓧絎︿覆浣滀負瀵硅瘽妗嗙殑鏍囬鏉ユ樉紺恒傛敞鎰忔爣棰樹笉瑕佸お闀匡紝鍚﹀垯鏄劇ず鏃朵細琚埅鏂倁lFlags 鏍囧織鏁版嵁瀵硅薄鐢ㄦ潵闄愬埗鍦ㄥ璇濇涓樉紺虹殑鏂囦歡澶圭被鍨嬨傚彲浠ヨ瀹氬畠涓?鎴栦笅鍒楀肩殑緇勫悎錛?br>
//鍦ㄥ璇濇涓細鍖呭惈涓涓姸鎬佸尯錛屽洖璋冨嚱鏁板彲浠ラ氳繃鍚戝璇濇鍙戦佹秷鎭潵璁懼畾鐘舵?br>
BIF_STATUSTEXT
//鍙厑璁擱夋嫨鏍囧噯鏂囦歡緋葷粺錛岃嫢閫変簡闈炴爣鍑嗙殑鏂囦歡澶瑰鎵撳嵃鏈猴紝紜鎸夐挳浼氬彉鐏?br>
BIF_RETURNONLYFSDIRS = $0001;
//涓嶉夋嫨緗戠粶鏂囦歡澶?br>
BIF_DONTGOBELOWDOMAIN = $0002;
// 緇欑姸鎬佹潯鐣欏嚭絀虹櫧
BIF_STATUSTEXT = $0004;
// 鍙夋嫨鏂囦歡緋葷粺鐨勪笂綰х洰褰?br>
BIF_RETURNFSANCESTORS = $0008;
//鍙夋嫨璁$畻鏈?br>
BIF_BROWSEFORCOMPUTER = $1000;
//鍙夋嫨鎵撳嵃鏈?br>
BIF_BROWSEFORPRINTER = $2000;
//鍖呮嫭鏂囦歡涔熷彲浠ラ?br>
BIF_BROWSEINCLUDEFILES = $4000;
娉ㄦ剰錛氬鏋滀綘鎯沖璇濇鏄劇ずlpszTitle閲岀殑鐢ㄦ埛瀹氬埗鐨勭姸鎬佹潯淇℃伅錛屽繀欏誨寘鎷?BIF_STATUSTEXT鏍囪瘑銆侺pfn鏁版嵁瀵硅薄鏄竴涓洖璋冨嚱鏁扮被鍨嬬殑鎸囬拡錛屽嚱鏁扮被鍨嬪涓嬶細
TFNBFFCallBack = function(DialogHandle: HWND;
MessageID: UINT; PIDL: PItemIDList; Data: LPARAM):Integer; stdcall;
榪欐槸涓涓洖璋冨嚱鏁幫紝鍙互鐢ㄦ潵鍦ㄥ悓鐢ㄦ埛浜や簰鏃舵帶鍒跺拰鏇存柊瀵硅瘽妗嗙殑鏄劇ず銆傚鏋滀綘涓嶆兂鎺у埗瀵硅瘽妗嗭紝鍙互鎶婂畠璁炬垚nil錛宭Param 鏁版嵁瀵硅薄鍏佽浣犲湪鍥炶皟鍑芥暟涓互鍙傛暟lpfn褰㈠紡榪斿洖涓涓寚閽堬紙閫氬父鎴戜滑鐢ㄥ畠鏉ヨ繑鍥炲璞★級錛屽綋鐒朵篃鍙互鎶婂畠璁炬垚涓?銆侷Image鏁版嵁鎴愬憳涓嶉渶瑕佽緗紝鍥犱負瀹冩槸鐢ㄦ潵鎺ユ敹緋葷粺涓悓鏂囦歡澶圭浉鍏崇殑鍥炬爣鍒楄〃绱㈠紩鐨勶紝鎴戜滑榪欓噷璁懼畠涓?銆?br>
SHBrowseForFolder鍑芥暟榪斿洖涓涓敮涓鐨勬寚鍚戣閫夋嫨鐨勬枃浠跺す鐨凱IDL銆傚鏋滄枃浠跺す鏄竴涓紶緇熺殑鏂囦歡瀵硅薄鐨勮瘽錛屽彲浠ョ敤鍑芥暟SHGetPathFromIDList鎶奝IDL杞崲涓虹湡瀹炵殑鐩綍銆傚悓鏃訛紝浣滀負璋冪敤鑰咃紝蹇呴』璐熻矗閲婃斁琚繑鍥炵殑item identifier list錛屼嬌鐢↖Malloc COM 鎺ュ彛鏉ラ噴鏀俱?br>
娉ㄦ剰錛氫笉瑕佺敤FreeMem鎴栧叾浠栨柟娉曟潵閲婃斁 PIDL 錛岃繖鏄洜涓哄澹崇殑鍐呭瓨綆$悊鏄嫭绔嬬殑錛屽彧鑳界敤IMalloc鏉ラ噴鏀俱?br>
鐜板湪鎴戜滑宸茬粡鍙互鏄劇ず瀵硅瘽妗嗕簡錛岄偅璁╂垜浠洿娣卞叆涓姝ョ湅鐪嬪浣曡兘澶熸帶鍒跺鐢ㄦ埛鍔ㄤ綔鐨勫弽搴旓紝榪欏氨瑕佺敤鍒頒簡鍥炶皟鍑芥暟 TFNBFFCallBack銆?娉ㄦ剰鍥炶皟鍑芥暟鐨勬剰鎬濆氨鏄紝浣犲彧鏄疄鐜頒簡瀹冿紝緋葷粺灝辯煡閬撲粈涔堟椂鍊欏幓璋冪敤瀹冿紝灝卞ソ姣斾竴涓畧鏍緟鍏旂殑渚嬪瓙銆?br>
DialogHandle鍙傛暟浠h〃瀵硅瘽妗嗙獥鍙e彞鏌勩傞氬父鍙互鐢ㄨ繖涓彞鏌勭粰瀵硅瘽妗嗗彂娑堟伅錛孧essageID 鍙傛暟騫朵笉鏄竴涓猅Message 緇撴瀯鐨勮褰曪紝瀹冩槸瀵硅瘽妗嗛氳繃鍥炶皟鍑芥暟鍙戠粰鐢ㄦ埛娑堟伅鐨勶紝瀹冨彲浠ユ槸涓嬮潰涓や釜鍊鹼細
BFFM_INITIALIZED = 1; // 瀵硅瘽妗嗗皢瑕佹樉紺?br>
BFFM_SELCHANGED = 2; // 鐢ㄦ埛閫変腑浜嗘煇欏?
PIDL鍙傛暟鍖呭惈鍏朵粬鐨勯澶栦俊鎭傚鏋淢essageID 鏄?BFFM_INITIALIZED錛孭IDL灝嗙瓑浜巒il銆傚鏋淢essageID鏄疊FFM_SELCHANGED錛孭IDL鐨勫煎皢鏄竴涓狿IDL 瀵瑰簲浜庣敤鎴烽夋嫨鐨勬枃浠跺す銆侱ata 鍙傛暟鍖呭惈鐢ㄦ埛浠樼粰TbrowseInfo璁板綍涓殑Lparam鏁版嵁鎴愬憳鐨勫鹼紝閫氬父鍙互浼犻掍竴涓璞℃寚閽堛備笅闈㈡槸涓涓畝鍗曠殑鍥炶皟鍑芥暟鐨勪緥瀛愶細
function BrowseForFolderCallback(DialogHandle: HWND;
MessageID: UINT; PIDL: PItemIDList; Data: LPARAM):
Integer;
begin
//鍝嶅簲瀵硅瘽妗嗙殑閫氱煡娑堟伅
case (MessageID) of
BFFM_INITIALIZED:
DialogInitialized(DialogHandle, Data);
BFFM_SELCHANGED:
HandleNewSelection(DialogHandle, PIDL, Data);
end;
Result := 0; // 鎬昏繑鍥?.
end;
鍦ㄥ洖璋冨嚱鏁伴噷錛屽彲浠ユ牴鎹敤鎴風殑杈撳叆鍙戦佷笁涓敤鎴風殑娑堟伅緇欏璇濇錛屼笅闈㈡槸娑堟伅ID:
// 鏀瑰彉瀵硅瘽妗嗙殑鐘舵佷俊鎭?br>
BFFM_SETSTATUSTEXT = WM_USER + 100;
//鎺у埗紜畾鎸夐挳澶辨晥涓庡惁
BFFM_ENABLEOK = WM_USER + 101;
//鏀瑰彉閫夋嫨鐨勬枃浠跺す
BFFM_SETSELECTION = WM_USER + 102;
閫氬父錛岃繖浜涙秷鎭彂閫佺粰瀵硅瘽妗嗕嬌涔嬫牴鎹敤鎴風殑閫夋嫨鏇存柊鏄劇ず錛屽綋鐒朵綘涔熷彲浠ュ彂閫佸叾浠栫殑娑堟伅緇欏璇濇錛屾瘮濡傚彲浠ュ彂閫乄M_SETTEXT娑堟伅鏉ユ敼鍙樺璇濇鐨勬爣棰樸?br>
涓嬮潰鏄竴涓彂閫佹秷鎭殑渚嬪瓙錛堣琛?.11錛夛細
PostMessage(DialogHandle, BFFM_SETSELECTION, True, LPARAM(PChar (NewPath)));
琛?.11
Message ID
WParam
LParam
BFFM_SETSTATUSTEXT
娌℃湁浣跨敤
涓涓寚鍚戞柊鐨勭姸鎬佷俊鎭殑Pchar
BFFM_ENABLEOK
娌℃湁浣跨敤
True浣垮緱紜鎸夐挳鏈夋晥錛孎alse鏃犳晥
BFFM_SETSELECTION
濡傛灉Lparam鏄礬寰勫垯涓篢rue錛岃嫢Lparam鏄疨IDL鍒欎負False
鎸囧悜琚夋嫨鐨勬枃浠惰礬寰勬垨PIDL鐨凱char
鍙﹀瑕佹彁鍒扮殑鏄紝Delphi涔熸彁渚涗簡瀵硅繖涓嚱鏁扮殑灝佽錛岄偅灝辨槸SelectDirectory鍑芥暟銆?br>
鍏充簬瀵硅瘽妗?/strong>
閫氬父鎴戜滑閮借鍦ㄨ嚜宸辯殑紼嬪簭閲屽姞涓婁竴涓叧浜庡璇濇鏉ユ樉紺轟竴浜涚増鏈俊鎭瓑絳夛紝Windows涓烘垜浠彁渚涗簡涓涓爣鍑嗙殑瀵硅瘽妗嗗鍥?.24鎵紺猴紝鍙互鍦ㄤ竴瀹氳寖鍥村唴瀵瑰畠瀹氬埗錛屼笉榪囧畠鍙傚悎鏄劇ず綆鍗曠殑鏍囪瘑鍜屾枃鏈紙鎴戣寰楃敤澶勬瀬灝忥級銆傛垜浠彲浠ラ氳繃鍑芥暟ShellAbout鏉ヨ皟鐢ㄥ畠錛堝0鏄庡湪ShellAPI鍗曞厓閲岋級錛屽嚱鏁板畾涔夊涓?
function ShellAbout(Owner: HWND; ApplicationName: PChar;
OtherText: PChar; IconHandle: HICON): Integer; stdcall;
Owner鍙傛暟鏍囪瘑浜嗘嫢鏈夊璇濇鐨勭埗紿椾綋鍙ユ焺錛岄氬父璁句負0錛岃〃鏄庢病鏈夌埗紿椾綋銆侫pplicationName 鍙傛暟鍖呭惈瀵硅瘽妗嗙殑鏍囬錛屽瓧絎︿覆涓彲浠ュ寘鍚?#8220;#”瀛楃錛屽畠鑳借搗鍒板垎鍓茬鐨勪綔鐢ㄣ傝繖縐嶆儏鍐典笅錛屽嚱鏁頒細鎶婂垎鍓茬鍓嶇殑瀛楃涓蹭綔涓烘爣棰樻爮錛屽垎鍓茬鍚庣殑閮ㄥ垎浣滀負 "Microsoft"瀛楃涓插悗鐨勭涓琛屻侽therText鍙傛暟鍖呭惈浜嗘墦綆楁樉紺哄湪Microsoft 鐗堟湰鍜岀増鏉冧俊鎭悗鐨勫瓧絎︿覆銆侷conHandle 鍙傛暟鏍囪瘑浜嗘墦綆楁樉紺哄湪瀵硅瘽妗嗕笂鐨勫浘鏍囨爣璇嗭紝濡傛灉璁句負0錛屽嚱鏁頒細鏄劇ずWindows緙虹渷鐨勫浘鏍囥?br>
鍥?.24
鍥?.25
鏍煎紡鍖栧璇濇
SHFormatDrive鍑芥暟浼氭樉紺轟竴涓牸寮忓寲瀵硅瘽妗嗭紝濡傚浘2.25鎵紺猴紝瀹冩槸涓涓崐鍏紑鐨勫嚱鏁般備絾鐜板湪瀹冧笉鍦ㄥ井杞殑SDK閲屻傜劧鑰屽井杞壙璁ゅ畠鐨勫瓨鍦ㄥ茍鎶婂畠浠嶴hell32.dll閲岀敤鍚嶅瓧鍏紑澹版槑錛孌elphi涓殑鍑芥暟瀹氫箟濡備笅錛?br>
function SHFormatDrive(Owner: HWND; Drive: UINT;
FormatID: UINT; OptionFlags: UINT): DWORD; stdcall;
Owner鍙傛暟鏍囪瘑鎷ユ湁瀵硅瘽妗嗙殑紿椾綋鍙ユ焺錛屾枃妗d腑鎺ㄨ崘涓嶈璁句負0錛屼絾瀹為檯涓婂ソ鍍忔病浠涔堝獎鍝嶃侱rive鍙傛暟鏄敤鏉ユ爣璇嗘墦綆楁牸寮忓寲鐨勯┍鍔ㄥ櫒鐨勬暟鍊鹼紝瀹冩槸浠?涓哄簳鐨勶紝浠嶢寮濮?A:=0,B:=1渚濇綾繪帹銆侳ormatID 鍙傛暟鍏佽鎴戜滑鎸囧畾涓涓牸寮忓寲鐨勬ā鏉匡紝閫氬父鎯呭喌涓嬶紝鍙璧嬪間負SHFMT_ID_DEFAULT灝卞彲浠ヤ簡銆侽ptionFlags 鍙傛暟鏄竴涓夐」鎺╃爜錛屾潵紜畾鏍煎紡鍖栫殑閫夐」銆傚綋鍓嶆湁涓や釜閫夐」錛?br>
SHFMT_OPT_FULL = $0001; // 蹇熸牸寮忓寲
SHFMT_OPT_SYSONLY = $0002; // 澶嶅埗緋葷粺鏂囦歡
濡傛灉鍑芥暟璋冪敤澶辮觸錛屼細榪斿洖涓嬪垪閿欒涓殑涓縐嶆潵琛ㄦ槑閿欒鍘熷洜錛岄敊璇父鏁板涓嬶細
SHFMT_NOFORMAT = $FFFFFFFD; // 椹卞姩鍣ㄦ棤娉曟牸寮忓寲
SHFMT_CANCEL = $FFFFFFFE; //鏍煎紡鍖栬鍙栨秷浜?br>
SHFMT_ERROR = $FFFFFFFF; //鍏朵粬閿欒
Windows NT 鍜?WideChar
鍦ㄨ繘涓姝ョ爺絀舵湭鍏紑鐨勫嚱鏁板墠, 鎴戜滑蹇呴』娓呮涓鐐癸紝瀵逛簬鏈叕寮鐨勫嚱鏁版潵璇翠互null緇撳熬鐨勫瓧絎︿覆綾誨瀷鍙傛暟澶у鏁拌澹版槑涓虹被鍨嬫寚閽堣屼笉鏄疨Char銆傝繖鏈夌偣鍍忛櫡闃憋紝浣嗗繀欏繪壙璁よ繖鏄簨瀹炪傚湪Win 9X涓婃墍鏈夌殑瀛楃涓茬被鍨嬪弬鏁板0鏄庝負PAnsiChar錛岃屽湪Windows NT涓婅澹版槑涓篜WideChar銆傚鏋滀綘鎯充綘鐨勫簲鐢ㄧ▼搴忛傚簲鎵鏈夊鉤鍙幫紝浣犲繀欏昏冭檻涓ょ鎯呭喌錛屽湪榪愯鏃惰鍒ゆ柇騫沖彴綾誨瀷錛岃繖鏄緢璁ㄥ帉鐨勶紝浣嗚繖涔熸槸浣跨敤鏈叕寮鐨凙PI鐨勪唬浠楓?br>
閫夋嫨鍥炬爣瀵硅瘽妗?/strong>
鍥?.26
鎴戜滑瑕佽璁虹殑絎竴涓畬鍏ㄦ湭鍏紑鐨勫嚱鏁版槸PickIconDlg銆傚鍥?.26鎵紺鴻繖涓嚱鏁頒細鏄劇ず涓涓璇濇錛岀敤鎴峰彲浠ョ敤鏉ヤ粠鏂囦歡涓夋嫨涓涓浘鏍囪祫婧愩傚畠閫氬父鏄敤鏂囦歡綾誨瀷緙栬緫鍣ㄦ潵鍏寵仈鍥炬爣鍜屾煇涓鏂囦歡綾誨瀷鐨勶紝涔熶細鍦ㄥ揩鎹鋒柟寮忓璇濇涓璋冪敤鏉ヤ慨鏀瑰揩鎹鋒柟寮忕殑鍥炬爣銆傝繖涓嚱鏁頒粠Shell32.dll 鐢ㄥ?2鏉ュ叕寮鍑烘潵錛屽嚱鏁板畾涔夊涓嬶細
function PickIconDlg(Owner: HWND; FileName: Pointer;
MaxFileNameChars: DWORD; var IconIndex: DWORD):LongBool; stdcall;
Owner鍙傛暟鍜屼笂闈㈢殑鎰忎箟綾諱技銆侳ileName 鍙傛暟鎸囧悜涓涓紦鍐插尯錛屽寘鍚簡琚祻瑙堝浘鏍囩殑鏂囦歡鍚嶏紝緙撳啿鍖鴻涓嶅皬浜嶮AX_PATH錛?銆侻axFileNameChars 鎸囧畾瀛楃鏁伴噺澶у皬銆侷conIndex 甯告暟鏄互0涓哄簳鐨勫浘鏍囩儲寮曪紝褰撳璇濇鎵撳紑鏃朵細鎶婄劍鐐瑰畾鍦↖conIndex瀵瑰簲鐨勫浘鏍囦笂錛屽嚱鏁拌繑鍥炲悗錛孖conIndex鎸囧悜鏈鍚庤閫夌殑鍥炬爣绱㈠紩銆傚鏋滅敤鎴風偣浜嗗彇娑堟寜閽紝鍑芥暟榪斿洖False銆?br>
榪愯紼嬪簭瀵硅瘽妗?/strong>
鍥?.27
RunFileDlg鍑芥暟鏄浉褰撶伒媧葷殑錛屽鍥?.27鎵紺哄氨鏄皟鐢ㄥ紑濮嬭彍鍗曠殑榪愯瀛愯彍鍗曞悗浼氭樉紺虹殑瀵硅瘽妗嗭紝鎴戜滑閫氳繃鍊?1鎶婂畠浠嶴hell32.dll鏆撮湶鍑烘潵銆備笅闈㈡槸鍑芥暟澹版槑錛?br>
procedure RunFileDlg(Owner: HWND; IconHandle: HICON;
WorkPath: Pointer; Caption: Pointer; Description: Pointer; Flags: UINT); stdcall;
Owner鍙傛暟灝變笉鐢ㄥ啀璇翠簡銆侷conHandle鍙傛暟鏄樉紺哄湪瀵硅瘽妗嗕笂鐨勫浘鏍囧彞鏌勶紝濡傛灉涓簄il錛岀己鐪佺殑icon灝嗕細浣跨敤銆俉orkPath 鍙傛暟鎸囧悜涓涓瓧絎︿覆鏉ユ寚瀹氬簲鐢ㄧ▼搴忚繍琛岀殑宸ヤ綔璺緞銆?Title 鍙傛暟鎸囧悜浣滀負瀵硅瘽妗嗘爣棰樼殑瀛楃涓詫紝濡傛灉涓簄il錛屽氨浣跨敤緙虹渷鐨勬爣棰樸侱escription 鍙傛暟鎸囧悜涓涓弿榪板瓧絎︿覆錛屼富瑕佹槸鍛婅瘔鐢ㄦ埛濡備綍鍘誨仛錛屽彲浠ヨ涓簄il錛岃繖鏃朵嬌鐢ㄧ己鐪佺殑鎻忚堪銆?Flags鍙傛暟鐢ㄤ竴緇勪綅鎺╃爜鏉ヨ瀹氬璇濇鐨勫睘鎬с備笅闈㈡槸瀹氫箟錛?br>
RFF_NOBROWSE = $01; // 縐誨幓嫻忚鎸夐挳
RFF_NODEFAULT = $02; // 鏃犵己鐪佺殑閫夐」
RFF_CALCDIRECTORY = $04; // 鐢辨枃浠跺悕紜畾宸ヤ綔璺緞
RFF_NOLABEL = $08; // 鍘繪帀緙栬緫妗嗘爣絳?br>
RFF_NOSEPARATEMEM = $20; // 鍘繪帀鍦ㄥ崟鐙殑鍐呭瓨絀洪棿榪愯鐨勫閫夋 (鍙NT鏈夋晥)
榪欎釜瀵硅瘽妗嗕竴涓緢濂界殑鐗規ф槸鍏佽浣犳帶鍒剁敤鎴峰彲浠ヨ繍琛岀殑搴旂敤紼嬪簭銆傚綋鐢ㄦ埛閫夋嫨浜嗙‘璁ゆ寜閽紝瀵硅瘽妗嗙殑鐖剁獥浣撲細鍙戦佷竴涓氱煡娑堟伅鏉ヤ紶閫掑皢瑕佽繍琛岀殑紼嬪簭淇℃伅銆傞氱煡娑堟伅鏄竴涓?WM_NOTIFY娑堟伅錛屽畠鐨勯氱煡浠g爜璁懼畾涓篟FN_VALIDATE (-510)錛岀劧鍚巐Param鎸囧悜涓涓?TNM_RunFileDlg璁板綍銆傚畾涔夊涓嬶細
TNM_RunFileDlg = packed record
hdr: TNMHdr;
lpFile: Pointer;
lpDirectory: Pointer;
nShow: LongBool;
end;
hdr鏁版嵁瀵硅薄鏄疶NMHdr綾誨瀷錛屽畠鏄竴縐嶆爣鍑嗙殑Windows鏁版嵁綾誨瀷錛屾瘡涓猈M_NOTIFY娑堟伅鐨刲Param鍙傛暟閮戒細鎸囧悜榪欎釜鏁版嵁鎴愬垎銆傚悓鏃舵牴鎹笉鍚岀殑娑堟伅綾誨瀷錛屽彲鑳戒竴浜涢澶栫殑鏁版嵁璺熷湪璁板綍鍚庨潰錛屾爣鍑嗙殑TNMHdr璁板綍瀹氫箟濡備笅錛?br>
TNMHdr = packed record
hwndFrom: HWND;
idFrom: UINT;
code: UINT;
end;
璁板綍涓殑hwndFrom鍖呭惈鍙戦佹秷鎭殑紿楀彛鍙ユ焺錛宨dFrom鍒欏寘鍚彂閫佹秷鎭殑鎺т歡鏍囩ず絎︼紝code 涓寘鍚爣璇嗚鍙戦佺殑娑堟伅鐨勯氱煡浠g爜銆?br>
鍦═NMHdr璁板綍鍚庤鎵撳寘鐨勯澶栨暟鎹寘鍚笁涓暟鎹垚鍒嗭細LpFile鎸囧悜涓涓寘鍚皢瑕佽繍琛岀殑鏂囦歡鐨勮礬寰勫瓧絎︿覆錛汱pDirectory鎸囧悜姝e湪榪愯紼嬪簭鐨勫伐浣滅洰褰曞瓧絎︿覆錛涙渶鍚庯紝nShow 鐢ㄦ潵鎸囧畾灝嗚榪愯鐨勫簲鐢ㄧ▼搴忔槸鍚﹀彲瑙併?br>
瀵逛簬鏈枃涓壒瀹氱殑娑堟伅錛屽彧瀵筎NMHdr璁板綍涓殑Code鎰熷叴瓚o紝閫氳繃媯楠孋ode鍙互紜繚鎴戜滑鏀跺埌涓涓繍琛屾枃浠舵牎楠屾秷鎭紝鍚屾椂浣挎垜浠彲浠ュ瓨鍙栭澶栫殑TNM_RunFileDlg鏁版嵁鎴愬憳銆傚綋TNMHdr璁板綍涓殑code絳変簬RFN_VALIDATE(-510)鏃訛紝鍙互鑾峰緱涓涓猅NM_RunFileDlg璁板綍銆備笅闈㈡槸鏍¢獙娑堟伅鐨勪唬鐮侊細
var
FileToRun: String;
...
if TheMessage.Msg = WM_NOTIFY then
if PNMHdr(TheMessage.LParam).code = RFN_VALIDATE then
WideCharToStrVar(PNM_RUNFILEDLG(
TheMessage.LParam).lpFile, FileToRun);
...
娉ㄦ剰鍙湁褰撴垜浠凡緇忔楠孴NMHdr鐨凜ode涓篟FN_VALIDATE鍚庯紝鎵嶆槧灝凩Param 鍙傛暟涓篜NM_RunFileDlg綾誨瀷銆?br>
閫氱煡娑堟伅鐨勮繑鍥炲煎喅瀹氫簡搴旂敤紼嬪簭鏄惁鑳藉榪愯錛屼笅闈㈡槸鍙兘鐨勫鹼細
RF_OK = $00; //鍏佽紼嬪簭榪愯
RF_CANCEL = $01; //鍙栨秷鎿嶄綔錛屽叧闂璇濇
RF_RETRY = $02; //鍙栨秷鎿嶄綔錛屽璇濇浠嶇劧鎵撳紑
鏌ユ壘鏂囦歡瀵硅瘽妗?/strong>
鍥?.28
璋冪敤鏌ユ壘鏂囦歡瀵硅瘽妗嗙殑鍑芥暟鏄疭HFindFiles錛屽璇濇濡傚浘2.28鎵紺恒傚畠鏄粠Shell32.dll鎸夌儲寮曞?0鍏紑鍑烘潵鐨?
function SHFindFiles(SearchRoot: PItemIDList;
SavedSearchFile: PItemIDList): LongBool; stdcall;
SearchRoot 鍙傛暟鍏佽浠庝竴涓壒瀹氱殑鏂囦歡澶瑰紑濮嬫煡鎵撅紝鍚屽湪璧勬簮綆$悊鍣ㄤ腑鍦ㄦ枃浠跺す涓婄敤鍙抽敭鐐瑰嚮鏌ユ壘鑿滃崟鐨勬晥鏋滄槸涓鏍風殑銆傚鏋滆涓簄il錛岄偅涔堟煡鎵炬槸浠庢闈㈠紑濮嬬殑銆?SavedSearchFile 鍙傛暟璁╀綘鎸囧畾涓涓互鍓嶆煡璇繚瀛樼殑鏌ユ壘絳栫暐鏂囦歡錛?.fnd鏂囦歡錛夛紝鏍規嵁浠ュ墠鐨勮瀹氭潵鏌ユ壘錛岃嫢涓嶉渶瑕佺殑璇濆彲浠ヨ瀹氫負nil銆傚鏋滀綘鎸囧畾浜嗕竴涓潪絀哄肩殑SearchRoot PIDL錛岄偅涔堝湪璋冪敤瀹孲HFindFiles鍚庡繀欏昏礋璐i噴鏀炬帀銆備絾鏄湁鐐瑰鎬殑鏄紝濡傛灉浣犳寚瀹氫簡涓涓潪絀虹殑SavedSearchFile PIDL鍙傛暟錛屽嚱鏁版垚鍔熻皟鐢ㄧ殑璇濓紝浣犱笉鑳藉幓閲婃斁榪欎釜 PIDL錛屽惁鍒欎細鍑洪敊錛屼絾濡傛灉璋冪敤澶辮觸浜嗙殑璇濓紝浣犲繀欏婚噴鏀懼畠銆?br>
鍚屽ぇ澶氭暟瀵硅瘽妗嗗嚱鏁頒笉涓鏍鳳紝榪欎釜鍑芥暟鏄潪妯℃佺殑錛屼篃灝辨槸緋葷粺鍦ㄥ彟澶栦竴涓嫭绔嬬殑綰跨▼涓惎鍔ㄥ璇濇錛岀劧鍚庣珛鍗寵繑鍥烇紝瀵硅瘽妗嗕細鍦ㄤ綘鐨勭▼搴忕粨鏉熷悗鑷姩鍏抽棴銆備篃灝辨槸璇翠綘娌℃湁浠諱綍鐩存帴鐨勬柟娉曟潵鍛婅瘔鐢ㄦ埛濡備綍浣跨敤鏌ユ壘鍒扮殑緇撴灉錛屾墍浠ヨ鎯崇煡閬撶敤鎴鋒壘鍒扮殑鏂囦歡鐨勮瘽錛屾渶濂芥槸璁╀綘鐨勭▼搴忔敮鎸佹枃浠舵嫋鏀撅紝浠ヤ究璁╃敤鎴鋒妸鎵懼埌鐨勬枃浠舵嫋鏀劇粰浣犮?br>
鏌ユ壘鐢佃剳瀵硅瘽妗?/strong>
鍚孲HFindFiles姣旇緝鎺ヨ繎鐨勪竴涓嚱鏁版槸SHFindComputer錛岃繖涓嚱鏁拌皟鐢ㄧ殑緇撴灉鍚屽紑濮嬭彍鍗曚笂鏌ユ壘鐢佃剳鑿滃崟璋冪敤鐨勭粨鏋滄槸涓鏍風殑銆傚畠鐨勫弬鏁板悓SHFindFiles瀹屽叏涓鏍鳳紝涓嶅悓涔嬪鍦ㄤ簬瀹冨畬鍏ㄥ拷鐣ヤ紶閫掔粰瀹冪殑鍙傛暟錛屽緢鏄劇劧鏄繚鐣欒搗鏉ヤ負浜嗗皢鏉ユ墿灞曠殑闇瑕併傝繖閲屾垜浠彧瑕佹妸鍙傛暟閮借鎴恘il灝卞彲浠ヤ簡錛屽彟澶栨敞鎰忚繖涓璇濇涔熸槸闈炴ā鎬佺殑銆?SHFindComputer 鏄粠Shell32.dll 浠ョ儲寮曞彿91鍏紑鍑烘潵鐨勶細
function SHFindComputer(Reserved1: PItemIDList;
Reserved2: PItemIDList): LongBool; stdcall;
鏌ユ壘鏂囦歡瀵硅瘽妗?/strong>
閫氳繃璋冪敤GetFileNameFromBrowse鍑芥暟鍙互璋冨嚭榪欎釜瀵硅瘽妗嗭紝涓嶈繃璇村疄鍦ㄧ殑錛屽畠瀹為檯涓婂彧鏄疓etOpenFileName 鍑芥暟鐨勭畝鍗曞皝瑁呫傝屾垜浠父鐢ㄧ殑TOpenDialog鎺т歡涔熸槸瀵笹etOpenFileName 鍑芥暟灝佽錛岃繖涓嚱鏁版垜浠緢灝戜細鍘葷洿鎺ョ敤瀹冦備笉榪囪繕鏄啓鍑烘潵鍚э紝瀹冩槸浠嶴hell32.dll閲屾寜绱㈠紩鍊?3鍏紑鍑烘潵鐨勶細
function GetFileNameFromBrowse(Owner: HWND;
FileName: Pointer; MaxFileNameChars: DWORD;
InitialDirectory: Pointer; DefaultExtension: Pointer;
Filter: Pointer; Caption: Pointer): LongBool; stdcall; 
鍥?.29
澶у鏁板弬鏁板搴斾簬OPENFILENAME 緇撴瀯鐨勬垚鍛樸侽wner鍙傛暟鎴戞兂灝變笉鐢ㄥ啀閲嶅浜嗭紝 FileName 鍙傛暟鎸囧悜涓涓垵濮嬪寲瀵硅瘽妗嗙紪杈戞帶鍒舵枃浠跺悕鐨勭紦鍐插尯錛屽嚱鏁拌繑鍥炲悗FileName鍖呭惈琚夋嫨鐨勬枃浠惰礬寰勶紝瀹冪殑澶у皬涓鑸鎴怣AX_PATH錛?閭d箞澶с侻axFileNameChars 鍙傛暟鐢ㄦ潵鎸囧畾FileName緙撳啿鍖虹殑澶у皬銆?InitialDirectory鍙傛暟鎸囧悜瀵硅瘽妗嗗垵濮嬪寲鐨勭洰褰曞悕錛屼絾濡傛灉FileName鍙傛暟琚寚瀹氫簡錛孖nitialDirectory灝變細琚拷鐣ヨ屼嬌鐢‵ileName鍙傛暟涓殑璺緞銆侱efaultExtension鍙傛暟鎸囧悜涓涓寘鍚鎼滅儲鐨勭己鐪佹墿灞曞悕鐨勫瓧絎︿覆銆侳ilter鍙傛暟鎸囧悜涓涓互null緇撳熬鐨勫彲浠ョ敤鏉ュ湪涓嬫媺鍒楄〃涓檺瀹氭枃浠剁被鍨嬬殑榪囨護瀛楃涓層侰aption鍙傛暟鎸囧悜瀵硅瘽妗嗘爣棰樺瓧絎︿覆銆?br>
濡傛灉鐢ㄦ埛閫夋嫨浜嗕竴涓鎵撳紑鐨勬枃浠訛紝鍑芥暟榪斿洖True錛屽綋鏈夐敊璇彂鐢燂紝鐢ㄦ埛閫夋嫨鍙栨秷鎸夐挳鎴栧叧闂璇濇鐨勮瘽浼氳繑鍥濬alse銆?br>
澶栧3瀵硅薄灞炴у璇濇
鍙︿竴涓湭鍏紑鐨勫璇濇鍑芥暟鏄疭HObjectProperties錛屽畠鍙互鐢ㄦ潵鏄劇ず澶栧3瀵硅薄鐨勫睘鎬э紝姣斿椹卞姩鍣ㄣ佹枃浠跺す鎴栨枃浠剁瓑錛岃繍琛屾晥鏋滃鍥?.29鎵紺恒傚嚱鏁板彲浠ヤ粠Shell32.dll涓寜绱㈠紩鍊?78鍏紑鍑烘潵錛屽畾涔夊涓嬶細
function SHObjectProperties(Owner: HWND; Flags: UINT;
ObjectName: Pointer; InitialTabName: Pointer):LongBool; stdcall;
Flags鍙傛暟鐢ㄦ潵鎸囧畾ObjectName鍙傛暟瀵瑰簲瀵硅薄鐨勭被鍨嬶紝瀹冨彲浠ユ槸涓嬪垪鏍囪瘑錛?br>
//鎵撳嵃鏈?br>
OPF_PRINTERNAME = $01;
//璺緞
OPF_PATHNAME = $02;
ObjectName鍙傛暟鎸囧悜涓涓寘鍚礬寰勫悕鐨勫瓧絎︿覆鎴栨槸瑕佹樉紺哄睘鎬х殑鎵撳嵃鏈哄悕銆傚鏋滄墦鍗版満鏄湰鍦扮殑錛屽彲浠ヤ嬌鐢ㄥ疄闄呯殑鎵撳嵃鏈哄悕錛屽鏋滄槸緗戠粶鎵撳嵃鏈猴紝灝遍渶瑕佷嬌鐢ㄥ畬鏁寸殑UNC鏍峰紡鍚嶇О錛屾瘮濡俓\COMPUTERNAME\PRINTERNAME銆侷nitialTabName鍙傛暟鎸囧悜涓涓睘鎬у璇濇涓〉闈㈠悕縐板瓧絎︿覆錛岀敤鏉ユ寚瀹氳鏄劇ず鐨勭己鐪侀〉闈€傚鏋淚nitialTabName鍙傛暟涓簄il錛屾垨涓嶅尮閰嶄換浣曢〉闈㈢殑鍚嶇О錛岀涓涓睘鎬ч〉闈㈠皢浼氳鏄劇ず銆?br>
濡傛灉鍑芥暟璋冪敤鎴愬姛浼氳繑鍥濼rue錛屽鏋滃け璐ヤ細榪斿洖False銆傝鎯寵幏寰楁墿灞曠殑閿欒淇℃伅錛屽彲浠ヨ皟鐢ˋPI鍑芥暟GetLastError銆傝娉ㄦ剰鐨勬槸榪欎釜瀵硅瘽妗嗘槸闈炴ā鎬佺殑錛岀被浼間簬鏌ユ壘鏂囦歡瀵硅瘽妗嗭紝鎵浠ュ嚱鏁頒竴琚皟鐢紝灝辮偗瀹氫細鏄劇ず涓涓璇濇錛屽悓鏃舵垜浠病鏈夊姙娉曠煡閬撶敤鎴蜂粈涔堟椂鍊欏叧闂簡瀵硅瘽妗嗐?br>
鏄犲皠緗戠粶椹卞姩瀵硅瘽妗?/strong>
鍥?.30
鍥?.30鏄劇ず浜嗘槧灝勭綉緇滈┍鍔ㄥ櫒鐨勫璇濇錛屾垜浠氳繃SHNetConnectionDialog鍑芥暟璋冪敤瀹冿紙win 9x鍜學in NT涓婇兘鏀寔錛夛紝瀹冨彲浠ユ寜绱㈠紩鍊?60浠嶴hell32.dll鏆撮湶鍑烘潵錛屽嚱鏁板畾涔夊涓嬶細
function SHNetConnectionDialog(Owner: HWND;
ResourceName: Pointer; ResourceType: DWORD): DWORD; stdcall;
SHStartNetConnectionDialog鍑芥暟涔熶細鏄劇ず鍚屾牱鐨勫璇濇錛屼絾瀹冩樉紺虹殑瀵硅瘽妗嗘槸闈炴ā鎬佺殑錛屽悓鏃跺彧鍦∟T涓婃墠鏀寔銆傚畠鍙互鎸夌儲寮曞?15浠嶴hell32.dll涓叕寮鍑烘潵錛屽嚱鏁板畾涔夊涓嬶細
function SHStartNetConnectionDialog(Owner: HWND;
ResourceName: PWideChar; ResourceType: DWORD):DWORD; stdcall;
涓婇潰涓や釜鍑芥暟鐨勫弬鏁板畬鍏ㄧ浉鍚屻傚叾涓璕esourceName鍙傛暟鎸囧悜涓涓榪炴帴鐨勭綉緇滆祫婧怳NC璺緞鍚嶃傛寚瀹氫簡榪欎釜鍙傛暟鐨勮瘽錛屾樉紺虹殑瀵硅瘽妗嗕腑琚璁劇殑榪炴帴璧勬簮灝變笉鍙敼鍙樹簡銆傚鏋滆繖涓弬鏁頒負nil錛屽垯鍦ㄥ璇濇涓敤鎴峰彲浠ユ寚瀹氳榪炴帴鐨勮祫婧愩俁esourceType鍙傛暟鍙互鏄笅闈㈢殑鍊間箣涓錛歊ESOURCETYPE_DISK鎴朢ESOURCETYPE_PRINT銆傚畠鐨勪笉鍚屽皢浼氱敓鎴愪笉鍚岀殑瀵硅瘽妗嗐傚弬鏁頒負RESOURCETYPE_DISK鍏佽鎴戜滑涓虹綉緇滈┍鍔ㄨ祫婧愭寚瀹氫竴涓洏絎︼紝鍙︿竴涓弬鏁板厑璁告垜浠槧灝勪竴涓茍琛屽彛鍚嶆瘮濡侺PT2涓轟竴涓綉緇滄墦鍗版満銆傜劧鑰岋紝涓嶇煡閬撲負浠涔圧ESOURCETYPE_PRINT鍙傛暟鍦∟T涓婃棤鏁堛?br>
鍥?.31
濡傛灉鍑芥暟璋冪敤鎴愬姛鐨勮瘽錛岃繑鍥炲兼槸NO_ERROR錛屽鏋滅敤鎴峰彇娑堢殑瀵硅瘽妗嗭紝鍒欒繑鍥?-1($FFFFFFFF)錛屽鏋滆皟鐢ㄥけ璐ュ垯榪斿洖鍏朵粬鐨勯敊璇唬鐮侊紝鍏蜂綋閿欒淇℃伅鍙互鐢℅etLastError API璋冪敤鑾峰緱銆?br>
鍏抽棴緋葷粺瀵硅瘽妗?/strong>
ExitWindowsDialog鍜孯estartDialog鍑芥暟鍙互鐢ㄦ潵鏄劇ず鍏抽棴鍜岄噸鍚郴緇熷璇濇錛堝鍥?.31錛夛紝瀹冧滑鍚屽叕寮鐨凟xitWindowsEx API鍑芥暟娌℃湁浠涔堝お澶х殑涓嶅悓錛屼絾鍦ㄥ叾榪囩▼涓兘浼氫駭鐢熶竴涓璇濇銆侲xitWindowsDialog鍑芥暟鍙互鎸夌儲寮曞?0浠嶴hell32.dll涓叕寮鍑烘潵錛孯estartDialog鍑芥暟鐨勫湪Shell32.dll涓殑绱㈠紩鍊煎垯鏄?9錛屼袱涓嚱鏁扮殑瀹氫箟濡備笅錛?br>
procedure ExitWindowsDialog(Owner: HWND); stdcall;
function RestartDialog(Owner: HWND; Reason: Pointer; ExitType: UINT): DWORD; stdcall;
瀵笶xitWindowsDialog鍑芥暟鏉ヨ錛屽璇濇濂藉儚騫朵笉浣跨敤Owner鍙傛暟浣滀負鐖剁獥鍙o紝鍦╓indows 95涓婏紝褰撴搷浣滄垚鍔熺殑璇漮wner紿楀彛浼氭敹鍒頒竴涓猈M_QUIT娑堟伅銆傚湪Windows NT涓婏紝owner 紿楀彛鏍規湰涓嶈浣跨敤銆傚悓鏃惰繖涓嚱鏁版病鏈夎繑鍥炲鹼紝鎵浠ユ病鏈夊姙娉曠煡閬撶敤鎴烽夋嫨浜嗕粈涔堟搷浣滀互鍙婃搷浣滄槸鍚﹁鍙栨秷浜嗐?br>
RestartDialog鍑芥暟鏇存湁鐢ㄤ竴浜涳紝褰撴垜浠慨鏀逛簡緋葷粺鐨勮緗紝騫跺笇鏈涢噸鏂板惎鍔ㄧ郴緇熶嬌淇敼鐢熸晥鐨勬椂鍊欏彲浠ヤ嬌鐢ㄨ繖涓嚱鏁般俁eason鍙傛暟鎸囧悜涓涓鏄劇ず鍦ㄥ璇濇涓殑瀛楃涓詫紝鐢ㄦ潵瑙i噴鍏抽棴緋葷粺鐨勫師鍥犮侲xitType鍙傛暟鎸囧畾鍏抽棴綾誨瀷錛屽彲浠ヤ嬌鐢‥xitWindowsEX鍑芥暟浣跨敤鍊肩殑涓涓瓙闆嗗強棰濆鐨勫嚑涓柊鍊鹼紝涓嬮潰鏄畠浠殑瀹屽叏鍒楄〃錛?br>
EWX_LOGOFF = $00;
EWX_SHUTDOWN = $01;
EWX_REBOOT = $02;
EW_RESTARTWINDOWS = $42;
EW_REBOOTSYSTEM = $43;
EW_EXITANDEXECAPP = $44;
濡傛灉鐢ㄦ埛閫夋嫨鎵ц鍏抽棴鎿嶄綔錛屽嚱鏁拌繑鍥濱DYES錛屽惁鍒欒繑鍥濱DNO銆?br>
瑕佹敞鎰忕殑鏄樉紺哄湪瀵硅瘽妗嗕腑鐨勫師鍥犲瓧絎︿覆鍚庢諱細璺熺潃涓涓郴緇熺己鐪佹彁渚涚殑瀛楃涓茬敤鏉ユ樉紺虹‘璁や俊鎭紝鎵浠ュ簲璇ュ湪鎴戜滑鐨凴eason瀛楃涓插悗闄勪笂絀烘牸鎴栧洖杞︽崲琛屽瓧絎︺傚彟澶栬繑鍥炲間笉鑳界敤浜庣‘瀹氭搷浣滅殑鎴愬姛鎬э紝瀹冨彧琛ㄦ槑鐢ㄦ埛鐨勯夋嫨錛屽鏋滈噸鍚搷浣滅敱浜庢煇浜涘師鍥犲け璐ヤ簡錛岃繑鍥炲間粛鐒舵槸IDYES銆傚悓鏃惰娉ㄦ剰鐨勬槸瑕佹兂璋冪敤鎴愬姛錛岀敤鎴瘋繕蹇呴』鏈塖E_SHUTDOWN_NAME鏉冮檺錛堝湪NT涓婏級銆?br>
緙哄皯鍐呭瓨瀵硅瘽妗?/strong>
SHOutOfMemoryMessageBox鏄竴涓湭鍏紑鐨勫嚱鏁幫紝褰撶郴緇熷唴瀛樹笉瓚蟲椂鍙互鐢ㄦ潵鏄劇ず鏍囧噯鐨勫澹充俊鎭璇濇錛屽畠鍦⊿hell32.dll涓殑绱㈠紩鍊兼槸126錛屽嚱鏁板畾涔夊涓嬶細
function SHOutOfMemoryMessageBox(Owner: HWND;
Caption: Pointer; Style: UINT): Integer; stdcall;
瀹冧細璋冪敤MessageBox API錛屽悓鏃朵紶閫?涓爣鍑嗙殑鍙傛暟鍜孍RROR_OUTOFMEMORY閿欒娑堟伅銆侰aption鍙傛暟鎸囧悜瀵硅瘽妗嗘爣棰樺瓧絎︿覆銆傚鏋淐aption涓簄il錛岀埗紿楀彛鐨勬爣棰樺氨浼氳浣跨敤銆係tyle鍙傛暟鍙互琚緗負浠繪剰MessageBox鍑芥暟浣跨敤鐨凪B_XXX甯告暟鐨勭粍鍚堬紝閫氬父璁劇疆瀹冧負MB_OK鎴朚B_ICONHAND銆傚嚱鏁拌皟鐢ㄨ繑鍥炲煎弬瑙丼DK涓璏essageBox鍑芥暟璇存槑銆?br>
褰揗essageBox鍑芥暟琚皟鐢ㄦ椂錛孧B_SETFOREGROUND鏍囪瘑浼氳娣誨姞鍒癝tyle鍙傛暟涓紝浣嗗鏋滅涓嬈¤皟鐢ㄥけ璐ヤ簡鐨勮瘽錛孧essageBox鍑芥暟浼氳鍐嶆璋冪敤錛岃繖嬈B_SYSTEMMODAL 鏍囪瘑浼氳娣誨姞鍒癝tyle鍙傛暟涓侻B_SYSTEMMODAL鍚孧B_ICONHAND鏍囪瘑緇撳悎鍚庝細蹇界暐鍐呭瓨鐘跺喌鏉ユ樉紺烘秷鎭璇濇銆傚綋鍐呭瓨紜疄涓嶈凍鏃訛紝鍑芥暟涓嶄細鏄劇ず浠諱綍涓滆タ錛岀劧鑰屽畠浠嶇劧浼氳繑鍥濵essageBox鍑芥暟璋冪敤緇撴灉銆傛墍浠ユ垜浠彲浠ユ牴鎹繑鍥炲煎垽鏂嚱鏁版槸鍚﹁皟鐢ㄦ垚鍔熶簡銆?br>
絀洪棿涓嶈凍瀵硅瘽妗?/strong>
鍥?.32
鍙︿竴涓祫婧愮浉鍏崇殑鍑芥暟鏄疭HHandleDiskFull錛屽畠浼氭樉紺虹鐩樹笉瓚崇殑淇℃伅瀵硅瘽妗嗭紙濡傚浘2.32錛夈傛垜浠彲浠ュ湪鐢變簬娌℃湁瓚沖紓佺洏絀洪棿鏃跺鑷寸▼搴忔棤娉曡繍琛岀殑鏉′歡涓嬭皟鐢ㄨ繖涓嚱鏁幫紝璋冪敤鍚庯紝濡傛灉鍥炴敹绔欎腑鏈変粈涔堜笢瑗挎病鏈夊垹闄ょ殑璇濓紝瀵硅瘽妗嗗厑璁哥敤鎴鋒竻絀哄洖鏀剁珯鏉ラ噴鏀劇鐩樼┖闂淬傚畠鍦⊿hell32.dll涓殑绱㈠紩鍊間負185錛屽嚱鏁扮殑瀹氫箟濡備笅錛?br>
procedure SHHandleDiskFull(Owner: HWND; Drive: UINT); stdcall;
Drive鍙傛暟鐢ㄤ簬鎸囧畾浠?涓哄簳鐨勯┍鍔ㄥ櫒鐩樼銆?浠h〃A:\錛?浠h〃B:\錛屼緷姝ょ被鎺ㄣ傝繖涓嚱鏁扮殑搴旂敤姣旇緝鍥伴毦錛屽洜涓哄綋鍥炴敹绔欎腑娌℃湁浠諱綍涓滆タ鏃跺璇濇涓嶄細鏄劇ず錛屽悓鏃朵篃娌℃湁浠諱綍榪斿洖鍊艱〃紺哄璇濇鏄惁鏄劇ず錛岃繕鏃犳硶鐭ラ亾鐢ㄦ埛鐨勬搷浣滐紝姣斿瀹冩槸鍚︾湡鐨勬竻絀轟簡銆傜湅璧鋒潵姣旇緝鍙鐨勫簲鐢ㄥ彧鑳芥槸紼嬪簭鑷鐩戣紓佺洏鍓╀綑絀洪棿錛屽彧鏄嬌鐢ㄨ繖涓璇濇浣滀負涓涓揩閫熶慨澶嶇殑宸ュ叿銆?br>
涓鑸澹蟲秷鎭璇濇
ShellMessageBox鍑芥暟浠呬粎鏄竴涓MessageBox鍑芥暟鐨勭畝鍗曞皝瑁呭嚱鏁幫紝瀹冨厑璁鎬嬌鐢ㄥ瓧絎︿覆璧勬簮鏍囪瘑絎︽垨鏍囧噯鐨勪互null緇撳熬鐨勫瓧絎︿覆錛屽悓鏃惰繕鍏佽鍔犲叆鏀寔鏍煎紡鍖朏oramtMessage鍑芥暟鐨勬帶鍒剁銆係hellMessageBox鍑芥暟鍦⊿hell32.dll涓殑绱㈠紩鍊間負183錛?br>
function ShellMessageBoxA(Module: THandle; Owner: HWND;
Text: PChar; Caption: PChar; Style: UINT;
Parameters: array of Pointer): Integer; cdecl;
鏇寸‘鍒囧湴璇磋繖涓嚱鏁板簲璇ュ彨ShellMessageBoxA鍥犱負瀹冨彧鏀寔ANSI瀛楃涓詫紝榪樻湁涓涓猆NICODE鐨勭増鏈殑鍑芥暟ShellMessageBoxW錛屽畠鐨勭儲寮曞間負182錛屼絾瀹冨彧鍦╓indows NT涓婃墠鏈夛紝鍑芥暟瀹氫箟濡備笅錛?br>
function ShellMessageBoxW(Module: THandle; Owner: HWND;
Text: PWideChar; Caption: PWideChar; Style: UINT;
Parameters: array of Pointer): Integer; cdecl;
Module鍙傛暟鏄彁渚涘瓧絎︿覆璧勬簮鐨勬ā鍧楀彞鏌勶紝鍙ユ焺鍙互鐢℅etModuleHandle鍑芥暟鑾峰緱銆傞【鍚嶆濅箟Text 鍙傛暟鎸囧悜涓涓鏄劇ず鍦ㄥ璇濇涓殑鏂囨湰錛屽畠涔熷彲浠ユ槸璧勬簮瀛楃涓睮D錛屾枃鏈腑鍙互鍖呮嫭鏍煎紡鎺у埗搴忓垪錛屽畠灝嗕細琚湪Parameters涓彁渚涚殑棰濆瀛楃涓叉浛浠c傛帶鍒剁鏍煎紡涓?#8220;%#”錛屽叾涓?#8220;#”鏄澶栧瓧絎︿覆鍦ㄥ弬鏁頒腑鐨勪綅緗紝姣斿“%1”灝嗚絎竴涓狿arameters鏁扮粍涓殑瀛楃涓插厓绱犳浛浠o紝“%3”灝嗕細琚涓変釜鍏冪礌鏇夸唬錛屼緷姝ょ被鎺ㄣ侰aption鍙傛暟鎸囧悜瀵硅瘽妗嗘爣棰樻枃鏈紝鍚屾牱瀹冧篃鍙互鏄祫婧怚D錛屽鏋滃弬鏁頒負nil錛孫wner鎸囧畾鐨勭獥鍙f爣棰樺皢琚敤浜庡璇濇鏍囬銆係tyle鍙傛暟鏄敱浣嶆帺鐮佹爣璇嗙粍鎴愮殑錛屽彲浠ヨ緗垚MessageBox鍑芥暟鏀寔鐨凪B_XXX甯告暟鐨勭粍鍚堛傝繑鍥炲煎悓MessageBox瀹屽叏涓鏍楓?br>
瀵逛簬榪欎釜鍑芥暟寰堥噸瑕佺殑涓鐐規槸寰蔣鍏徃浣跨敤cdecl鏉ヨ緭鍑鴻繖涓嚱鏁拌屼笉鏄氬父鐨?stdcall銆傛澶栵紝Parameters鍙傛暟浣跨敤浜咰璇█涓殑鍙彉鍙傛暟鍒楄〃錛岃繖鎰忓懗鐫榪欎釜鍑芥暟涓嶆槸璇█鏃犲叧鐨勶紝榪欎嬌寰楄皟鐢ㄨ搗鏉ラ潪甯擱夯鐑︼紝鍥犱負Delphi騫朵笉鐩存帴鏀寔cdecl鍜屽彲鍙樺弬鏁板垪琛ㄣ備負浜嗚В鍐寵繖涓棶棰橈紝Parameters鍙傛暟琚槧灝勪負涓涓姩鎬佹寚閽堝垪琛ㄣ傚悓鏃舵垜浠繕闇瑕佷嬌鐢ㄥ祵鍏ュ紡姹囩紪鏉ュ緩绔媍decl鏍峰紡鐨勫爢鏍堛傜敱浜庡姩鎬佹寚閽堝垪琛ㄧ殑鎬ц川錛屾垜浠繀欏昏嚦灝戞寚瀹氫竴涓寚閽堝箋傚鏋滀笉鎯蟲寚瀹氳鏇夸唬鐨勫瓧絎︿覆錛岀畝鍗曡緗負nil灝卞彲浠ヤ簡銆?/font>
]]>
DWORD fOutxDsrFlow:1; // DSR output flow control
DWORD fDtrControl:2; // DTR flow control type
DWORD fOutX: 1; // XON/XOFF out flow control
DWORD fErrorChar: 1; // enable error replacement
DWORD fNull: 1; // enable null stripping銆銆TRUE鏃訛紝鎺ユ敹鏃跺幓鎺夌┖錛?鍊鹼級瀛楄妭
DWORD fAbortOnError:1; // abort reads/writes on error銆銆TRUE鏃?鏈夐敊璇彂鐢熸椂涓璇誨拰鍐欐搷浣淩TS_CONTROL_DISABLE鏃?RTS緗負OFFRTS_CONTROL_ENABLE鏃? RTS緗負ON
RTS_CONTROL_TOGGLE鏃?褰撴帴鏀剁紦鍐插尯浠嶆湁鍓╀綑瀛楄妭鏃禦TS涓篛N ,鍚﹀垯緙虹渷涓篛FF
DWORD fDummy2:17; // reserved銆銆鏈嬌鐢?/font>
WORD XoffLim; // transmit XOFF threshold
BYTE ByteSize; // number of bits/byte, 4-8銆銆鎸囧畾绔彛褰撳墠浣跨敤鐨勬暟鎹綅
char XonChar; // Tx and Rx XON character銆銆鎸囧畾鐢ㄤ簬鍙戦佸拰鎺ユ敹瀛楃XON鐨勫?/font>
]]>
錛?錛夊彇寰楀涓昏繘紼嬶紙鍗寵娉ㄥ叆鏈ㄩ┈鐨勮繘紼嬶級鐨勮繘紼婭D dwRemoteProcessId錛?br>
錛?錛夊彇寰桪LL鐨勫畬鍏ㄨ礬寰勶紝騫跺皢鍏惰漿鎹負瀹藉瓧絎︽ā寮弍szLibFileName錛?br>
錛?錛夊埄鐢╓indows API OpenProcess鎵撳紑瀹夸富榪涚▼錛屽簲璇ュ紑鍚笅鍒楅夐」錛?br>
a.PROCESS_CREATE_THREAD錛氬厑璁稿湪瀹夸富榪涚▼涓垱寤虹嚎紼嬶紱
b.PROCESS_VM_OPERATION錛氬厑璁稿瀹夸富榪涚▼涓繘琛孷M鎿嶄綔錛?br>
c.PROCESS_VM_WRITE錛氬厑璁稿瀹夸富榪涚▼榪涜VM鍐欍?br>
錛?錛夊埄鐢╓indows API VirtualAllocEx鍑芥暟鍦ㄨ繙紼嬬嚎紼嬬殑VM涓垎閰岲LL瀹屾暣璺緞瀹藉瓧絎︽墍闇鐨勫瓨鍌ㄧ┖闂達紝騫跺埄鐢╓indows API WriteProcessMemory鍑芥暟灝嗗畬鏁磋礬寰勫啓鍏ヨ瀛樺偍絀洪棿錛?/span>
錛?錛夊埄鐢╓indows API GetProcAddress鍙栧緱Kernel32妯″潡涓璍oadLibraryW鍑芥暟鐨勫湴鍧錛岃繖涓嚱鏁板皢浣滀負闅忓悗灝嗗惎鍔ㄧ殑榪滅▼綰跨▼鐨勫叆鍙e嚱鏁幫紱
錛?錛夊埄鐢╓indows API CreateRemoteThread鍚姩榪滅▼綰跨▼錛屽皢LoadLibraryW鐨勫湴鍧浣滀負榪滅▼綰跨▼鐨勫叆鍙e嚱鏁板湴鍧錛屽皢瀹夸富榪涚▼閲岃鍒嗛厤絀洪棿涓瓨鍌ㄧ殑瀹屾暣DLL璺緞浣滀負綰跨▼鍏ュ彛鍑芥暟鐨勫弬鏁頒互鍙﹀叾鍚姩鎸囧畾鐨凞LL錛?/span>
錛?錛夋竻鐞嗙幇鍦恒?/span>
]]>
typedef ULONG (WINAPI *PFNNtUnmapViewOfSection)( IN HANDLE ProcessHandle,IN PVOID BaseAddress );
2
3
BOOL UnmapViewOfModule ( DWORD dwProcessId, LPVOID lpBaseAddr )
4


{
5
HMODULE hModule = GetModuleHandle ( L"ntdll.dll" ) ;
6
if ( hModule == NULL )
7
hModule = LoadLibrary ( L"ntdll.dll" ) ;
8
9
PFNNtUnmapViewOfSection pfnNtUnmapViewOfSection = (PFNNtUnmapViewOfSection)GetProcAddress ( hModule, "NtUnmapViewOfSection" ) ;
10
11
HANDLE hProcess = OpenProcess ( PROCESS_ALL_ACCESS, TRUE, dwProcessId ) ;
12
ULONG ret = pfnNtUnmapViewOfSection ( hProcess, lpBaseAddr ) ;
13
CloseHandle ( hProcess ) ;
14
return ret ? FALSE : TRUE;
15
}
16
17
]]>
榪欑瘒鏂囩珷鏄炕璇慚SDN涓婁竴綃囧彨銆奌eap: Pleasures and Pains銆嬬殑鏂囩珷鐨?
Microsoft Corporation鍓嶈█
浠涔堟槸鍫嗭紵

鍫嗗疄鐜扮殑娉ㄦ剰浜嬮」
浠涔堟槸甯歌鐨勫爢鎬ц兘闂錛?/h2>
灝介噺鍑忓皯鍫嗙殑浣跨敤
struct ObjectA {
// objectA 鐨勬暟鎹?
}
struct ObjectB {
// objectB 鐨勬暟鎹?
}
// 鍚屾椂浣跨敤 objectA 鍜?objectB
//
// 浣跨敤鎸囬拡
//
struct ObjectB {
struct ObjectA * pObjA;
// objectB 鐨勬暟鎹?
}
//
// 浣跨敤宓屽叆
//
struct ObjectB {
struct ObjectA pObjA;
// objectB 鐨勬暟鎹?
}
//
// 闆嗗悎 – 鍦ㄥ彟涓瀵硅薄鍐呬嬌鐢?objectA 鍜?objectB
//
struct ObjectX {
struct ObjectA objA;
struct ObjectB objB;
}
鍏朵粬鎻愰珮鎬ц兘鐨勬妧鏈?/h3>
鎽樿
2008騫?鏈?鏃?wbr>
榪欎釜姒傝堪璁ㄨ浜嗙獥鍙g殑涓浜涚壒鎬э紝濡傜獥鍙g被鍨嬨佺姸鎬併佸ぇ灝忓強浣嶇疆銆?wbr>
1.1灞傚彔紿楀彛錛圤verlappedWindows錛?wbr>
灞傚彔紿楀彛鏄竴涓叿鏈夋爣棰樻爮銆佽竟妗嗗拰瀹㈡埛鍖虹殑欏跺眰紿楀彛錛涗篃灝辨槸璇村畠閫傚悎鍋氫負搴旂敤紼嬪簭涓葷獥鍙c傚畠涔熷彲浠ュ叿鏈変竴涓郴緇熻彍鍗曪紝鏈灝忓拰鏈澶у寲鎸夐挳錛屼互鍙婃粴鍔ㄦ潯銆備竴涓眰鍙犵獥鍙h鍏稿瀷鍦扮敤浜庡寘鍚墍鏈変笂榪扮粍浠剁殑搴旂敤紼嬪簭涓葷獥鍙c?wbr>
閫氳繃鍦–reateWindowEx涓寚瀹歐S_OVERLAPPED鎴栬匴S_OVERLAPPEDWINDOW鏍峰紡錛屼竴涓簲鐢ㄧ▼搴忓氨鑳藉垱寤轟竴涓眰鍙犵獥鍙c傚亣濡備綘浣跨敤絎竴涓牱寮忥紝閭d箞鍒涘緩鐨勭獥鍙e氨鍏鋒湁涓涓爣棰樻爮鍜岃竟妗嗭紱鍋囧浣犱嬌鐢ㄧ浜屼釜錛岄偅涔堢獥鍙e氨鍏鋒湁涓涓爣棰樻爮錛屽彲浠ヨ皟鏁村ぇ灝忕殑杈規錛岀郴緇熻彍鍗曪紝浠ュ強鏈澶ф渶灝忓寲鎸夐挳銆?wbr>
1.2寮瑰嚭紿楀彛錛圥op-upWindows錛?wbr>
寮瑰嚭紿楀彛鏄竴涓潪鍑$殑灞傚彔紿楀彛錛屽畠琚敤浜庢樉紺哄湪搴旂敤紼嬪簭涓葷獥鍙d箣澶栫殑瀵硅瘽妗嗭紝娑堟伅妗嗕互鍙婂叾浠栦復鏃剁獥鍙c傛爣棰樻爮瀵瑰脊鍑虹獥鍙f潵璇存槸鍙夌殑錛涢櫎姝や箣澶栵紝寮瑰嚭紿楀彛璺熷叿鏈塛S_OVERLAPPED鏍峰紡鐨勫眰鍙犵獥鍙d竴鏍楓?wbr>
浣犲彲浠ラ氳繃鍦–reateWindowEx涓寚瀹歐S_POPUP鏍峰紡鏉ュ垱寤轟竴涓脊鍑虹獥鍙c傚亣濡傝浣跨敤鏍囬鏍忥紝灝卞姞鍏S_CAPTION鏍峰紡銆備嬌鐢╓S_POPUPWINDOW鏍峰紡鏉ュ垱寤轟竴涓惈鏈夎竟妗嗗拰緋葷粺鑿滃崟鐨勫脊鍑虹獥鍙c俉S_CAPTION鏍峰紡蹇呴』涓嶹S_POPUPWINDOW鏍峰紡涓璧蜂嬌鐢ㄦ墠鑳戒嬌緋葷粺鑿滃崟鍙銆?wbr>
1.3瀛愮獥鍙o紙ChildWindows錛?wbr>
瀛愮獥鍙e叿鏈塛S_CHILD鏍峰紡騫朵笖瀹冭闄愬埗鍦ㄥ叾鐖剁獥鍙g殑瀹㈡埛鍖轟腑銆傚簲鐢ㄧ▼搴忓吀鍨嬪湴浣跨敤瀛愮獥鍙f潵鎶婂叾鐖剁獥鍙g殑瀹㈡埛鍖哄垝鍒嗘垚鍑犱釜鍔熻兘鍖哄煙銆備綘鍙互閫氳繃鍦–reateWindowEx涓寚瀹歐S_CHILD鏍峰紡鏉ュ垱寤哄瓙紿楀彛銆?wbr>
瀛愮獥鍙e繀欏誨叿鏈変竴涓埗紿楀彛銆傜埗紿楀彛鍙互鏄竴涓眰鍙犵獥鍙o紝寮瑰嚭紿楀彛錛屾垨鑰呭彟澶栦竴涓瓙紿楀彛銆備綘鍙互鍦–reateWindowEx涓寚瀹氱埗紿楀彛銆傚亣濡備綘鍦–reateWindowEx涓寚瀹氫簡WS_CHILD鏍峰紡浣嗘槸娌℃湁鎸囧畾鐖剁獥鍙o紝閭d箞緋葷粺涓嶄細鍒涘緩榪欎釜瀛愮獥鍙c?wbr>
瀛愮獥鍙e彧鍏鋒湁涓涓鎴峰尯鑰屾病鏈夊叾浠栫壒鎬э紝闄ら潪榪欎簺鐗規ц鏄庣‘鐨勮姹傘傚簲鐢ㄧ▼搴忓彲浠ヤ負瀛愮獥鍙f坊鍔犳爣棰樻爮錛岀郴緇熻彍鍗曪紝鏈灝忓寲鏈澶у寲鎸夐挳錛岃竟妗嗭紝浠ュ強婊氬姩鏉°備絾鏄瓙紿楀彛涓嶈兘鍏鋒湁鑷畾涔夎彍鍗曘傚亣濡傚簲鐢ㄧ▼搴忔寚瀹氫簡涓涓嚜瀹氫箟鑿滃崟鍙ユ焺錛岄偅涔堟棤璁烘槸鍦ㄥ畠娉ㄥ唽榪欎釜瀛愮獥鍙g被榪樻槸鍒涘緩榪欎釜瀛愮獥鍙f椂錛岃繖涓彍鍗曞彞鏌勯兘琚拷鐣ャ傚亣濡傛病鏈夋寚瀹氳竟妗嗘牱寮忥紝緋葷粺灝嗗垱寤轟竴涓棤杈規紿楀彛銆傚簲鐢ㄧ▼搴忓彲浠ヤ嬌鐢ㄦ棤杈規鐨勫瓙紿楀彛鏉ュ垝鍒嗙埗紿楀彛鐨勫鎴峰尯鍋囧鎯充繚鎸佽繖縐嶅垝鍒嗗鐢ㄦ埛鏄笉鍙鐨勮瘽銆?wbr>
1.4紿楀彛甯冪疆錛圥ositioning錛?wbr>
緋葷粺鎬繪槸鐩稿浜庣埗紿楀彛瀹㈡埛鍖虹殑宸︿笂瑙掓潵鏀劇疆瀛愮獥鍙c傚瓙紿楀彛鐨勪換浣曢儴鍒嗛兘涓嶄細鍑虹幇鍦ㄥ叾鐖剁獥鍙g殑杈規涔嬪銆傚亣濡傚簲鐢ㄧ▼搴忓垱寤轟竴涓瘮鐖剁獥鍙eぇ鐨勫瓙紿楀彛錛屾垨鑰呯Щ鍔ㄥ瓙紿楀彛浣垮緱涓涓垨鑰呮墍鏈夊瓙紿楀彛瓚呭嚭浜嗙埗紿楀彛鐨勮竟妗嗭紝閭d箞緋葷粺浼氳鍓瓙紿楀彛錛屽嵆鍦ㄧ埗紿楀彛杈規涔嬪鐨勯儴鍒嗕笉琚樉紺恒傚鐖剁獥鍙d駭鐢熷獎鍝嶇殑琛屼負鍚屾牱浼氬獎鍝嶅瓙紿楀彛錛岃繖浜涜涓哄涓嬶細
MFC鏈韓鐨?font face=Tahoma>CView綾繪槸鏀寔鎷栨斁鎿嶄綔鐨勶紝閫氳繃鐮旂┒CView綾葷殑婧愮爜錛屽ぇ浣撶煡閬撳畠鐨勫疄鐜板師鐞嗘槸榪欐牱鐨勶細CView綾諱腑鏈変竴涓?font face=Tahoma>COleDropTarget綾葷殑瀵硅薄錛屽湪瑙嗗浘紿楀彛鍒濆鍖栨椂錛岃皟鐢?font face=Tahoma>COleDropTarget綾繪垚鍛樺嚱鏁?font face=Tahoma>Register()錛屼互姝ゅ湪緋葷粺涓敞鍐岃瑙嗗浘紿楀彛涓烘嫋鏀炬帴鏀剁獥鍙c傚綋榪涜鎷栨斁鎿嶄綔鐨勯紶鏍囨寚閽堝浜庤鍥劇獥鍙h寖鍥村唴鏃訛紝COleDropTarge綾諱細鍋氬嚭鍙嶅簲錛屽畠鐨?font face=Tahoma>OnDragEnter銆?font face=Tahoma>OnDragOver銆?font face=Tahoma>OnDropEx銆?font face=Tahoma>OnDrop絳夋垚鍛樺嚱鏁拌渚濇璋冪敤錛岃繖浜涘嚱鏁伴粯璁ゅ潎鏄皟鐢ㄤ笌鍏剁浉瀵瑰簲鐨?font face=Tahoma>CView綾繪垚鍛樺嚱鏁?font face=Tahoma>OnDragEnter銆?font face=Tahoma>OnDragOver銆?font face=Tahoma>OnDropEx銆?font face=Tahoma>OnDrop絳夛紝紼嬪簭鍛樺彧闇閲嶈澆榪欎簺CView綾繪垚鍛樺嚱鏁幫紝鍗沖彲瀵規嫋鍔ㄧ殑榪囩▼鍙婄粨鏋滆繘琛屾帶鍒躲?/font>
鍥犱負COleDropTarget榛樿鍙CView鎻愪緵鏀寔錛屾墍浠ュ鏋滆璁╁叾浠栫殑紿楀彛鏀寔鎷栨斁錛屾垜浠繀欏誨悓鏃跺瑕佹敮鎸佹嫋鏀劇殑紿楀彛綾誨拰COleDropTarget綾昏繘琛屾淳鐢熴傛妸瀵規嫋鏀炬搷浣滃叿浣撹繘琛屽鐞嗙殑浠g爜灝佽鎴愭淳鐢熺獥鍙g被鐨勬垚鍛樺嚱鏁幫紝鐒跺悗閲嶈澆COleDropTarget涓搴旂殑浜斾釜铏氬嚱鏁幫紝褰撳畠鎺ユ敹鍒版嫋鏀懼姩浣滄椂錛岃皟鐢ㄧ獥鍙f淳鐢熺被鐨勫鐞嗗嚱鏁板嵆鍙備絾榪欓噷鏈変竴涓棶棰橈紝灝辨槸鎴戜滑鎬庝箞鐭ラ亾浣曟椂璋冪敤媧劇敓綾葷殑澶勭悊鍑芥暟鍛紵絳旀鏄繍鐢?font face=Tahoma>RTTI鎶鏈傚鏋?font face=Tahoma>COleDropTarget媧劇敓綾繪敹鍒扮殑紿楀彛鎸囬拡綾誨瀷錛屽氨鏄垜浠淳鐢熺殑紿楀彛綾伙紝閭d箞灝辮皟鐢ㄥ畠鐨勫鐞嗗嚱鏁幫紝鍚﹀垯璋冪敤鍩虹被榪涜澶勭悊銆?/font>
棣栧厛鐢熸垚涓涓璇濇宸ョ▼錛屾坊鍔犱簩涓柊綾匯?/font>
絎竴涓被鍚嶄負CListCtrlEx錛岀埗綾諱負CListCtrl銆傛坊鍔犲畬姣曞悗錛屽湪CListCtrlEx鐨勫畾涔夊ご鏂囦歡涓姞鍏?font face=Tahoma>DECLARE_DYNAMIC(CListCtrlEx)錛屽湪鍏跺疄鐜版枃浠朵腑鍔犲叆IMPLEMENT_DYNAMIC(CListCtrlEx,CListCtrl)錛岃繖鏍峰氨瀵?font face=Tahoma>CListCtrlEx綾繪坊鍔犱簡RTTI榪愯鏈熺被鍨嬭瘑鍒紙Run Time Type Information錛夋敮鎸併?/font>
絎簩涓被鍚嶄負COleDropTargetEx錛岀埗綾諱負COleDataTarget銆?/font>
鍦?font face=Tahoma>CListCtrlEx涓坊鍔?font face=Tahoma>COleDropTargetEx綾葷殑瀵硅薄錛屽茍娣誨姞涓嬪垪鍏湁铏氬嚱鏁扮殑澹版槑錛?/font>
virtual BOOL Initialize();
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual DROPEFFECT OnDropEx(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, DROPEFFECT dropList, CPoint point);
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
virtual void OnDragLeave(CWnd* pWnd);
Initialize鍑芥暟鐢ㄤ簬娉ㄥ唽CListCtrlEx鎴愪負鎷栨斁鎺ユ敹紿楀彛錛?/font>
OnDragOver鍦ㄦ嫋鏀鵑紶鏍囪繘鍏ョ獥鍙f椂琚皟鐢ㄣ傛鍑芥暟鐨勮繑鍥炲煎喅瀹氫簡鍚庣畫鐨勫姩浣滅殑綾誨瀷錛氬鏋滆繑鍥?font face=Tahoma>DROPEFFECT_MOVE錛屽垯浜х敓涓涓壀鍒囧姩浣滐紱濡傛灉榪斿洖DROPEFFECT_COPY錛屽垯浜х敓涓涓鍒跺姩浣滐紝濡傛灉榪斿洖DROPEFFECT_NONE錛屽垯涓嶄細浜х敓鎷栨斁鍔ㄤ綔錛屽洜涓?font face=Tahoma>OnDropEx銆?font face=Tahoma>OnDrop鍑芥暟灝嗕笉浼氳璋冪敤錛?font face=Tahoma>OnDragLeave鍑芥暟浠嶄細琚皟鐢級銆?/font>
OnDropEx鍑芥暟浼氬湪OnDrop鍑芥暟涔嬪墠璋冪敤錛屽鏋?font face=Tahoma>OnDropEx鍑芥暟娌℃湁瀵規嫋鏀懼姩浣滆繘琛屽鐞嗭紝鍒欏簲鐢ㄧ▼搴忔鏋朵細鎺ョ潃璋冪敤OnDrop鍑芥暟榪涜澶勭悊銆傛墍浠ュ繀欏昏鍦ㄦ淳鐢熺被涓噸杞?font face=Tahoma>OnDropEx鍑芥暟鈥斺斿嵆浣夸粈涔堝姩浣滈兘閮芥病鏈夊仛鈥斺斿惁鍒欐垜浠殑OnDrop鍑芥暟灝嗕笉浼氳鎵ц鍒幫紝鍥犱負娌℃湁閲嶈澆鐨勮瘽錛屽皢浼氳皟鐢ㄥ熀綾葷殑OnDropEx鍑芥暟錛岃屽熀綾葷殑OnDropEx鍑芥暟瀵規嫋鏀炬槸榪涜浜嗗鐞嗙殑鈥斺斿敖綆′笉鏄垜浠墍鎯寵鐨勫姩浣溿傚綋鐒朵綘涔熷彲浠ユ妸瀵規嫋鏀捐繘琛屽鐞嗙殑鍔ㄤ綔鏀懼湪OnDropEx涓斺旈偅鏍峰氨涓嶉渶瑕侀噸杞?font face=Tahoma>OnDrop浜嗐?/font>
OnDragLeave鍑芥暟浼氬湪榧犳爣紱誨紑紿楀彛鏃惰璋冪敤錛屽湪姝ゅ彲浠ヨ繘琛屼竴浜涚畝鍗曠殑娓呯悊宸ヤ綔銆傝濡傚湪OnDragEnter鎴栬?font face=Tahoma>OnDragOver鍑芥暟涓紝鎴戜滑鏀瑰彉浜嗗厜鏍囩殑褰㈡侊紝閭d箞姝ゆ椂鎴戜滑灝卞簲璇ユ妸鍏夋爣鎭㈠榪囨潵銆?/font>
榪欎簺鍑芥暟涓渶閲嶈鐨勬槸OnDrop鍑芥暟錛屾嫋鏀懼姩浣滃皢鍦ㄦ榪涜澶勭悊錛屽畠鐨勫叏閮ㄦ簮鐮佸涓嬶細
BOOL CListCtrlEx::OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
UINT nFileCount = 0;
HDROP hDropFiles = NULL;
HGLOBAL hMemData = NULL;
AfxMessageBox("OnDrop");
if(pDataObject->IsDataAvailable(CF_HDROP))
{
hMemData = pDataObject->GetGlobalData(CF_HDROP);
hDropFiles = (HDROP)GlobalLock((HGLOBAL)hMemData); //閿佸畾鍐呭瓨鍧?/font>
if(hDropFiles != NULL)
{
char chTemp[_MAX_PATH+1] = {0};
nFileCount = DragQueryFile(hDropFiles, 0xFFFFFFFF, NULL, 0);
for(UINT nCur=0; nCur<nFileCount; ++nCur) //閬嶅巻鍙栧緱姣忎釜鏂囦歡鍚?/font>
{
ZeroMemory(chTemp, _MAX_PATH+1);
DragQueryFile(hDropFiles, nCur, (LPTSTR)chTemp, _MAX_PATH+1);
AddAllFiles(chTemp);
}
}
GlobalUnlock(hMemData);
return TRUE;
}
else
{
return FALSE;
}
}
鍦ㄧ浜屼釜綾?font face=Tahoma>COleDropTarget涓坊鍔犲涓嬪搴旂殑鍑芥暟錛?/font>
virtual DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
virtual DROPEFFECT OnDropEx(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, DROPEFFECT dropList, CPoint point);
virtual BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
virtual void OnDragLeave(CWnd* pWnd);
瀹冧滑鐨勫姩浣滈兘宸笉澶氾細鍏堢敤RTTI鍒ゆ柇紿楀彛鎸囬拡pWnd鐨勭被鍨嬶紝濡傛灉鏄?font face=Tahoma>CListCtrlEx錛屽垯璋冪敤CListCtrlEx涓搴旂殑澶勭悊鍑芥暟錛屽惁鍒欒皟鐢ㄥ熀綾葷殑澶勭悊鍑芥暟銆備互OnDrop涓轟緥錛?/font>
BOOL COleDropTargetEx::OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
{
CListCtrlEx* pListCtrlEx = NULL;
ASSERT_VALID(this);
ASSERT(IsWindow(pWnd->m_hWnd));
if(pWnd->IsKindOf(RUNTIME_CLASS(CListCtrlEx)))
{
pListCtrlEx = (CListCtrlEx*)pWnd;
return pListCtrlEx->OnDrop(pWnd, pDataObject, dropEffect, point);
}
else
{
return COleDropTarget::OnDrop(pWnd, pDataObject, dropEffect, point);
}
}
//鍊掗湁鐨?4K闄愬埗錛屽彧鑳藉啀鎴柇浜嗭細錛?br>
鑷蟲錛屾垜浠垚鍔熷湴涓?font face=Tahoma>CListCtrlEx娣誨姞浜嗘枃浠舵嫋鍏ユ搷浣滅殑鏀寔銆備竴涓畬鏁寸殑鎷栨斁鎿嶄綔錛岃繕鍖呮嫭鎷栧嚭鍔ㄤ綔錛屾墍浠ュ繀欏昏涓鴻綾誨啀娣誨姞鎷栧嚭鎿嶄綔錛屽嵆錛屽皢鍒楄〃涓殑鏌愪竴欏規垨鑰呭欏規嫋鍑烘垚涓轟竴涓枃浠躲傝繖灝遍渶瑕佺敤鍒板彟涓涓被錛?font face=Tahoma>COleDataSource銆傚叿浣撴楠ゅ涓嬶細
鍦?font face=Tahoma>CListCtrlEx涓姞鍏ヤ竴涓?font face=Tahoma>COleDataSource鐨勫疄渚嬶紝騫舵槧灝勫垪琛ㄦ鐨?font face=Tahoma>LVN_BEGINDRAG娑堟伅澶勭悊鍑芥暟錛屽湪姝ゆ垜浠坊鍔犳嫋鍑烘搷浣滅殑浠g爜銆?/font>
瀹炵幇鎷栧嚭闈炲父綆鍗曪紝鍙渶瑕佷緷嬈¤皟鐢?font face=Tahoma>COleDataSource鐨勪笁涓嚱鏁板嵆鍙細Empty鐢ㄤ簬娓呯┖鍘熷厛瀵硅薄涓紦瀛樼殑鏁版嵁錛?font face=Tahoma>CacheGlobalData鐢ㄦ潵緙撳瓨鏁版嵁浠ヨ繘琛屾嫋鏀炬搷浣滐紝鏈鍚庤皟鐢?font face=Tahoma>DoDragDrop鍚姩鏈鎷栨斁鎿嶄綔銆?/font>
浣嗗湪璋冪敤涔嬪墠錛屽繀欏昏鍋氫竴浜涘噯澶囧伐浣溿備富瑕佺殑浠誨姟灝辨槸鍒涘緩涓涓?font face=Tahoma>DROPFILES緇撴瀯浣擄紝騫舵嫹璐濊鎷栨斁鐨勬枃浠跺悕鍒扮粨鏋勪綋鍚庣殑鍐呭瓨涓?font face=Tahoma>DROPFILES緇撴瀯浣撳畾涔変簡CF_HDROP鍓創鏉挎牸寮忥紝绱ц窡瀹冨悗闈㈢殑鏄竴緋誨垪琚嫋鏀炬枃浠剁殑璺緞鍚嶃傚畠鐨勫畾涔夊涓嬶細
typedef struct _DROPFILES
{
DWORD pFiles; //鏂囦歡鍚嶈搗濮嬪湴鍧
POINT pt; //榧犳爣鏀句笅鐨勪綅緗紝鍧愭爣鐢?font face=Tahoma>fNC鎴愬憳鎸囧畾
BOOL fNC; //涓?font face=Tahoma>TRUE琛ㄧず閫傜敤灞忓箷鍧愭爣緋伙紝鍚﹀垯浣跨敤瀹㈡埛鍧愭爣緋?/font>
BOOL fWide; //鏂囦歡鍚嶅瓧絎︿覆鏄惁浣跨敤瀹藉瓧絎?/font>
} DROPFILES, FAR* LPDROPFILES;
鎷栨斁涔嬪墠鐨勫噯澶囧姩浣滅殑浠g爜濡備笅錛?/font>
uBufferSize = sizeof(DROPFILES) + uBufferSize + 1;
hMemData = GlobalAlloc(GPTR,uBufferSize);
ASSERT(hMemData != NULL);
lpDropFiles = (LPDROPFILES)GlobalLock(hMemData); //閿佸畾涔?font face=Tahoma>,騫惰緗浉鍏蟲垚鍛?/font>
ASSERT(lpDropFiles != NULL);
lpDropFiles->pFiles = sizeof(DROPFILES);
#ifdef _UNICODE
lpDropFiles->fWide = TRUE;
#else
lpDropFiles->fWide = FALSE;
#endif
//鎶婇変腑鐨勬墍鏈夋枃浠跺悕渚濇澶嶅埗鍒?font face=Tahoma>DROPFILES緇撴瀯浣撳悗闈?font face=Tahoma>(鍏ㄥ眬鍐呭瓨涓?font face=Tahoma>)
pItemPos = strSelectedList.GetHeadPosition();
pszStart = (char*)((LPBYTE)lpDropFiles + sizeof(DROPFILES));
while(pItemPos != NULL)
{
lstrcpy(pszStart, (LPCTSTR)strSelectedList.GetNext(pItemPos));
pszStart = strchr(pszStart,'\0') + 1; //涓嬫鐨勮搗濮嬩綅緗槸涓婁竴嬈$粨灝?font face=Tahoma>+1
}
鍑嗗瀹屾瘯涔嬪悗灝卞彲浠ヨ繘琛屾嫋鏀句簡錛屾嫋鏀懼姩浣滄湁DoDragDrop鍑芥暟瑙﹀彂錛屽叾鍘熷瀷濡備笅錛?/font>
DROPEFFECT DoDragDrop(
DWORD dwEffects = DROPEFFECT_COPY|DROPEFFECT_MOVE|DROPEFFECT_LINK, LPCRECT lpRectStartDrag = NULL,
COleDropSource* pDropSource = NULL
);
榪欓噷錛?font face=Tahoma>dwEffects鎸囧畾浜嗗厑璁告柦鍔犱簬鏈?font face=Tahoma>COleDataSource瀹炰緥涔嬩笂鐨勫姩浣滈泦錛氬壀鍒囥佸鍒舵垨鏃犲姩浣溿?/font>
lpRectStartDrag鎸囩ず鎷栨斁鎿嶄綔鐪熸寮濮嬬殑鐭╁艦錛屽鏋滈紶鏍囨病鏈夌Щ鍑鴻鐭╁艦錛屽垯鎷栨斁鎿嶄綔瑙嗕綔鏀懼純澶勭悊銆傚鏋滄湰鎴愬憳璁句負NULL錛屽垯璇ヨ搗濮嬬煩褰㈠皢涓轟竴涓儚绱犲ぇ灝忋?/font>
pDropSource琛ㄦ槑鎷栨斁鎵浣跨敤鐨?font face=Tahoma>COleDataSource瀵硅薄銆?/font>
鑰岃鍑芥暟鐨勮繑鍥炲鹼紝鍒欒〃鏄庢湰嬈℃嫋鏀炬搷浣滄墍瀹為檯浜х敓鐨勬晥鏋滐紝鑷充簬鍏蜂綋浜х敓浣曠鏁堟灉錛屽垯鐢辯郴緇熷喅瀹氥傝濡傚湪鎷栨斁鏃舵寜浣?font face=Tahoma>Shift閿紝灝嗕駭鐢熷壀鍒囨晥鏋滐紱鎸変綇Ctrl閿紝灝嗕駭鐢熷鍒舵晥鏋滐紝絳夌瓑銆?/font>
鎷栨斁鐨勪唬鐮佸涓嬶細
m_oleDataSource.Empty();
m_oleDataSource.CacheGlobalData(CF_HDROP, hMemData);
DropResult = m_oleDataSource.DoDragDrop(DROPEFFECT_MOVE|DROPEFFECT_COPY);
鏈鍚庝竴鐐硅娉ㄦ剰鐨勬槸錛屽湪Windows NT 4.0浠ヤ笂鐨勭郴緇熶腑錛屽嵆浣垮疄闄呬駭鐢熺殑鏄?font face=Tahoma>DROPEFFECT_MOVE鍔ㄤ綔錛?font face=Tahoma>DoDragDrop鍑芥暟涔熷彧榪斿洖DROPEFFECT_NONE銆備駭鐢熻繖涓棶棰樼殑鍘熷洜鍦ㄤ簬錛?font face=Tahoma>Windows NT 4.0鐨?font face=Tahoma>Shell浼氱洿鎺ョЩ鍔ㄦ枃浠舵湰韜潵瀵圭Щ鍔ㄦ搷浣滆繘琛屼紭鍖栥傝繑鍥炲?font face=Tahoma>DROPEFFECT_MOVE鏈鍒濈殑鍚箟錛屽氨鏄氱煡鎵ц鎷栨斁鎿嶄綔鐨勫簲鐢ㄧ▼搴忓幓鍒犻櫎鍘熶綅緗笂鐨勬枃浠躲備絾鏄洜涓?font face=Tahoma>Shell宸茬粡鏇垮簲鐢ㄧ▼搴忓畬鎴愪簡榪欎釜錛堝垹闄わ級鍔ㄤ綔錛屾墍浠ワ紝鍑芥暟榪斿洖DROPEFFECT_NONE銆傝鎯崇煡閬撴枃浠舵槸鍚︾湡鐨勮縐誨姩浜嗕篃寰堢畝鍗曪紝鍙鍦ㄥ嚱鏁拌繑鍥炰箣鍚庢鏌ヤ竴涓嬪師浣嶇疆涓婄殑鏂囦歡鏄惁瀛樺湪灝卞彲浠ヤ簡銆?/font>
Windows 9x緋誨垪鐨勬搷浣滅郴緇熶篃浼氬縐誨姩榪涜鍚屾牱鐨勪紭鍖栧姩浣滐紝浣嗘槸瀹冧笉浼氳繑鍥?font face=Tahoma>DROPEFFECT_NONE鏉ヤ唬鏇?font face=Tahoma>DROPEFFECT_MOVE銆傝緇嗙殑瑙i噴鍙傝MS鐭ヨ瘑搴?font face=Tahoma>Q182219銆?/font>
綾繪垚鍛樻柟娉曟槸涓涓瘮杈冪壒孌婄殑鍑芥暟錛屽畠鍦ㄧ紪璇戞椂浼氳杞寲鎴愭櫘閫氬嚱鏁幫紝姣斿鏈塗MyClass綾?
class TMyClass{
void Func();
};
榪欎釜TMyClass::Func鏈緇堜細杞寲鎴?void Func(TMyClass *this); 涔熷氨鏄鍦ㄥ師絎竴涓弬鏁板墠鎻掑叆鎸囧悜瀵硅薄鏈韓鐨則his鎸囬拡銆?/p>
鎴戜滑鍙互鍒╃敤榪欎釜鐗規у啓涓涓潪闈欐佺被鎴愬憳鏂規硶鏉ョ洿鎺ヤ綔涓虹嚎紼嬪洖璋冨嚱鏁幫紝鍏堢湅_beginthread鍑芥暟鐨勫畾涔?
unsigned long _RTLENTRY _EXPFUNC _beginthread (void (_USERENTRY *__start)(void *),unsigned __stksize, void *__arg);
鍏朵腑鐨勭涓涓弬鏁板氨鏄綔涓虹嚎紼嬫墽琛屼富浣撶殑鍥炶皟鍑芥暟銆傚畠鐨勫師鍨嬫槸:void Func(void *)錛岃繖涓獀oid*鍙傛暟鏄綔涓鴻嚜瀹氫箟鏁版嵁浼犲叆鐨勩傚姣斾竴涓嬩笂闈㈡墍璇寸殑TMyClass::Func鐨勬渶緇堝艦寮忥紝瀹冩濂藉彲浠ョ鍚堣繖閲岀殑瑕佹眰銆?/p>
鐜板湪鍋氫釜瀹為獙:
#include <stdio.h>
#include <process.h>
class TMyClass{
int m_nCount;
int m_nId;
public:
TMyClass(int nId,int nCount)
:m_nId(nId),m_nCount(nCount)
{
}
void _USERENTRY ThreadProc() // 綾繪垚鍛樻柟娉?br> {
for(int i=0; i<m_nCount; i++) // 鏍規嵁m_nCount鎴愬憳鎵撳嵃涓鎺掓暟瀛?br> {
printf("Class%d : %d\n",m_nId,i);
}
}
};
int main(int argc, char* argv[])
{
union { // 鑱斿悎綾伙紝鐢ㄤ簬杞崲綾繪垚鍛樻柟娉曟寚閽堝埌鏅氬嚱鏁版寚閽堬紙璇曡繃緙栬瘧鍣ㄤ笉鍏佽鍦ㄨ繖涓ょ鍑芥暟涔嬮棿寮哄埗杞崲錛夛紝涓嶇煡閬撴湁娌℃湁鏇村ソ鐨勬柟娉曘?br> void (_USERENTRY *ThreadProc)(void *);
void (_USERENTRY TMyClass::*MemberProc)();
} Proc; // 灝界鑱斿悎閲岀殑涓ょ鍑芥暟綾誨瀷鐜板湪鐪嬭搗鏉ユ湁寰堝ぇ涓嶅悓錛屼絾瀹冧滑鐨勬渶緇堝艦寮忔槸鐩稿悓鐨勩?/p>
TMyClass MyClass1(1,10),MyClass2(2,5); // 浜х敓涓や釜TMyClass瀵硅薄
Proc.MemberProc = &TMyClass::ThreadProc; // 杞崲錛孭roc.ThreadProc灝辨槸瀵瑰簲鐨勬櫘閫氬嚱鏁版寚閽堜簡
_beginthread(Proc.ThreadProc,4096,&MyClass1); // 寮濮嬬嚎紼嬶紝榪欓噷鐨凱roc.ThreadProc瀹為檯涓婃槸TMyClass::ThreadProc, 瀹冭鐨則his鎸囬拡鏄垜浠粰鐨?amp;MyClass1銆?br> _beginthread(Proc.ThreadProc,4096,&MyClass2);
system("pause");
return 0;
}
榪愯錛佺濂囧惂錛?-)
鍏跺疄涓嶆綰跨▼鍥炶皟鍑芥暟錛屽叾瀹炲彧瑕佹槸褰㈠Func(void*,...)鐨勫洖璋冨嚱鏁伴兘鍙互鐢ㄨ繖縐嶆柟娉曠洿鎺ヤ嬌鐢ㄧ被鎴愬憳鏂規硶銆?鍓嶆彁鏄涓涓獀oid*鏄嚜瀹氫箟鏁版嵁錛屼篃灝辨槸璇村畠涓嶈兘鏈夊叾瀹冨姛鑳?銆?br>
杞嚜:http://blog.csdn.net/waiting4you/archive/2007/12/29/2000796.aspx
| uMsg | wParam | lParam | 璇存槑 |
| SBM_ENABLE_ARROWS | ESB_DISABLE_BOTH | 0 | 紱佹鍙屽悜婊氬姩鍓ご |
| ESB_DISABLE_DOWN | 0 | 紱佹鍚戜笅婊氬姩鍓ご | |
| ESB_DISABLE_LTUP | 0 | 紱佹鍚戜笂鍜屽悜宸︽粴鍔ㄥ壀澶?/td> | |
| ESB_DISABLE_LEFT | 0 | 紱佹鍚戝乏婊氬姩鍓ご | |
| ESB_DISABLE_RTDN | 0 | 紱佹鍚戜笅鍜屽悜鍙蟲粴鍔ㄥ壀澶?/td> | |
| ESB_DISABLE_UP | 0 | 紱佹鍚戜笂婊氬姩鍓ご | |
| ESB_ENABLE_BOTH | 0 | 鍏佽鍙屽悜婊氬姩鍓ご(鎾ゆ秷鍚勭紱佹) | |
| SBM_SETPOS | 鎸囧畾浣嶇疆 | TRUE | 璁劇疆婊氬姩妗嗕綅緗紝騫墮噸緇樻帶浠?/td> |
| FALSE | 璁劇疆婊氬姩妗嗕綅緗紝涓嶉噸緇樻帶浠?/td> | ||
| SBM_SETRANGE | 鏈灝忓?/td> | 鏈澶у?/td> | 璁劇疆婊氬姩妗嗕綅緗殑鍙樺寲鑼冨洿 |
| SBM_SETRANGEREDRAW | 鏈灝忓?/td> | 鏈澶у?/td> | 璁劇疆婊氬姩妗嗕綅緗殑鍙樺寲鑼冨洿錛屽茍閲嶇粯鎺т歡 |
| SBM_SETSCROLLINFO | TRUE鎴朏ALSE | SCROLLINFO緇撴瀯鎸囬拡 | 鏈秷鎭氳繃涓涓猄CROLLINFO緇撴瀯鏉ュ悓鏃舵寚瀹氭帶浠剁殑澶氱鍙傛暟錛屽叿浣撴寚瀹氬摢浜涘弬鏁扮敱緇撴瀯涓殑fMask鎴愬憳紜畾銆倃Param鎸囧畾鏄惁閲嶇粯鎺т歡錛岃瑙?#8220;SCROLLINFO緇撴瀯” |
| 娑堟伅浠g爜 | 鍔ㄤ綔 | 鍝嶅簲 |
| SB_LINEUP SB_LINELEFT |
鐢ㄦ埛鐐瑰嚮浜嗗悜涓?宸?鍓ご | 婊氬姩妗嗕綅緗噺涓錛屽鎴風獥鍙e悜涓?宸?婊氬姩涓琛屻?br>娉細榪欎袱涓唬鐮佹暟鍊肩浉絳夛紝鍥犳鍙互娣風敤錛屼笅鍚屻?/td> |
| SB_LINEDOWN SB_LINERIGHT |
鐢ㄦ埛鐐瑰嚮浜嗗悜涓?鍙?鍓ご | 婊氬姩妗嗕綅緗姞涓錛屽鎴風獥鍙e悜涓?鍙?婊氬姩涓琛屻?/td> |
| SB_PAGEUP SB_PAGELEFT |
鐢ㄦ埛鐐瑰嚮浜嗘粴鍔ㄦ浠ヤ笂(宸?鍓潌 | 婊氬姩妗嗕綅緗噺鍘諱竴涓ぇ鍗曚綅錛屽鎴風獥鍙e悜涓?宸?婊氬姩涓欏點? |
| SB_PAGEDOWN SB_PAGERIGHT |
鐢ㄦ埛鐐瑰嚮浜嗘粴鍔ㄦ浠ヤ笅(鍙?鍓潌 | 婊氬姩妗嗕綅緗姞涓婁竴涓ぇ鍗曚綅錛屽鎴風獥鍙e悜涓?鍙?婊氬姩涓欏點? |
| SB_THUMBPOSITION | 鐢ㄦ埛鎷栧姩騫墮噴鏀炬粴鍔ㄦ鍒版寚瀹氫綅緗?/td> | 璁懼畾婊氬姩妗嗗埌鎸囧畾浣嶇疆銆傚鎴風獥鍙f粴鍔ㄥ埌鎸囧畾浣嶇疆銆?/td> |
| SB_THUMBTRACK | 鐢ㄦ埛姝e湪鎷栧姩婊氬姩妗?/td> | 璁懼畾婊氬姩妗嗗埌鎸囧畾浣嶇疆銆傚鎴風獥鍙f粴鍔ㄥ埌鎸囧畾浣嶇疆銆傚鏋滃簲鐢ㄧ▼搴忛渶瑕佸揩閫熸祻瑙堢獥鍙o紝鍙互鍝嶅簲鏈秷鎭噸緇樼獥鍙o紝濡傛灉涓嶉渶瑕佸揩閫熸祻瑙堬紝鍙互絳夊緟鏀跺埌SB_THUMBPOSITION娑堟伅鏃墮噸緇樼獥鍙c? |
| SB_ENDSCROLL | 鐢ㄦ埛閲婃斁鎸変笅鍓ご鎴栧壀鏉嗙殑榧犳爣 | 鏃犻』鍋氫換浣曞搷搴? |
| uMsg | wParam | lParam | 璇存槑 |
| SBM_GETPOS | 0 | 0 | 榪斿洖婊氬姩妗嗗綋鍓嶄綅緗?/td> |
| SBM_GETRANGE | 鏈灝忓煎湴鍧鎸囬拡 | 鏈澶у煎湴鍧鎸囬拡 | 鍦ㄦ寚瀹氬湴鍧涓~鍏?2浣嶇殑婊氬姩妗嗕綅緗殑鍙樺寲鑼冨洿 |
| SBM_GETSCROLLINFO | 0 | SCROLLINFO緇撴瀯鎸囬拡 | 鍦ㄤ竴涓猄CROLLINFO緇撴瀯涓繑鍥炴帶浠剁殑澶氱鍙傛暟錛屽繀欏諱簨鍏堣瀹氱粨鏋勭殑fMask鎴愬憳鏉ョ‘瀹氬叿浣撹鍙栧緱鍝簺鍙傛暟銆傝瑙?#8220;SCROLLINFO緇撴瀯” |
SCROLLINFO STRUCT
cbSize DWORD ?
fMask DWORD ?
nMin DWORD ?
nMax DWORD ?
nPage DWORD ?
nPos DWORD ?
nTrackPos DWORD ?
SCROLLINFO ENDS
|
GetDc鍑?/span>鏁幫細鐢ㄤ簬鑾峰緱hWnd鍙傛暟鎵鎸囧畾紿楀彛鐨勫鎴峰尯鍩熺殑涓涓澶囩幆澧冦?/span>
鎵鑾峰緱鐨勮澶囩幆澧冨彲浠ユ槸閫氱敤銆佺被鎴栬呯鏈夌被鍨嬶紝鍏蜂綋鐢辨寚瀹氱獥鍙g殑綾婚鏍煎喅瀹氥傚浜庨氱敤璁懼鐜錛?/span>GetDc鍑芥暟姣忔鑾峰彇涓涓澶囩幆澧冩椂閮戒細鐢ㄩ粯璁ゅ睘鎬у瀹冭繘琛屽垵濮嬪寲銆傝鍑芥暟鑾峰緱鐨勭被鍜岀鏈夎澶囩幆澧冧細涓庡畠浠渶鍚庝竴嬈$殑璁劇疆淇濇寔涓鑷淬傚綋璁懼鐜涓嶅啀闇瑕佹椂錛屽簲璇ヨ皟鐢?/span>ReleaseDC鍑芥暟灝嗗叾閲婃斁銆?/span>
GetWindowDC鍑芥暟錛氳繑鍥?/span>hWnd鍙傛暟鎵鎸囧畾鐨勭獥鍙g殑璁懼鐜銆?/span>
鑾峰緱鐨勮澶囩幆澧冭鐩栦簡鏁翠釜紿楀彛錛堝寘鎷潪瀹㈡埛鍖猴級錛屼緥濡傛爣棰樻爮銆佽彍鍗曘佹粴鍔ㄦ潯錛屼互鍙婅竟妗嗐傝繖浣垮緱紼嬪簭鑳藉鍦ㄩ潪瀹㈡埛鍖哄煙瀹炵幇鑷畾涔夊浘褰紝渚嬪鑷畾涔夋爣棰樻垨鑰呰竟妗嗐傚綋涓嶅啀闇瑕佽璁懼鐜鏃訛紝闇瑕佽皟鐢?/span>ReleaseDC鍑芥暟閲婃斁璁懼鐜銆傛敞鎰忥紝璇ュ嚱鏁板彧鑾峰緱閫氱敤璁懼鐜錛岃璁懼鐜鐨勪換浣曞睘鎬ф敼鍙橀兘涓嶄細鍙嶆槧鍒扮獥鍙g殑縐佹湁鎴栬呯被璁懼鐜涓紙濡傛灉紿楀彛鏈夌殑璇濓級
----------鎽樿嚜銆?/span>Delphi Win32鏍稿績API鍙傝冦?/span>
=============================================================