锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://support.microsoft.com/kb/925488
涓嬭澆瀹夎琛ヤ竵錛圢DP20-KB925488-X86.msp錛夊嵆鍙?/p>
鏈夌殑緋葷粺瀹夎涓嶄笂錛屾彁紺?#8220;姝よ蔣浠舵洿鏂頒笌璁$畻鏈轟笂鐨剋indows瀹夎紼嬪簭涓嶅吋瀹癸紝瑕佹洿鏂版偍鐨勮綆楁満璇蜂粠windows涓嬭澆涓績涓嬭澆騫跺畨瑁呯▼搴忓彲鍦ㄥ彂琛岀増鏈?.1鎴栨洿楂樼増鏈紝騫跺畨瑁呯▼搴忓彲鍦ㄥ彂琛岀増鏈?.1鎴栨洿楂樼増鏈?#8221;
闇瑕佹洿鏂板鎴風鐨剋indows installer紼嬪簭
http://support.microsoft.com/kb/893803
鍥犳鎴戣涓猴紝.NET Framework 1.0 鎴?1.1 鐗堢被搴撲腑瀛樺湪浠諱綍 Windows 鎵娌℃湁鐨勫姛鑳介檺鍒墮兘涓嶈凍涓烘傛瘯绔燂紝32 浣嶇殑 Windows錛堜笉綆′綍縐嶇増鏈級鏄竴涓垚鐔熺殑鎿嶄綔緋葷粺錛屼負騫垮ぇ瀹㈡埛鏈嶅姟浜嗗崄澶氬勾銆傜浉姣斾箣涓嬶紝.NET Framework 鍗存槸涓涓柊浜嬬墿銆?/p>
闅忕潃瓚婃潵瓚婂鐨勫紑鍙戜漢鍛樺皢鐢熶駭搴旂敤紼嬪簭杞埌鎵樼浠g爜錛屽紑鍙戜漢鍛樻洿棰戠箒鍦扮爺絀跺簳灞傛搷浣滅郴緇熶互鍥炬壘鍑轟竴浜涘叧閿姛鑳芥樉寰楀緢鑷劧 鈥?鑷沖皯鐩墠鏄姝ゃ?/p>
鍊煎緱搴嗗垢鐨勬槸錛屽叕鍏辮璦榪愯搴?(CLR) 鐨?interop 鍔熻兘錛堢О涓哄鉤鍙拌皟鐢? (P/Invoke)錛夐潪甯稿畬鍠勩傚湪鏈笓鏍忎腑錛屾垜灝嗛噸鐐逛粙緇嶅浣曞疄闄呬嬌鐢?P/Invoke 鏉ヨ皟鐢?Windows API 鍑芥暟銆傚綋鎸?CLR 鐨? COM Interop 鍔熻兘鏃訛紝P/Invoke 褰撲綔鍚嶈瘝浣跨敤錛涘綋鎸囪鍔熻兘鐨勪嬌鐢ㄦ椂錛屽垯灝嗗叾褰撲綔鍔ㄨ瘝浣跨敤銆傛垜騫朵笉鎵撶畻鐩存帴浠嬬粛 COM Interop錛屽洜涓哄畠姣?P/Invoke 鍏鋒湁鏇村ソ鐨勫彲璁塊棶鎬э紝鍗存洿鍔犲鏉傦紝榪欐湁鐐硅嚜鐩哥煕鐩撅紝榪欎嬌寰楀皢 COM Interop 浣滀負涓撴爮涓婚鏉ヨ璁轟笉澶畝鏄庢壖瑕併?/p>
璧拌繘 P/Invoke
棣栧厛浠庤冨療涓涓畝鍗曠殑 P/Invoke 紺轟緥寮濮嬨傝鎴戜滑鐪嬩竴鐪嬪浣曡皟鐢?Win32 MessageBeep 鍑芥暟錛屽畠鐨勯潪鎵樼澹版槑濡備互涓嬩唬鐮佹墍紺猴細
BOOL MessageBeep(
UINT uType // beep type
);
涓轟簡璋冪敤 MessageBeep錛屾偍闇瑕佸湪 C# 涓皢浠ヤ笅浠g爜娣誨姞鍒頒竴涓被鎴栫粨鏋勫畾涔変腑錛?
[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);
浠や漢鎯婅鐨勬槸錛屽彧闇瑕佽繖孌典唬鐮佸氨鍙互浣挎墭綆′唬鐮佽皟鐢ㄩ潪鎵樼鐨?MessageBeep API銆傚畠涓嶆槸涓涓柟娉曡皟鐢紝鑰屾槸涓涓閮ㄦ柟娉曞畾涔夈傦紙鍙﹀錛屽畠鎺ヨ繎浜庝竴涓潵鑷?C 鑰?C# 鍏佽鐨勭洿鎺ョ鍙o紝鍥犳浠ュ畠涓鴻搗鐐規潵浠嬬粛涓浜涙蹇墊槸鏈夊府鍔╃殑銆傦級鏉ヨ嚜鎵樼浠g爜鐨勫彲鑳借皟鐢ㄥ涓嬫墍紺猴細
MessageBeep(0);
璇鋒敞鎰忥紝鐜板湪 MessageBeep 鏂規硶琚0鏄庝負 static銆傝繖鏄?P/Invoke 鏂規硶鎵瑕佹眰鐨勶紝鍥犱負鍦ㄨ Windows API 涓病鏈変竴鑷寸殑瀹炰緥姒傚康銆傛帴涓嬫潵錛岃繕瑕佹敞鎰忚鏂規硶琚爣璁頒負 extern銆傝繖鏄彁紺虹紪璇戝櫒璇ユ柟娉曟槸閫氳繃涓涓粠 DLL 瀵煎嚭鐨勫嚱鏁板疄鐜扮殑錛屽洜姝や笉闇瑕佹彁渚涙柟娉曚綋銆?/p>
璇村埌緙哄皯鏂規硶浣擄紝鎮ㄦ槸鍚︽敞鎰忓埌 MessageBeep 澹版槑騫舵病鏈夊寘鍚竴涓柟娉曚綋錛熶笌澶у鏁扮畻娉曠敱涓棿璇█ (IL) 鎸囦護緇勬垚鐨勬墭綆℃柟娉曚笉鍚岋紝P/Invoke 鏂規硶鍙槸鍏冩暟鎹紝瀹炴椂 (JIT) 緙栬瘧鍣ㄥ湪榪愯鏃墮氳繃瀹冨皢鎵樼浠g爜涓庨潪鎵樼鐨?DLL 鍑芥暟榪炴帴璧鋒潵銆傛墽琛岃繖縐嶅埌闈炴墭綆′笘鐣岀殑榪炴帴鎵闇鐨勪竴涓噸瑕佷俊鎭氨鏄鍑洪潪鎵樼鏂規硶鐨?DLL 鐨勫悕縐般傝繖涓淇℃伅鏄敱 MessageBeep 鏂規硶澹版槑涔嬪墠鐨?DllImport 鑷畾涔夊睘鎬ф彁渚涚殑銆傚湪鏈緥涓紝鍙互鐪嬪埌錛孧essageBeep 闈炴墭綆?API 鏄敱 Windows 涓殑 User32.dll 瀵煎嚭鐨勩?/p>
鍒扮幇鍦ㄤ負姝紝鍏充簬璋冪敤 MessageBeep 灝卞墿涓や釜璇濋娌℃湁浠嬬粛錛岃鍥為【涓涓嬶紝璋冪敤鐨勪唬鐮佷笌浠ヤ笅鎵紺轟唬鐮佺墖孌甸潪甯哥浉浼鹼細
[DllImport("User32.dll")]
static extern Boolean MessageBeep(UInt32 beepType);
鏈鍚庤繖涓や釜璇濋鏄笌鏁版嵁灝侀佸鐞?(data marshaling) 鍜屼粠鎵樼浠g爜鍒伴潪鎵樼鍑芥暟鐨勫疄闄呮柟娉曡皟鐢ㄦ湁鍏崇殑璇濋銆傝皟鐢ㄩ潪鎵樼 MessageBeep 鍑芥暟鍙互鐢辨壘鍒頒綔鐢ㄥ煙鍐呯殑extern MessageBeep 澹版槑鐨勪換浣曟墭綆′唬鐮佹墽琛屻傝璋冪敤綾諱技浜庝換浣曞叾浠栧闈欐佹柟娉曠殑璋冪敤銆傚畠涓庡叾浠栦換浣曟墭綆℃柟娉曡皟鐢ㄧ殑鍏卞悓涔嬪鍦ㄤ簬甯︽潵浜嗘暟鎹皝閫佸鐞嗙殑闇瑕併?
C# 鐨勮鍒欎箣涓鏄畠鐨勮皟鐢ㄨ娉曞彧鑳借闂?CLR 鏁版嵁綾誨瀷錛屼緥濡?System.UInt32 鍜?System.Boolean銆侰# 鏄劇劧涓嶈瘑鍒?Windows API 涓嬌鐢ㄧ殑鍩轟簬 C 鐨勬暟鎹被鍨嬶紙渚嬪 UINT 鍜?BOOL錛夛紝榪欎簺綾誨瀷鍙槸 C 璇█綾誨瀷鐨勭被鍨嬪畾涔夎屽凡銆傛墍浠ュ綋 Windows API 鍑芥暟 MessageBeep 鎸変互涓嬫柟寮忕紪鍐欐椂
BOOL MessageBeep( UINT uType )
澶栭儴鏂規硶灝卞繀欏諱嬌鐢?CLR 綾誨瀷鏉ュ畾涔夛紝濡傛偍鍦ㄥ墠闈㈢殑浠g爜鐗囨涓墍鐪嬪埌鐨勩傞渶瑕佷嬌鐢ㄤ笌鍩虹 API 鍑芥暟綾誨瀷涓嶅悓浣嗕笌涔嬪吋瀹圭殑 CLR 綾誨瀷鏄?P/Invoke 杈冮毦浣跨敤鐨勪竴涓柟闈€傚洜姝わ紝鍦ㄦ湰涓撴爮鐨勫悗闈㈡垜灝嗙敤瀹屾暣鐨勭珷鑺傛潵浠嬬粛鏁版嵁灝侀佸鐞嗐?
鏍峰紡
鍦?C# 涓 Windows API 榪涜 P/Invoke 璋冪敤鏄緢綆鍗曠殑銆備絾濡傛灉綾誨簱鎷掔粷浣挎偍鐨勫簲鐢ㄧ▼搴忓彂鍑哄槦澹幫紝搴旇鎯蟲柟璁炬硶璋冪敤 Windows 浣垮畠榪涜榪欓」宸ヤ綔錛屾槸鍚楋紵
鏄殑銆備絾鏄笌閫夋嫨鐨勬柟娉曟湁鍏籌紝鑰屼笖鍏崇郴鐢氬ぇ錛侀氬父錛屽鏋滅被搴撴彁渚涙煇縐嶉斿緞鏉ュ疄鐜版偍鐨勬剰鍥撅紝鍒欐渶濂戒嬌鐢?API 鑰屼笉瑕佺洿鎺ヨ皟鐢ㄩ潪鎵樼浠g爜錛屽洜涓? CLR 綾誨瀷鍜?Win32 涔嬮棿鍦ㄦ牱寮忎笂鏈夊緢澶х殑涓嶅悓銆傛垜鍙互灝嗗叧浜庤繖涓棶棰樼殑寤鴻褰掔粨涓轟竴鍙ヨ瘽銆傚綋鎮ㄨ繘琛?P/Invoke 鏃訛紝涓嶈浣垮簲鐢ㄧ▼搴忛昏緫鐩存帴灞炰簬浠諱綍澶栭儴鏂規硶鎴栧叾涓殑鏋勪歡銆傚鏋滄偍閬靛驚榪欎釜灝忚鍒欙紝浠庨暱榪滅湅緇忓父浼氱渷鍘昏澶氱殑楹葷儲銆?/p>
鍥?1 涓殑浠g爜鏄劇ず浜嗘垜鎵璁ㄨ鐨?MessageBeep 澶栭儴鏂規硶鐨勬渶灝戦檮鍔犱唬鐮併傚浘 1 涓茍娌℃湁浠諱綍鏄捐憲鐨勫彉鍖栵紝鑰屽彧鏄鏃犲寘瑁呯殑澶栭儴鏂規硶榪涜涓浜涙櫘閫氱殑鏀硅繘錛岃繖鍙互浣垮伐浣滄洿鍔犺交鏉句竴浜涖備粠欏墮儴寮濮嬶紝鎮ㄤ細娉ㄦ剰鍒頒竴涓悕涓?Sound 鐨勫畬鏁寸被鍨嬶紝瀹冧笓鐢ㄤ簬 MessageBeep銆傚鏋滄垜闇瑕佷嬌鐢?Windows API 鍑芥暟 PlaySound 鏉ユ坊鍔犲鎾斁娉㈠艦鐨勬敮鎸侊紝鍒欏彲浠ラ噸鐢?Sound 綾誨瀷銆傜劧鑰岋紝鎴戜笉浼氬洜鍏紑鍗曚釜鍏叡闈欐佹柟娉曠殑綾誨瀷鑰岀敓姘斻傛瘯绔熻繖鍙槸搴旂敤紼嬪簭浠g爜鑰屽凡銆傝繕搴旇娉ㄦ剰鍒幫紝Sound 鏄瘑灝佺殑錛屽茍瀹氫箟浜嗕竴涓┖鐨勭鏈夋瀯閫犲嚱鏁般傝繖浜涘彧鏄竴浜涚粏鑺傦紝鐩殑鏄嬌鐢ㄦ埛涓嶄細閿欒鍦頒粠 Sound 媧劇敓綾繪垨鑰呭垱寤哄畠鐨勫疄渚嬨?/p>
鍥?1 涓殑浠g爜鐨勪笅涓涓壒寰佹槸錛孭/Invoke 鍑虹幇浣嶇疆鐨勫疄闄呭閮ㄦ柟娉曟槸 Sound 鐨勭鏈夋柟娉曘傝繖涓柟娉曞彧鏄敱鍏叡 MessageBeep 鏂規硶闂存帴鍏紑錛屽悗鑰呮帴鍙?BeepTypes 綾誨瀷鐨勫弬鏁般傝繖涓棿鎺ョ殑棰濆灞傛槸涓涓緢鍏抽敭鐨勭粏鑺傦紝瀹冩彁渚涗簡浠ヤ笅濂藉銆傞鍏堬紝搴旇鍦ㄧ被搴撲腑寮曞叆涓涓湭鏉ョ殑 beep 鎵樼鏂規硶錛屽彲浠ラ噸澶嶅湴閫氳繃鍏叡 MessageBeep 鏂規硶鏉ヤ嬌鐢ㄦ墭綆?API錛岃屼笉蹇呮洿鏀瑰簲鐢ㄧ▼搴忎腑鐨勫叾浣欎唬鐮併?/p>
璇ュ寘瑁呮柟娉曠殑絎簩涓ソ澶勬槸錛氬綋鎮ㄨ繘琛?P/Invoke 璋冪敤鏃訛紝鎮ㄦ斁寮冧簡鍏嶅彈璁塊棶鍐茬獊鍜屽叾浠栦綆綰х牬鍧忕殑鏉冨埄錛岃繖閫氬父鏄敱 CLR 鎻愪緵鐨勩傜紦鍐叉柟娉曞彲浠ヤ繚鎶ゆ偍鐨勫簲鐢ㄧ▼搴忕殑鍏朵綑閮ㄥ垎鍏嶅彈璁塊棶鍐茬獊鍙婄被浼奸棶棰樼殑褰卞搷錛堝嵆浣垮畠涓嶅仛浠諱綍浜嬭屽彧鏄紶閫掑弬鏁幫級銆傝緙撳啿鏂規硶灝嗙敱 P/Invoke 璋冪敤寮曞叆鐨勪換浣曟綔鍦ㄧ殑閿欒鏈湴鍖栥?/p>
灝嗙鏈夊閮ㄦ柟娉曢殣钘忓湪鍏叡鍖呰鍚庨潰鐨勭涓夊悓鏃朵篃鏄渶鍚庣殑涓涓ソ澶勬槸錛屾彁渚涗簡鍚戣鏂規硶娣誨姞涓浜涙渶灝忕殑 CLR 鏍峰紡鐨勬満浼氥備緥濡傦紝鍦ㄥ浘 1 涓紝鎴戝皢 Windows API 鍑芥暟榪斿洖鐨?Boolean 澶辮觸杞崲鎴愭洿鍍?CLR 鐨勫紓甯搞傛垜榪樺畾涔変簡涓涓悕涓?BeepTypes 鐨勬灇涓劇被鍨嬶紝瀹冪殑鎴愬憳瀵瑰簲浜庡悓璇?Windows API 涓璧蜂嬌鐢ㄧ殑瀹氫箟鍊箋傜敱浜?C# 涓嶆敮鎸佸畾涔夛紝鍥犳鍙互浣跨敤鎵樼鏋氫婦綾誨瀷鏉ラ伩鍏嶅夠鏁板悜鏁翠釜搴旂敤紼嬪簭浠g爜鎵╂暎銆?/p>
鍖呰鏂規硶鐨勬渶鍚庝竴涓ソ澶勫浜庣畝鍗曠殑 Windows API 鍑芥暟錛堝 MessageBeep錛夎瘹鐒舵槸寰笉瓚抽亾鐨勩備絾鏄綋鎮ㄥ紑濮嬭皟鐢ㄦ洿澶嶆潅鐨勯潪鎵樼鍑芥暟鏃訛紝鎮ㄤ細鍙戠幇錛屾墜鍔ㄥ皢 Windows API 鏍峰紡杞崲鎴愬 CLR 鏇村姞鍙嬪ソ鐨勬柟娉曟墍甯︽潵鐨勫ソ澶勪細瓚婃潵瓚婂銆傝秺鏄墦綆楀湪鏁翠釜搴旂敤紼嬪簭涓噸鐢?interop 鍔熻兘錛岃秺鏄簲璇ヨ鐪熷湴鑰冭檻鍖呰鐨勮璁°傚悓鏃舵垜璁や負錛屽湪闈為潰鍚戝璞$殑闈欐佸寘瑁呮柟娉曚腑浣跨敤瀵?CLR 鍙嬪ソ鐨勫弬鏁頒篃騫墮潪涓嶅彲浠ャ?/p>
DLL Import 灞炴?/p>
鐜板湪鏄洿娣卞叆鍦拌繘琛屾帰璁ㄧ殑鏃跺欎簡銆傚湪瀵規墭綆′唬鐮佽繘琛?P/Invoke 璋冪敤鏃訛紝DllImportAttribute 綾誨瀷鎵紨鐫閲嶈鐨勮鑹層侱llImportAttribute 鐨勪富瑕佷綔鐢ㄦ槸緇?CLR 鎸囩ず鍝釜 DLL 瀵煎嚭鎮ㄦ兂瑕佽皟鐢ㄧ殑鍑芥暟銆傜浉鍏?DLL 鐨勫悕縐拌浣滀負涓涓瀯閫犲嚱鏁板弬鏁頒紶閫掔粰 DllImportAttribute銆?/p>
濡傛灉鎮ㄦ棤娉曡偗瀹氬摢涓?DLL 瀹氫箟浜嗘偍瑕佷嬌鐢ㄧ殑 Windows API 鍑芥暟錛孭latform SDK 鏂囨。灝嗕負鎮ㄦ彁渚涙渶濂界殑甯姪璧勬簮銆傚湪 Windows API 鍑芥暟涓婚鏂囧瓧涓磋繎緇撳熬鐨勪綅緗紝SDK 鏂囨。鎸囧畾浜?C 搴旂敤紼嬪簭瑕佷嬌鐢ㄨ鍑芥暟蹇呴』閾炬帴鐨?.lib 鏂囦歡銆傚湪鍑犱箮鎵鏈夌殑鎯呭喌涓嬶紝璇?.lib 鏂囦歡鍏鋒湁涓庡畾涔夎鍑芥暟鐨勭郴緇?DLL 鏂囦歡鐩稿悓鐨勫悕縐般備緥濡傦紝濡傛灉璇ュ嚱鏁伴渶瑕?C 搴旂敤紼嬪簭閾炬帴鍒? Kernel32.lib錛屽垯璇ュ嚱鏁板氨瀹氫箟鍦?Kernel32.dll 涓傛偍鍙互鍦?MessageBeep 涓壘鍒版湁鍏?MessageBeep 鐨?Platform SDK 鏂囨。涓婚銆傚湪璇ヤ富棰樼粨灝懼錛屾偍浼氭敞鎰忓埌瀹冩寚鍑哄簱鏂囦歡鏄?User32.lib錛涜繖琛ㄦ槑 MessageBeep 鏄粠 User32.dll 涓鍑虹殑銆?/p>
鍙夌殑 DllImportAttribute 灞炴?/p>
闄や簡鎸囧嚭瀹夸富 DLL 澶栵紝DllImportAttribute 榪樺寘鍚簡涓浜涘彲閫夊睘鎬э紝鍏朵腑鍥涗釜鐗瑰埆鏈夎叮錛欵ntryPoint銆丆harSet銆丼etLastError 鍜?CallingConvention銆?/p>
EntryPoint 鍦ㄤ笉甯屾湜澶栭儴鎵樼鏂規硶鍏鋒湁涓?DLL 瀵煎嚭鐩稿悓鐨勫悕縐扮殑鎯呭喌涓嬶紝鍙互璁劇疆璇ュ睘鎬ф潵鎸囩ず瀵煎嚭鐨?DLL 鍑芥暟鐨勫叆鍙g偣鍚嶇О銆傚綋鎮ㄥ畾涔変袱涓皟鐢ㄧ浉鍚岄潪鎵樼鍑芥暟鐨勫閮ㄦ柟娉曟椂錛岃繖鐗瑰埆鏈夌敤銆傚彟澶栵紝鍦?Windows 涓繕鍙互閫氳繃瀹冧滑鐨勫簭鍙峰肩粦瀹氬埌瀵煎嚭鐨? DLL 鍑芥暟銆傚鏋滄偍闇瑕佽繖鏍峰仛錛屽垯璇稿“#1”鎴?#8220;#129”鐨?EntryPoint 鍊兼寚紺?DLL 涓潪鎵樼鍑芥暟鐨勫簭鍙峰艱屼笉鏄嚱鏁板悕銆?/p>
CharSet 瀵逛簬瀛楃闆嗭紝騫墮潪鎵鏈夌増鏈殑 Windows 閮芥槸鍚屾牱鍒涘緩鐨勩俉indows 9x 緋誨垪浜у搧緙哄皯閲嶈鐨?Unicode 鏀寔錛岃?Windows NT 鍜?Windows CE 緋誨垪鍒欎竴寮濮嬪氨浣跨敤 Unicode銆傚湪榪欎簺鎿嶄綔緋葷粺涓婅繍琛岀殑 CLR 灝哢nicode 鐢ㄤ簬 String 鍜?Char 鏁版嵁鐨勫唴閮ㄨ〃紺恒備絾涔熶笉蹇呮媴蹇?鈥?褰撹皟鐢?Windows 9x API 鍑芥暟鏃訛紝CLR 浼氳嚜鍔ㄨ繘琛屽繀瑕佺殑杞崲錛屽皢鍏朵粠 Unicode杞崲涓?ANSI銆?/p>
濡傛灉 DLL 鍑芥暟涓嶄互浠諱綍鏂瑰紡澶勭悊鏂囨湰錛屽垯鍙互蹇界暐 DllImportAttribute 鐨?CharSet 灞炴с傜劧鑰岋紝褰?Char 鎴?String 鏁版嵁鏄瓑寮忕殑涓閮ㄥ垎鏃訛紝搴旇灝?CharSet 灞炴ц緗負 CharSet.Auto銆傝繖鏍峰彲浠ヤ嬌 CLR 鏍規嵁瀹夸富 OS 浣跨敤閫傚綋鐨勫瓧絎﹂泦銆傚鏋滄病鏈夋樉寮忓湴璁劇疆 CharSet 灞炴э紝鍒欏叾榛樿鍊間負 CharSet.Ansi銆傝繖涓粯璁ゅ兼槸鏈夌己鐐圭殑錛屽洜涓哄浜庡湪 Windows 2000銆乄indows XP 鍜?Windows NT® 涓婅繘琛岀殑 interop 璋冪敤錛屽畠浼氭秷鏋佸湴褰卞搷鏂囨湰鍙傛暟灝侀佸鐞嗙殑鎬ц兘銆?/p>
搴旇鏄懼紡鍦伴夋嫨 CharSet.Ansi 鎴?CharSet.Unicode 鐨?CharSet 鍊艱屼笉鏄嬌鐢?CharSet.Auto 鐨勫敮涓鎯呭喌鏄細鎮ㄦ樉寮忓湴鎸囧畾浜嗕竴涓鍑哄嚱鏁幫紝鑰岃鍑芥暟鐗瑰畾浜庤繖涓ょ Win32 OS 涓殑鏌愪竴縐嶃俁eadDirectoryChangesW API 鍑芥暟灝辨槸榪欐牱鐨勪竴涓緥瀛愶紝瀹冨彧瀛樺湪浜庡熀浜?Windows NT 鐨勬搷浣滅郴緇熶腑錛屽茍涓斿彧鏀寔 Unicode錛涘湪榪欑鎯呭喌涓嬶紝鎮ㄥ簲璇ユ樉寮忓湴浣跨敤 CharSet.Unicode銆?/p>
鏈夋椂錛學indows API 鏄惁鏈夊瓧絎﹂泦鍏崇郴騫朵笉鏄庢樉銆備竴縐嶅喅涓嶄細鏈夐敊鐨勭‘璁ゆ柟娉曟槸鍦?Platform SDK 涓鏌ヨ鍑芥暟鐨?C 璇█澶存枃浠躲傦紙濡傛灉鎮ㄦ棤娉曡偗瀹氳鐪嬪摢涓ご鏂囦歡錛屽垯鍙互鏌ョ湅 Platform SDK 鏂囨。涓垪鍑虹殑姣忎釜 API 鍑芥暟鐨勫ご鏂囦歡銆傦級濡傛灉鎮ㄥ彂鐜拌 API 鍑芥暟紜疄瀹氫箟涓轟竴涓槧灝勫埌浠?A 鎴?W 緇撳熬鐨勫嚱鏁板悕鐨勫畯錛屽垯瀛楃闆嗕笌鎮ㄥ皾璇曡皟鐢ㄧ殑鍑芥暟鏈夊叧緋匯俉indows API 鍑芥暟鐨勪竴涓緥瀛愭槸鍦? WinUser.h 涓0鏄庣殑 GetMessage API錛屾偍涔熻浼氭儕璁跺湴鍙戠幇瀹冩湁 A 鍜?W 涓ょ鐗堟湰銆?/p>
SetLastError 閿欒澶勭悊闈炲父閲嶈錛屼絾鍦ㄧ紪紼嬫椂緇忓父琚仐蹇樸傚綋鎮ㄨ繘琛?P/Invoke 璋冪敤鏃訛紝涔熶細闈復鍏朵粬鐨勬寫鎴?鈥?澶勭悊鎵樼浠g爜涓?Windows API 閿欒澶勭悊鍜屽紓甯鎬箣闂寸殑鍖哄埆銆傛垜鍙互緇欐偍涓鐐瑰緩璁?/p>
濡傛灉鎮ㄦ鍦ㄤ嬌鐢?P/Invoke 璋冪敤 Windows API 鍑芥暟錛岃屽浜庤鍑芥暟錛屾偍浣跨敤 GetLastError 鏉ユ煡鎵炬墿灞曠殑閿欒淇℃伅錛屽垯搴旇鍦ㄥ閮ㄦ柟娉曠殑 DllImportAttribute 涓皢 SetLastError 灞炴ц緗負 true銆傝繖閫傜敤浜庡ぇ澶氭暟澶栭儴鏂規硶銆?/p>
榪欎細瀵艱嚧 CLR 鍦ㄦ瘡嬈¤皟鐢ㄥ閮ㄦ柟娉曚箣鍚庣紦瀛樼敱 API 鍑芥暟璁劇疆鐨勯敊璇傜劧鍚庯紝鍦ㄥ寘瑁呮柟娉曚腑錛屽彲浠ラ氳繃璋冪敤綾誨簱鐨? System.Runtime.InteropServices.Marshal 綾誨瀷涓畾涔夌殑 Marshal.GetLastWin32Error 鏂規硶鏉ヨ幏鍙栫紦瀛樼殑閿欒鍊箋傛垜鐨勫緩璁槸媯鏌ヨ繖浜涙湡鏈涙潵鑷?API 鍑芥暟鐨勯敊璇鹼紝騫朵負榪欎簺鍊煎紩鍙戜竴涓彲鎰熺煡鐨勫紓甯搞傚浜庡叾浠栨墍鏈夊け璐ユ儏鍐碉紙鍖呮嫭鏍規湰灝辨病鎰忔枡鍒扮殑澶辮觸鎯呭喌錛夛紝鍒欏紩鍙戝湪 System.ComponentModel 鍛藉悕絀洪棿涓畾涔夌殑 Win32Exception錛屽茍灝? Marshal.GetLastWin32Error 榪斿洖鐨勫間紶閫掔粰瀹冦傚鏋滄偍鍥炲ご鐪嬩竴涓嬪浘 1 涓殑浠g爜錛屾偍浼氱湅鍒版垜鍦?extern MessageBeep 鏂規硶鐨勫叕鍏卞寘瑁呬腑灝遍噰鐢ㄤ簡榪欑鏂規硶銆?/p>
CallingConvention 鎴戝皢鍦ㄦ浠嬬粛鐨勬渶鍚庝篃鍙兘鏄渶涓嶉噸瑕佺殑涓涓?DllImportAttribute 灞炴ф槸 CallingConvention銆傞氳繃姝ゅ睘鎬э紝鍙互緇?CLR 鎸囩ず搴旇灝嗗摢縐嶅嚱鏁拌皟鐢ㄧ害瀹氱敤浜庡爢鏍堜腑鐨勫弬鏁般侰allingConvention.Winapi 鐨勯粯璁ゅ兼槸鏈濂界殑閫夋嫨錛屽畠鍦ㄥぇ澶氭暟鎯呭喌涓嬮兘鍙銆傜劧鑰岋紝濡傛灉璇ヨ皟鐢ㄤ笉璧蜂綔鐢紝鍒欏彲浠ユ鏌?Platform SDK 涓殑澹版槑澶存枃浠訛紝鐪嬬湅鎮ㄨ皟鐢ㄧ殑 API 鍑芥暟鏄惁鏄竴涓笉絎﹀悎璋冪敤綰﹀畾鏍囧噯鐨勫紓甯?API銆?/p>
閫氬父錛屾湰鏈哄嚱鏁幫紙渚嬪 Windows API 鍑芥暟鎴?C- 榪愯鏃?DLL 鍑芥暟錛夌殑璋冪敤綰﹀畾鎻忚堪浜嗗浣曞皢鍙傛暟鎺ㄥ叆綰跨▼鍫嗘爤鎴栦粠綰跨▼鍫嗘爤涓竻闄ゃ傚ぇ澶氭暟 Windows API 鍑芥暟閮芥槸棣栧厛灝嗗嚱鏁扮殑鏈鍚庝竴涓弬鏁版帹鍏ュ爢鏍堬紝鐒跺悗鐢辮璋冪敤鐨勫嚱鏁拌礋璐f竻鐞嗚鍫嗘爤銆傜浉鍙嶏紝璁稿 C-榪愯鏃?DLL 鍑芥暟閮借瀹氫箟涓烘寜鐓ф柟娉曞弬鏁板湪鏂規硶絳懼悕涓嚭鐜扮殑欏哄簭灝嗗叾鎺ㄥ叆鍫嗘爤錛屽皢鍫嗘爤娓呯悊宸ヤ綔浜ょ粰璋冪敤鑰呫?/p>
騫歌繍鐨勬槸錛岃璁?P/Invoke 璋冪敤宸ヤ綔鍙渶瑕佽澶栧洿璁懼鐞嗚В璋冪敤綰﹀畾鍗沖彲銆傞氬父錛屼粠榛樿鍊? CallingConvention.Winapi 寮濮嬫槸鏈濂界殑閫夋嫨銆傜劧鍚庯紝鍦?C 榪愯鏃?DLL 鍑芥暟鍜屽皯鏁板嚱鏁頒腑錛屽彲鑳介渶瑕佸皢綰﹀畾鏇存敼涓? CallingConvention.Cdecl銆?/p>
鏁版嵁灝侀佸鐞?/p>
鏁版嵁灝侀佸鐞嗘槸 P/Invoke 鍏鋒湁鎸戞垬鎬х殑鏂歸潰銆傚綋鍦ㄦ墭綆″拰闈炴墭綆′唬鐮佷箣闂翠紶閫掓暟鎹椂錛孋LR 閬靛驚璁稿瑙勫垯錛屽緢灝戞湁寮鍙戜漢鍛樹細緇忓父閬囧埌瀹冧滑鐩磋嚦鍙皢榪欎簺瑙勫垯璁頒綇銆傞櫎闈炴偍鏄竴鍚嶇被搴撳紑鍙戜漢鍛橈紝鍚﹀垯鍦ㄩ氬父鎯呭喌涓嬫病鏈夊繀瑕佹帉鎻″叾緇嗚妭銆備負浜嗘渶鏈夋晥鍦板湪 CLR 涓婁嬌鐢?P/Invoke錛屽嵆浣垮彧鍋跺皵闇瑕?interop 鐨勫簲鐢ㄧ▼搴忓紑鍙戜漢鍛樹粛鐒跺簲璇ョ悊瑙f暟鎹皝閫佸鐞嗙殑涓浜涘熀紜鐭ヨ瘑銆?/p>
鍦ㄦ湰鏈堜笓鏍忕殑鍓╀綑閮ㄥ垎涓紝鎴戝皢璁ㄨ綆鍗曟暟瀛楀拰瀛楃涓叉暟鎹殑鏁版嵁灝侀佸鐞嗐傛垜灝嗕粠鏈鍩烘湰鐨勬暟瀛楁暟鎹皝閫佸鐞嗗紑濮嬶紝鐒跺悗浠嬬粛綆鍗曠殑鎸囬拡灝侀佸鐞嗗拰瀛楃涓插皝閫佸鐞嗐?/p>
灝侀佹暟瀛楀拰閫昏緫鏍囬噺
Windows OS 澶ч儴鍒嗘槸鐢?C 緙栧啓鐨勩傚洜姝わ紝Windows API 鎵鐢ㄥ埌鐨勬暟鎹被鍨嬭涔堟槸 C 綾誨瀷錛岃涔堟槸閫氳繃綾誨瀷瀹氫箟鎴栧畯瀹氫箟閲嶆柊鏍囪鐨?C 綾誨瀷銆傝鎴戜滑鐪嬬湅娌℃湁鎸囬拡鐨勬暟鎹皝閫佸鐞嗐傜畝鍗曡搗瑙侊紝棣栧厛閲嶇偣璁ㄨ鐨勬槸鏁板瓧鍜屽竷灝斿箋?/p>
褰撻氳繃鍊煎悜 Windows API 鍑芥暟浼犻掑弬鏁版椂錛岄渶瑕佺煡閬撲互涓嬮棶棰樼殑絳旀錛?
• |
鏁版嵁浠庢牴鏈笂璁叉槸鏁村瀷鐨勮繕鏄誕鐐瑰瀷鐨勶紵 |
• |
濡傛灉鏁版嵁鏄暣鍨嬬殑錛屽垯瀹冩槸鏈夌鍙風殑榪樻槸鏃犵鍙風殑錛? |
• |
濡傛灉鏁版嵁鏄暣鍨嬬殑錛屽垯瀹冪殑浣嶆暟鏄灝戯紵 |
• |
濡傛灉鏁版嵁鏄誕鐐瑰瀷鐨勶紝鍒欏畠鏄崟綺懼害鐨勮繕鏄弻綺懼害鐨勶紵 |
鏈夋椂絳旀寰堟槑鏄撅紝浣嗘湁鏃跺嵈涓嶆槑鏄俱俉indows API 浠ュ悇縐嶆柟寮忛噸鏂板畾涔変簡鍩烘湰鐨?C 鏁版嵁綾誨瀷銆傚浘 2 鍒楀嚭浜?C 鍜?Win32 鐨勪竴浜涘叕鍏辨暟鎹被鍨嬪強鍏惰鑼冿紝浠ュ強涓涓叿鏈夊尮閰嶈鑼冪殑鍏叡璇█榪愯搴撶被鍨嬨?
閫氬父錛屽彧瑕佹偍閫夋嫨涓涓叾瑙勮寖涓庤鍙傛暟鐨?Win32 綾誨瀷鐩稿尮閰嶇殑 CLR 綾誨瀷錛屾偍鐨勪唬鐮佸氨鑳藉姝e父宸ヤ綔銆備笉榪囦篃鏈変竴浜涚壒渚嬨備緥濡傦紝鍦? Windows API 涓畾涔夌殑 BOOL 綾誨瀷鏄竴涓湁絎﹀彿鐨?32 浣嶆暣鍨嬨傜劧鑰岋紝BOOL 鐢ㄤ簬鎸囩ず Boolean 鍊?true 鎴? false銆傝櫧鐒舵偍涓嶇敤灝?BOOL 鍙傛暟浣滀負 System.Int32 鍊煎皝閫侊紝浣嗘槸濡傛灉浣跨敤 System.Boolean 綾誨瀷錛屽氨浼氳幏寰楁洿鍚堥傜殑鏄犲皠銆傚瓧絎︾被鍨嬬殑鏄犲皠綾諱技浜?BOOL錛屽洜涓烘湁涓涓壒瀹氱殑 CLR 綾誨瀷 (System.Char) 鎸囧嚭瀛楃鐨勫惈涔夈?/p>
鍦ㄤ簡瑙h繖浜涗俊鎭箣鍚庯紝閫愭浠嬬粛紺轟緥鍙兘鏄湁甯姪鐨勩備緷鐒墮噰鐢?beep 涓婚浣滀負渚嬪瓙錛岃鎴戜滑鏉ヨ瘯涓涓?Kernel32.dll 浣庣駭 Beep錛屽畠浼氶氳繃璁$畻鏈虹殑鎵0鍣ㄥ彂鐢熷槦澹般傝繖涓柟娉曠殑 Platform SDK 鏂囨。鍙互鍦?Beep 涓壘鍒般傛湰鏈?API 鎸変互涓嬫柟寮忚繘琛岃褰曪細
BOOL Beep(
DWORD dwFreq, // Frequency
DWORD dwDuration // Duration in milliseconds
);
鍦ㄥ弬鏁板皝閫佸鐞嗘柟闈紝鎮ㄧ殑宸ヤ綔鏄簡瑙d粈涔?CLR 鏁版嵁綾誨瀷涓?Beep API 鍑芥暟鎵浣跨敤鐨?DWORD 鍜?BOOL 鏁版嵁綾誨瀷鐩稿吋瀹廣傚洖欏句竴涓嬪浘 2 涓殑鍥捐〃錛屾偍灝嗙湅鍒?DWORD 鏄竴涓?32 浣嶇殑鏃犵鍙鋒暣鏁板鹼紝濡傚悓 CLR 綾誨瀷 System.UInt32銆傝繖鎰忓懗鐫鎮ㄥ彲浠ヤ嬌鐢?UInt32 鍊間綔涓洪佸線 Beep 鐨勪袱涓弬鏁般侭OOL 榪斿洖鍊兼槸涓涓潪甯告湁瓚g殑鎯呭喌錛屽洜涓鴻鍥捐〃鍛婅瘔鎴戜滑錛屽湪 Win32 涓紝BOOL 鏄竴涓?32 浣嶇殑鏈夌鍙鋒暣鏁般傚洜姝わ紝鎮ㄥ彲浠ヤ嬌鐢? System.Int32 鍊間綔涓烘潵鑷?Beep 鐨勮繑鍥炲箋傜劧鑰岋紝CLR 涔熷畾涔変簡 System.Boolean 綾誨瀷浣滀負 Boolean 鍊肩殑璇箟錛屾墍浠ュ簲璇ヤ嬌鐢ㄥ畠鏉ユ浛浠c侰LR 榛樿灝?System.Boolean 鍊煎皝閫佷負 32 浣嶇殑鏈夌鍙鋒暣鏁般傛澶勬墍鏄劇ず鐨勫閮ㄦ柟娉曞畾涔夋槸鐢ㄤ簬 Beep 鐨勭粨鏋?P/Invoke 鏂規硶錛?
[DllImport("Kernel32.dll", SetLastError=true)]
static extern Boolean Beep(
UInt32 frequency, UInt32 duration);
鎸囬拡鍙傛暟
璁稿 Windows API 鍑芥暟灝嗘寚閽堜綔涓哄畠浠殑涓涓垨澶氫釜鍙傛暟銆傛寚閽堝鍔犱簡灝侀佹暟鎹殑澶嶆潅鎬э紝鍥犱負瀹冧滑澧炲姞浜嗕竴涓棿鎺ュ眰銆傚鏋滄病鏈夋寚閽堬紝鎮ㄥ彲浠ラ氳繃鍊煎湪綰跨▼鍫嗘爤涓紶閫掓暟鎹傛湁浜嗘寚 閽堬紝鍒欏彲浠ラ氳繃寮曠敤浼犻掓暟鎹紝鏂規硶鏄皢璇ユ暟鎹殑鍐呭瓨鍦板潃鎺ㄥ叆綰跨▼鍫嗘爤涓傜劧鍚庯紝鍑芥暟閫氳繃鍐呭瓨鍦板潃闂存帴璁塊棶鏁版嵁銆備嬌鐢ㄦ墭綆′唬鐮佽〃紺烘闄勫姞闂存帴灞傜殑鏂瑰紡鏈夊 縐嶃?/p>
鍦?C# 涓紝濡傛灉灝嗘柟娉曞弬鏁板畾涔変負 ref 鎴?out錛屽垯鏁版嵁閫氳繃寮曠敤鑰屼笉鏄氳繃鍊間紶閫掋傚嵆浣挎偍娌℃湁浣跨敤 Interop 涔熸槸榪欐牱錛屼絾鍙槸浠庝竴涓墭綆℃柟娉曡皟鐢ㄥ埌鍙︿竴涓墭綆℃柟娉曘備緥濡傦紝濡傛灉閫氳繃 ref 浼犻?System.Int32 鍙傛暟錛屽垯鍦ㄧ嚎紼嬪爢鏍堜腑浼犻掔殑鏄鏁版嵁鐨勫湴鍧錛岃屼笉鏄暣鏁板兼湰韜備笅闈㈡槸涓涓畾涔変負閫氳繃寮曠敤鎺ユ敹鏁存暟鍊肩殑鏂規硶鐨勭ず渚嬶細
void FlipInt32(ref Int32 num){
num = -num;
}
榪欓噷錛孎lipInt32 鏂規硶鑾峰彇涓涓?Int32 鍊肩殑鍦板潃銆佽闂暟鎹佸瀹冩眰鍙嶏紝鐒跺悗灝嗘眰鍙嶈繃鐨勫艱祴緇欏師濮嬪彉閲忋傚湪浠ヤ笅浠g爜涓紝FlipInt32 鏂規硶浼氬皢璋冪敤紼嬪簭鐨勫彉閲?x 鐨勫間粠 10 鏇存敼涓?-10錛?
Int32 x = 10;
FlipInt32(ref x);
鍦ㄦ墭綆′唬鐮佷腑鍙互閲嶇敤榪欑鑳藉姏錛屽皢鎸囬拡浼犻掔粰闈炴墭綆′唬鐮併備緥濡傦紝FileEncryptionStatus API 鍑芥暟浠?32 浣嶆棤絎﹀彿浣嶆帺鐮佺殑褰㈠紡榪斿洖鏂囦歡鍔犲瘑鐘舵併傝 API 鎸変互涓嬫墍紺烘柟寮忚繘琛岃褰曪細
BOOL FileEncryptionStatus(
LPCTSTR lpFileName, // file name
LPDWORD lpStatus // encryption status
);
璇鋒敞鎰忥紝璇ュ嚱鏁板茍涓嶄嬌鐢ㄥ畠鐨勮繑鍥炲艱繑鍥炵姸鎬侊紝鑰屾槸榪斿洖涓涓?Boolean 鍊鹼紝鎸囩ず璋冪敤鏄惁鎴愬姛銆傚湪鎴愬姛鐨勬儏鍐典笅錛屽疄闄呯殑鐘舵佸兼槸閫氳繃絎簩涓弬鏁拌繑鍥炵殑銆傚畠鐨勫伐浣滄柟寮忔槸璋冪敤紼嬪簭鍚戣鍑芥暟浼犻掓寚鍚戜竴涓?DWORD 鍙橀噺鐨勬寚閽堬紝鑰岃 API 鍑芥暟鐢ㄧ姸鎬佸煎~鍏呮寚鍚戠殑鍐呭瓨浣嶇疆銆備互涓嬩唬鐮佺墖孌墊樉紺轟簡涓涓皟鐢ㄩ潪鎵樼 FileEncryptionStatus 鍑芥暟鐨勫彲鑳藉閮ㄦ柟娉曞畾涔夛細
[DllImport("Advapi32.dll", CharSet=CharSet.Auto)]
static extern Boolean FileEncryptionStatus(String filename,
out UInt32 status);
璇ュ畾涔変嬌鐢?out 鍏抽敭瀛楁潵涓?UInt32 鐘舵佸兼寚紺?by-ref 鍙傛暟銆傝繖閲屾垜涔熷彲浠ラ夋嫨 ref 鍏抽敭瀛楋紝瀹為檯涓婂湪榪愯鏃朵細浜х敓鐩稿悓鐨勬満鍣ㄧ爜銆俹ut 鍏抽敭瀛楀彧鏄竴涓?by-ref 鍙傛暟鐨勮鑼冿紝瀹冨悜 C# 緙栬瘧鍣ㄦ寚紺烘墍浼犻掔殑鏁版嵁鍙湪琚皟鐢ㄧ殑鍑芥暟澶栭儴浼犻掋傜浉鍙嶏紝濡傛灉浣跨敤 ref 鍏抽敭瀛楋紝鍒欑紪璇戝櫒浼氬亣瀹氭暟鎹彲浠ュ湪琚皟鐢ㄧ殑鍑芥暟鐨勫唴閮ㄥ拰澶栭儴浼犻掋?/p>
鎵樼浠g爜涓?out 鍜?ref 鍙傛暟鐨勫彟涓涓緢濂界殑鏂歸潰鏄紝鍦板潃浣滀負 by-ref 鍙傛暟浼犻掔殑鍙橀噺鍙互鏄嚎紼嬪爢鏍堜腑鐨勪竴涓湰鍦板彉閲忋佷竴涓被鎴栫粨鏋勭殑鍏冪礌錛屼篃鍙互鏄叿鏈夊悎閫傛暟鎹被鍨嬬殑鏁扮粍涓殑涓涓厓绱犲紩鐢ㄣ傝皟鐢ㄧ▼搴忕殑榪欑鐏墊椿鎬т嬌寰? by-ref 鍙傛暟鎴愪負灝侀佺紦鍐插尯鎸囬拡浠ュ強鍗曟暟鍊兼寚閽堢殑涓涓緢濂界殑璧風偣銆傚彧鏈夊湪鎴戝彂鐜?ref 鎴?out 鍙傛暟涓嶇鍚堟垜鐨勯渶瑕佺殑鎯呭喌涓嬶紝鎴戞墠浼氳冭檻灝嗘寚閽堝皝閫佷負鏇村鏉傜殑 CLR 綾誨瀷錛堜緥濡傜被鎴栨暟緇勫璞★級銆?/p>
濡傛灉鎮ㄤ笉鐔熸倝 C 璇硶鎴栬呰皟鐢?Windows API 鍑芥暟錛屾湁鏃跺緢闅劇煡閬撲竴涓柟娉曞弬鏁版槸鍚﹂渶瑕佹寚閽堛備竴涓父瑙佺殑鎸囩ず絎︽槸鐪嬪弬鏁扮被鍨嬫槸鍚︽槸浠ュ瓧姣?P 鎴?LP 寮澶寸殑錛屼緥濡?LPDWORD 鎴? PINT銆傚湪榪欎袱涓緥瀛愪腑錛孡P 鍜?P 鎸囩ず鍙傛暟鏄竴涓寚閽堬紝鑰屽畠浠寚鍚戠殑鏁版嵁綾誨瀷鍒嗗埆涓?DWORD 鎴? INT銆傜劧鑰岋紝鍦ㄦ湁浜涙儏鍐典笅錛屽彲浠ョ洿鎺ヤ嬌鐢?C 璇█璇硶涓殑鏄熷彿 (*) 灝?API 鍑芥暟瀹氫箟涓烘寚閽堛備互涓嬩唬鐮佺墖孌靛睍紺轟簡榪欐柟闈㈢殑紺轟緥錛?
void TakesAPointer(DWORD* pNum);
鍙互鐪嬪埌錛屼笂榪板嚱鏁扮殑鍞竴涓涓弬鏁版槸鎸囧悜 DWORD 鍙橀噺鐨勬寚閽堛?
褰撻氳繃 P/Invoke 灝侀佹寚閽堟椂錛宺ef 鍜?out 鍙敤浜庢墭綆′唬鐮佷腑鐨勫肩被鍨嬨傚綋涓涓弬鏁扮殑 CLR 綾誨瀷浣跨敤 struct 鍏抽敭瀛楀畾涔夋椂錛屽彲浠ヨ涓鴻鍙傛暟鏄竴涓肩被鍨嬨侽ut 鍜?ref 鐢ㄤ簬灝侀佹寚鍚戣繖浜涙暟鎹被鍨嬬殑鎸囬拡錛屽洜涓洪氬父鍊肩被鍨嬪彉閲忔槸瀵硅薄鎴栨暟鎹紝鑰屽湪鎵樼浠g爜涓茍娌℃湁瀵瑰肩被鍨嬬殑寮曠敤銆傜浉鍙嶏紝褰撳皝閫佸紩鐢ㄧ被鍨嬪璞℃椂錛屽茍涓嶉渶瑕? ref 鍜?out 鍏抽敭瀛楋紝鍥犱負鍙橀噺宸茬粡鏄璞$殑寮曠敤浜嗐?/p>
濡傛灉鎮ㄥ寮曠敤綾誨瀷鍜屽肩被鍨嬩箣闂寸殑宸埆涓嶆槸寰堢啛鎮夛紝璇鋒煡闃?2000 騫?12 鏈?鍙戣鐨?MSDN® Magazine錛屽湪 .NET 涓撴爮鐨勪富棰樹腑鍙互鎵懼埌鏇村淇℃伅銆傚ぇ澶氭暟 CLR 綾誨瀷閮芥槸寮曠敤綾誨瀷錛涚劧鑰岋紝闄や簡 System.String 鍜? System.Object錛屾墍鏈夌殑鍩哄厓綾誨瀷錛堜緥濡?System.Int32 鍜?System.Boolean錛夐兘鏄肩被鍨嬨?/p>
灝侀佷笉閫忔槑 (Opaque) 鎸囬拡錛氫竴縐嶇壒孌婃儏鍐?/p>
鏈夋椂鍦?Windows API 涓紝鏂規硶浼犻掓垨榪斿洖鐨勬寚閽堟槸涓嶉忔槑鐨勶紝榪欐剰鍛崇潃璇ユ寚閽堝間粠鎶鏈搴﹁鏄竴涓寚閽堬紝浣嗕唬鐮佸嵈涓嶇洿鎺ヤ嬌鐢ㄥ畠銆傜浉鍙嶏紝浠g爜灝嗚鎸囬拡榪斿洖緇?Windows 浠ヤ究闅忓悗榪涜閲嶇敤銆?/p>
涓涓潪甯稿父瑙佺殑渚嬪瓙灝辨槸鍙ユ焺鐨勬蹇點傚湪 Windows 涓紝鍐呴儴鏁版嵁緇撴瀯錛堜粠鏂囦歡鍒板睆騫曚笂鐨勬寜閽級鍦ㄥ簲鐢ㄧ▼搴忎唬鐮佷腑閮借〃紺轟負鍙ユ焺銆傚彞鏌勫叾瀹炲氨鏄笉閫忔槑鐨勬寚閽堟垨鏈夌潃鎸囬拡瀹藉害鐨勬暟鍊鹼紝搴旂敤紼嬪簭鐢ㄥ畠鏉ヨ〃紺哄唴閮ㄧ殑 OS 鏋勯犮?/p>
灝戞暟鎯呭喌涓嬶紝API 鍑芥暟涔熷皢涓嶉忔槑鎸囬拡瀹氫箟涓?PVOID 鎴?LPVOID 綾誨瀷銆傚湪 Windows API 鐨勫畾涔変腑錛岃繖浜涚被鍨嬫剰鎬濆氨鏄璇ユ寚閽堟病鏈夌被鍨嬨?/p>
褰撲竴涓笉閫忔槑鎸囬拡榪斿洖緇欐偍鐨勫簲鐢ㄧ▼搴忥紙鎴栬呮偍鐨勫簲鐢ㄧ▼搴忔湡鏈涘緱鍒頒竴涓笉閫忔槑鎸囬拡錛夋椂錛屾偍搴旇灝嗗弬鏁版垨榪斿洖鍊煎皝閫佷負 CLR 涓殑涓縐嶇壒孌婄被鍨?鈥? System.IntPtr銆傚綋鎮ㄤ嬌鐢?IntPtr 綾誨瀷鏃訛紝閫氬父涓嶄嬌鐢?out 鎴?ref 鍙傛暟錛屽洜涓?IntPtr 鎰忎負鐩存帴鎸佹湁鎸囬拡銆備笉榪囷紝濡傛灉鎮ㄥ皢涓涓寚閽堝皝閫佷負涓涓寚閽堬紝鍒欏 IntPtr 浣跨敤 by-ref 鍙傛暟鏄悎閫傜殑銆?/p>
鍦?CLR 綾誨瀷緋葷粺涓紝System.IntPtr 綾誨瀷鏈変竴涓壒孌婄殑灞炴с備笉鍍忕郴緇熶腑鐨勫叾浠栧熀綾誨瀷錛孖ntPtr 騫舵病鏈夊浐瀹氱殑澶у皬銆傜浉鍙嶏紝瀹冨湪榪愯鏃剁殑澶у皬鏄緷搴曞眰鎿嶄綔緋葷粺鐨勬甯告寚閽堝ぇ灝忚屽畾鐨勩傝繖鎰忓懗鐫鍦?32 浣嶇殑 Windows 涓紝IntPtr 鍙橀噺鐨勫搴︽槸 32 浣嶇殑錛岃屽湪 64 浣嶇殑 Windows 涓紝瀹炴椂緙栬瘧鍣ㄧ紪璇戠殑浠g爜浼氬皢 IntPtr 鍊肩湅浣?64 浣嶇殑鍊箋傚綋鍦ㄦ墭綆′唬鐮佸拰闈炴墭綆′唬鐮佷箣闂村皝閫佷笉閫忔槑鎸囬拡鏃訛紝榪欑鑷姩璋冭妭澶у皬鐨勭壒鐐瑰崄鍒嗘湁鐢ㄣ?/p>
璇瘋浣忥紝浠諱綍榪斿洖鎴栨帴鍙楀彞鏌勭殑 API 鍑芥暟鍏跺疄鎿嶄綔鐨勫氨鏄笉閫忔槑鎸囬拡銆傛偍鐨勪唬鐮佸簲璇ュ皢 Windows 涓殑鍙ユ焺灝侀佹垚 System.IntPtr 鍊箋?/p>
鎮ㄥ彲浠ュ湪鎵樼浠g爜涓皢 IntPtr 鍊煎己鍒惰漿鎹負 32 浣嶆垨 64 浣嶇殑鏁存暟鍊鹼紝鎴栧皢鍚庤呭己鍒惰漿鎹負鍓嶈呫傜劧鑰岋紝褰撲嬌鐢?Windows API 鍑芥暟鏃訛紝鍥犱負鎸囬拡搴旀槸涓嶉忔槑鐨勶紝鎵浠ラ櫎浜嗗瓨鍌ㄥ拰浼犻掔粰澶栭儴鏂規硶澶栵紝涓嶈兘灝嗗畠浠彟鍋氬畠鐢ㄣ傝繖縐?#8220;鍙檺瀛樺偍鍜屼紶閫?#8221;瑙勫垯鐨勪袱涓壒渚嬫槸褰撴偍闇瑕佸悜澶栭儴鏂規硶浼犻? null 鎸囬拡鍊煎拰闇瑕佹瘮杈?IntPtr 鍊間笌 null 鍊肩殑鎯呭喌銆備負浜嗗仛鍒拌繖涓鐐癸紝鎮ㄤ笉鑳藉皢闆跺己鍒惰漿鎹負 System.IntPtr錛岃屽簲璇ュ湪 IntPtr 綾誨瀷涓婁嬌鐢?Int32.Zero 闈欐佸叕鍏卞瓧孌碉紝浠ヤ究鑾峰緱鐢ㄤ簬姣旇緝鎴栬祴鍊肩殑 null 鍊箋?/p>
灝侀佹枃鏈?/p>
鍦ㄧ紪紼嬫椂緇忓父瑕佸鏂囨湰鏁版嵁榪涜澶勭悊銆傛枃鏈負 interop 鍒墮犱簡涓浜涢夯鐑︼紝榪欐湁涓や釜鍘熷洜銆傞鍏堬紝搴曞眰鎿嶄綔緋葷粺鍙兘浣跨敤 Unicode 鏉ヨ〃紺哄瓧絎︿覆錛屼篃鍙兘浣跨敤 ANSI銆傚湪鏋佸皯鏁版儏鍐典笅錛屼緥濡?MultiByteToWideChar API 鍑芥暟鐨勪袱涓弬鏁板湪瀛楃闆嗕笂鏄笉涓鑷寸殑銆?/p>
絎簩涓師鍥犳槸錛屽綋闇瑕佽繘琛?P/Invoke 鏃訛紝瑕佸鐞嗘枃鏈繕闇瑕佺壒鍒簡瑙e埌 C 鍜?CLR 澶勭悊鏂囨湰鐨勬柟寮忔槸涓嶅悓鐨勩傚湪 C 涓紝瀛楃涓插疄闄呬笂鍙槸涓涓瓧絎﹀兼暟緇勶紝閫氬父浠?null 浣滀負緇撴潫絎︺傚ぇ澶氭暟 Windows API 鍑芥暟鏄寜鐓т互涓嬫潯浠跺鐞嗗瓧絎︿覆鐨勶細瀵逛簬 ANSI錛屽皢鍏朵綔涓哄瓧絎﹀兼暟緇勶紱瀵逛簬 Unicode錛屽皢鍏朵綔涓哄瀛楃鍊兼暟緇勩?/p>
騫歌繍鐨勬槸錛孋LR 琚璁″緱鐩稿綋鐏墊椿錛屽綋灝侀佹枃鏈椂闂寰椾互杞繪澗瑙e喅錛岃屼笉鐢ㄥ湪鎰?Windows API 鍑芥暟鏈熸湜浠庢偍鐨勫簲鐢ㄧ▼搴忓緱鍒扮殑鏄粈涔堛傝繖閲屾槸涓浜涢渶瑕佽浣忕殑涓昏鑰冭檻浜嬮」錛?
• |
鏄偍鐨勫簲鐢ㄧ▼搴忓悜 API 鍑芥暟浼犻掓枃鏈暟鎹紝榪樻槸 API 鍑芥暟鍚戞偍鐨勫簲鐢ㄧ▼搴忚繑鍥炲瓧絎︿覆鏁版嵁錛熸垨鑰呬簩鑰呭吋鏈夛紵 |
• |
鎮ㄧ殑澶栭儴鏂規硶搴旇浣跨敤浠涔堟墭綆$被鍨嬶紵 |
• |
API 鍑芥暟鏈熸湜寰楀埌鐨勬槸浠涔堟牸寮忕殑闈炴墭綆″瓧絎︿覆錛?/p> |
鎴戜滑棣栧厛瑙g瓟鏈鍚庝竴涓棶棰樸傚ぇ澶氭暟 Windows API 鍑芥暟閮藉甫鏈?LPTSTR 鎴?LPCTSTR 鍊箋傦紙浠庡嚱鏁拌搴︾湅錛夊畠浠垎鍒槸鍙慨鏀瑰拰涓嶅彲淇敼鐨勭紦鍐插尯錛屽寘鍚互 null 緇撴潫鐨勫瓧絎︽暟緇勩?#8220;C”浠h〃甯告暟錛屾剰鍛崇潃浣跨敤璇ュ弬鏁頒俊鎭笉浼氫紶閫掑埌鍑芥暟澶栭儴銆侺PTSTR 涓殑“T”琛ㄦ槑璇ュ弬鏁板彲浠ユ槸 Unicode 鎴? ANSI錛屽彇鍐充簬鎮ㄩ夋嫨鐨勫瓧絎﹂泦鍜屽簳灞傛搷浣滅郴緇熺殑瀛楃闆嗐傚洜涓哄湪 Windows API 涓ぇ澶氭暟瀛楃涓插弬鏁伴兘鏄繖涓ょ綾誨瀷涔嬩竴錛屾墍浠ュ彧瑕佸湪 DllImportAttribute 涓夋嫨 CharSet.Auto錛孋LR 灝辨寜榛樿鐨勬柟寮忓伐浣溿?
鐒惰岋紝鏈変簺 API 鍑芥暟鎴栬嚜瀹氫箟鐨?DLL 鍑芥暟閲囩敤涓嶅悓鐨勬柟寮忚〃紺哄瓧絎︿覆銆傚鏋滄偍瑕佺敤鍒頒竴涓繖鏍風殑鍑芥暟錛屽氨鍙互閲囩敤 MarshalAsAttribute 淇グ澶栭儴鏂規硶鐨勫瓧絎︿覆鍙傛暟錛屽茍鎸囨槑涓縐嶄笉鍚屼簬榛樿 LPTSTR 鐨勫瓧絎︿覆鏍煎紡銆傛湁鍏? MarshalAsAttribute 鐨勬洿澶氫俊鎭紝璇峰弬闃呬綅浜?MarshalAsAttribute Class 鐨?Platform SDK 鏂囨。涓婚銆?/p>
鐜板湪璁╂垜浠湅涓涓嬪瓧絎︿覆淇℃伅鍦ㄦ偍鐨勪唬鐮佸拰闈炴墭綆″嚱鏁頒箣闂翠紶閫掔殑鏂瑰悜銆傛湁涓ょ鏂瑰紡鍙互鐭ラ亾澶勭悊瀛楃涓叉椂淇℃伅鐨勪紶閫掓柟鍚戙傜涓涓篃鏄渶鍙潬鐨勪竴涓柟娉曞氨 鏄鍏堢悊瑙e弬鏁扮殑鐢ㄩ斻備緥濡傦紝鎮ㄦ璋冪敤涓涓弬鏁幫紝瀹冪殑鍚嶇О綾諱技 CreateMutex 騫跺甫鏈変竴涓瓧絎︿覆錛屽垯鍙互鎯沖儚璇ュ瓧絎︿覆淇℃伅鏄粠搴旂敤紼嬪簭鍚? API 鍑芥暟浼犻掔殑銆傚悓鏃訛紝濡傛灉鎮ㄨ皟鐢?GetUserName錛屽垯璇ュ嚱鏁扮殑鍚嶇О琛ㄦ槑瀛楃涓蹭俊鎭槸浠庤鍑芥暟鍚戞偍鐨勫簲鐢ㄧ▼搴忎紶閫掔殑銆?/p>
闄や簡榪欑姣旇緝鍚堢悊鐨勬柟娉曞錛岀浜岀鏌ユ壘淇℃伅浼犻掓柟鍚戠殑鏂瑰紡灝辨槸鏌ユ壘 API 鍙傛暟綾誨瀷涓殑瀛楁瘝“C”銆備緥濡傦紝GetUserName API 鍑芥暟鐨勭涓涓弬鏁拌瀹氫箟涓?LPTSTR 綾誨瀷錛屽畠浠h〃涓涓寚鍚?Unicode 鎴?ANSI 瀛楃涓茬紦鍐插尯鐨勯暱鎸囬拡銆備絾鏄?CreateMutex 鐨勫悕縐板弬鏁拌綾誨瀷鍖栦負 LTCTSTR銆傝娉ㄦ剰錛岃繖閲岀殑綾誨瀷瀹氫箟鏄竴鏍風殑錛屼絾澧炲姞涓涓瓧姣?#8220;C”鏉ヨ〃鏄庣紦鍐插尯涓哄父鏁幫紝API 鍑芥暟涓嶈兘鍐欏叆銆?/p>
涓鏃︽槑紜簡鏂囨湰鍙傛暟鏄彧鐢ㄤ綔杈撳叆榪樻槸鐢ㄤ綔杈撳叆/杈撳嚭錛屽氨鍙互紜畾浣跨敤鍝 CLR 綾誨瀷浣滀負鍙傛暟綾誨瀷銆傝繖閲屾湁涓浜涜鍒欍傚鏋滃瓧絎︿覆鍙傛暟鍙敤浣滆緭鍏ワ紝鍒欎嬌鐢?System.String 綾誨瀷銆傚湪鎵樼浠g爜涓紝瀛楃涓叉槸涓嶅彉鐨勶紝閫傚悎鐢ㄤ簬涓嶄細琚湰鏈?API 鍑芥暟鏇存敼鐨勭紦鍐插尯銆?/p>
濡傛灉瀛楃涓插弬鏁板彲浠ョ敤浣滆緭鍏ュ拰/鎴栬緭鍑猴紝鍒欎嬌鐢?System.StringBuilder 綾誨瀷銆係tringBuilder 綾誨瀷鏄竴涓緢鏈夌敤鐨勭被搴撶被鍨嬶紝瀹冨彲浠ュ府鍔╂偍鏈夋晥鍦版瀯寤哄瓧絎︿覆錛屼篃姝eソ鍙互灝嗙紦鍐插尯浼犻掔粰鏈満鍑芥暟錛岀敱鏈満鍑芥暟涓烘偍濉厖瀛楃涓叉暟鎹備竴鏃﹀嚱鏁拌皟鐢ㄨ繑鍥烇紝鎮ㄥ彧 闇瑕佽皟鐢?StringBuilder 瀵硅薄鐨?ToString 灝卞彲浠ュ緱鍒頒竴涓?String 瀵硅薄銆?/p>
GetShortPathName API 鍑芥暟鑳藉緢濂藉湴鐢ㄤ簬鏄劇ず浠涔堟椂鍊欎嬌鐢?String銆佷粈涔堟椂鍊欎嬌鐢?StringBuilder錛屽洜涓哄畠鍙甫鏈変笁涓弬鏁幫細涓涓緭鍏ュ瓧絎︿覆銆佷竴涓緭鍑哄瓧絎︿覆鍜屼竴涓寚鏄庤緭鍑虹紦鍐插尯鐨勫瓧絎﹂暱搴︾殑鍙傛暟銆?/p>
鍥?3 鎵紺轟負鍔犳敞閲婄殑闈炴墭綆?GetShortPathName 鍑芥暟鏂囨。錛屽畠鍚屾椂鎸囧嚭浜嗚緭鍏ュ拰杈撳嚭瀛楃涓插弬鏁般傚畠寮曞嚭浜嗘墭綆$殑澶栭儴鏂規硶瀹氫箟錛屼篃濡傚浘 3 鎵紺恒傝娉ㄦ剰絎竴涓弬鏁拌灝侀佷負 System.String錛屽洜涓哄畠鏄竴涓彧鐢ㄤ綔杈撳叆鐨勫弬鏁般傜浜屼釜鍙傛暟浠h〃涓涓緭鍑虹紦鍐插尯錛屽畠浣跨敤浜?System.StringBuilder銆?/p>
灝忕粨
鏈湀涓撴爮鎵浠嬬粛鐨?P/Invoke 鍔熻兘瓚沖璋冪敤 Windows 涓殑璁稿 API 鍑芥暟銆傜劧鑰岋紝濡傛灉鎮ㄥぇ閲忕敤鍒? interop錛屽垯浼氭渶緇堝彂鐜拌嚜宸卞皝閫佷簡寰堝鏉傜殑鏁版嵁緇撴瀯錛岀敋鑷沖彲鑳介渶瑕佸湪鎵樼浠g爜涓氳繃鎸囬拡鐩存帴璁塊棶鍐呭瓨銆傚疄闄呬笂錛屾湰鏈轟唬鐮佷腑鐨?interop 鍙互鏄竴涓皢緇嗚妭鍜屼綆綰ф瘮鐗硅棌鍦ㄩ噷闈㈢殑鐪熸鐨勬綐澶氭媺鐩掑瓙銆侰LR銆丆# 鍜屾墭綆?C++ 鎻愪緵浜嗚澶氭湁鐢ㄧ殑鍔熻兘錛涗篃璁鎬互鍚庢垜浼氬湪鏈笓鏍忎粙緇嶉珮綰х殑 P/Invoke 璇濋銆?/p>
鍚屾椂錛屽彧瑕佹偍瑙夊緱 .NET Framework 綾誨簱鏃犳硶鎾斁鎮ㄧ殑澹伴煶鎴栬呬負鎮ㄦ墽琛屽叾浠栦竴浜涘姛鑳斤紝鎮ㄥ彲浠ョ煡閬撳浣曞悜鍘熷鑰屼紭縐鐨?Windows API 瀵繪眰涓浜涘府鍔┿?/p>
Figure 1 MessageBeep, Interop Done Well
namespace Wintellect.Interop.Sound{
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
sealed class Sound{
public static void MessageBeep(BeepTypes type){
if(!MessageBeep((UInt32) type)){
Int32 err = Marshal.GetLastWin32Error();
throw new Win32Exception(err);
}
}
[DllImport("User32.dll", SetLastError=true)]
static extern Boolean MessageBeep(UInt32 beepType);
private Sound(){}
}
enum BeepTypes{
Simple = -1,
Ok = 0x00000000,
IconHand = 0x00000010,
IconQuestion = 0x00000020,
IconExclamation = 0x00000030,
IconAsterisk = 0x00000040
}
}
Figure 2 Non-Pointer Data Types
Win32 Types | Specification | CLR Type |
---|---|---|
char, INT8, SBYTE, CHARâ鈧?nbsp; | 8-bit signed integer | System.SByte |
short, short int, INT16, SHORT | 16-bit signed integer | System.Int16 |
int, long, long int, INT32, LONG32, BOOLâ鈧?nbsp;, INT | 32-bit signed integer | System.Int32 |
__int64, INT64, LONGLONG | 64-bit signed integer | System.Int64 |
unsigned char, UINT8, UCHARâ鈧?nbsp;, BYTE | 8-bit unsigned integer | System.Byte |
unsigned short, UINT16, USHORT, WORD, ATOM, WCHARâ鈧?nbsp;, __wchar_t | 16-bit unsigned integer | System.UInt16 |
unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT | 32-bit unsigned integer | System.UInt32 |
unsigned __int64, UINT64, DWORDLONG, ULONGLONG | 64-bit unsigned integer | System.UInt64 |
float, FLOAT | Single-precision floating point | System.Single |
double, long double, DOUBLE | Double-precision floating point | System.Double |
â鈧?nbsp;In Win32 this type is an integer with a specially assigned meaning; in contrast, the CLR provides a specific type devoted to this meaning. |
Figure 3 GetShortPathName Declarations
// ** Documentation for Win32 GetShortPathName() API Function
// DWORD GetShortPathName(
// LPCTSTR lpszLongPath, // file for which to get short path
// LPTSTR lpszShortPath, // short path name (output)
// DWORD cchBuffer // size of output buffer
// );
[DllImport("Kernel32", CharSet = CharSet.Auto)]
static extern Int32 GetShortPathName(
String path, // input string
StringBuilder shortPath, // output string
Int32 shortPathLength); // StringBuilder.Capacity