锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浜嬫儏鐨勮搗鍥犳槸錛屾兂鎵句釜璺?Windows 鍜?Mac 鐨勬瀯寤烘柟妗堛傜涓鑰冭檻鑷劧鏄?CMake錛屾瘯绔熷熀鏈笂鏄簨瀹炴爣鍑嗕簡(jiǎn)銆?/p>
浣嗘槸鐮旂┒浜?jiǎn)涓涓?Modern CMake錛屼篃灝辨槸浠?target 涓烘牳蹇?jī)鐨勭悊蹇点備絾鍙戠幇鐪嬩簡(jiǎn)濂藉嚑澶╂枃妗o紝涔熸姌鑵懼嚭浜?jiǎn)鍙敤鐨勪笢瑗垮Q屼絾浠嶇劧鏄病姊崇悊娓呮浠涔堢悊蹇點(diǎn)佸師鐞嗐傜劧鍚?CMake 鏈韓璇硶灝卞緢澶嶆潅錛屽啀鍔犱笂鎼?target 涓濂楁蹇碉紝瑕佺粰 target 璁劇疆鍚勭灞炴т箣綾葷殑錛屾湁鐐瑰己琛?OOP 鐨勬劅瑙夆︹︿絾鍏跺疄鎴戜滑鍙槸闇瑕佷竴涓?include_dir 鍜?lib_dir 鑰屽凡錛屽叾浠栭兘鏄誕浜憕 浣嗗鏋滈鍥炲埌浼犵粺妯″紡錛屼笉鐢?Modern 姒傚康鍛紝濂藉儚鍙互灝嗗氨錛屼絾絎竴涓嶅幓鐢ㄤ竴涓伐鍏風(fēng)殑鏈鏂版ā寮忥紝濂藉儚鏈夌偣涓嶄笂榪涚殑鎰熻錛坧ython 2 闄ゅ錛夛紱絎簩錛孋Make 鐨勪袱澶х棝鐐光斺旇娉曠壒绔嬬嫭琛屻佹枃妗f櫐娑╅毦鎳傗斺旇繕鏄浜烘湁鐐逛笉鐖姐?/p>
閭h煩鍑烘潵鐪嬪埆鐨勯夋嫨鍛紵鐩墠鐩稿鎴愮啛鐨勪篃鍙湁 Google 鐨?gn+ninja 鏂規(guī)浜?jiǎn)銆俫n 榪欏涓滆タ鍦?Chromium 閲屾槸瀹屽叏閰嶇疆濂界殑錛岀敤璧鋒潵榪樼畻欏烘墜錛屼絾瑕佹槸鐙珛鎷垮嚭鏉ュ憿錛屽氨娌¢偅涔堜究瀹滀簡(jiǎn)銆傚叧閿槸瀹冪殑 toolchain 鏄鑷繁瀹氫箟鐨勩?/p>
涔嬪墠榪樺湪鍏徃鎼炲鎴風(fēng)鐨勬椂鍊欙紝澶у灝變粠 Chromium 閲岄潰鎶?build銆乥uild_overrides 絳夌瓑涓滆タ鍏ㄩ儴鎷峰嚭鏉ワ紝濂藉浼欙紝鍑犵櫨 MB 鐢氳嚦涓?G銆備絾鏄叕鍙擱噷鍢涳紝娌′漢綆″共涓嶅共鍑錛屾庝箞蹇庝箞鏉ャ傚悗鏉ュ張鐪嬪埌 Google 鑷鐨?Crashpad 閲岄潰涔熺敤浜?jiǎn)杩欏鏋勫缓锛屼絾宸ュ叿閾捐绠鍖栦簡(jiǎn)涓涓嬶紝鍙?mini_chromium銆傝繖涓瘮 Chromium 閲岀殑灝忓浜?jiǎn)锛屾槸鍙互鎷繕q囨潵鐩存帴鐢ㄧ殑錛岀己灝戜竴浜涢厤緗彲浠ヨ嚜宸卞姞銆備絾鏄憿錛屽儚鎴戜滑榪欑媧佺櫀錛屼粛鐒舵槸鍙椾笉楦熺殑銆傛墍浠ュ憿錛屾垜浠騫插共鍑鍑鐨勫緩绔嬩竴濂楀伐鍏烽摼銆?/p>
棣栧厛錛屾垜浠槑紜畾浣嶃俫n 鍜?ninja 閮芥槸寮鍙戞満涓婇渶瑕侀瑁呯殑錛屼笉鏄蔣浠舵彁渚涚殑銆侰hromium 鐨勬悶娉曟槸鑷繁鎻愪緵錛実n 鐨勬枃妗d篃璇磋寮鍙戣呮彁渚涘伐鍏楓備絾榪欏鎬濊礬璺熶紶緇熺殑鐞嗗康鏄啿紿佺殑銆傚悓鏃訛紝鑷繁瀹夎宸ュ叿鎴愭湰鏄瘮杈冧綆鐨勶細(xì) 鑷繁涓嬭澆鐨勮緗埌 PATH錛屾祴璇? 甯屾湜鍋氬埌鎻愪緵涓涓?git repo錛屼嬌鐢ㄨ?clone 鍒拌嚜宸遍」鐩殑 build 鐩綍錛岀劧鍚庝嬌鐢ㄨ呭彧瑕佸湪 .gn 鏂囦歡閲岄厤緗?/p>
灝卞彲浠ヤ嬌鐢ㄦ垜浠彁渚涚殑宸ュ叿閾撅紝鍦?PC 涓夌榪涜鏋勫緩銆?/p>
浣跨敤鑰呯殑鍞竴璐熸媴灝辨槸緙栧啓鑷繁鐨?BUILD.gn 棣栧厛鎴戜滑鐪?gn 鐨勬枃妗o紝浠ュ強(qiáng)瀹冪殑渚嬬▼ simple_build 閲岀殑宸ュ叿閾鵑厤緗細(xì) https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 榪欎釜鏄彲浠ョ洿鎺ョ敤鐨勶紝鍙笉榪囧彧鏈?linux 绔紙褰撶劧 mac 涔熻兘鐢級(jí)銆傛垜浠啀緇撳悎 chrome 閲岀殑宸ュ叿閾鵑厤緗紝榪涜涓浜涘畬鍠勩?/p>
棣栧厛鎴戜滑浜?jiǎn)瑙?gn 浣撶郴闇瑕佺殑鏈灝忛厤緗槸浠涔堛?/p>
絎竴錛屽畠闇瑕佸湪鏍圭洰褰曞啓涓涓?.gn 鏂囦歡錛屽湪閲岄潰瀹氫箟 buildconfig錛屾寚鍒板彟涓涓枃浠訛紝涓鑸槸 絎簩銆丅UILDCONFIG.gn 閲岄潰闇瑕佽緗粯璁ゅ伐鍏烽摼錛屼篃灝辨槸鍐欎竴琛?/p>
絎笁銆佸畾涔夊伐鍏烽摼錛屽涓婁緥鐨?//build/toolchain:gcc銆?/p>
闇瑕佸湪 build/toolchain 涓嬪緩绔?BUILD.gn 鏂囦歡錛屽唴瀹規(guī)槸 鏈鍚庡湪 toolchain 閲屽畾涔夊悇縐?tool銆?/p>
榪欓儴鍒嗘枃妗e湪榪欓噷錛歨ttps://gn.googlesource.com/gn/+/main/docs/reference.md#func_tool 綆鍗曞榪頒竴涓嬶紝鍙瀹氫箟鐨勫伐鍏鋒湁錛?/p>
錛堝叾浠栫殑灝卞厛涓嶇湅浜?jiǎn)锛?jí) 鎴戜滑鏉ョ湅涓涓?https://gn.googlesource.com/gn/+/HEAD/examples/simple_build/build/toolchain/BUILD.gn 鐨勪竴浜涘叧閿厤緗細(xì) 鍙互鐪嬪埌錛宑c 鍜?cxx 鎵ц command 鍚庯紝鐢熸垚 .o 鏂囦歡錛岀劧鍚庤繖浜?.o 鏂囦歡鍙互浣滀負(fù) alink銆乻olink銆乴ink 鐨?inputs錛岃瀹冧滑 command 緇х畫浣跨敤錛屾渶鍚庤緭鍑洪潤鎬佸簱銆佸姩鎬佸簱浠ュ強(qiáng)鍙墽琛屾枃浠躲?/p>
鍏朵綑灞炴у彲浠ユ煡鏂囨。浜?jiǎn)瑙e惈涔夈?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細(xì)https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/gcc_toolchain.gni 涔熸槸 gcc 鐨勶紝涓?simple_build 閲岀殑澶у悓灝忓紓錛屾病鏈夌壒鍒殑銆?/p>
涓昏閰嶇疆鍦ㄨ繖閲岋細(xì)https://source.chromium.org/chromium/chromium/src/+/main:build/toolchain/apple/toolchain.gni 鍖哄埆鏈夛細(xì) 鍩烘湰涓婃槸鏍規(guī)嵁涓婇潰鍒嗘瀽鐨勮鐐歸厤緗紝鏈緇堢粨鏋滃湪姝わ細(xì)https://github.com/Streamlet/gn_toolchain 鏂板鐨勪竴浜涘樊寮傛湁錛?/p>
澧炲姞鍏ㄥ眬鍙傛暟 is_debug錛屽彲浠ュ湪 mac 涓嬬敓鎴?dSYM 涓嶄嬌鐢?python 鑴氭湰錛岀洿鎺ユ槸 mac 涓嬪姞浜?jiǎn)涓涓?template錛歛pp_bundle錛岀敤鏉ョ敓鎴?xxx.app錛屼富瑕侀厤緗潵鑷簬 create_bundle 鏂囨。閲岀殑渚嬪瓙 win 涓嬪鍔犱簡(jiǎn)涓浜涢厤緗泦 鍔ㄦ?闈欐侀摼鎺?CRT錛?/build/config/win:console_subsystem銆?/build/config/win:static_runtime 鎺у埗鍙扮▼搴忋乄in32 紼嬪簭錛?/build/config/win:console_subsystem銆?/build/config/win:windows_subsystem 榪欎釜鍏跺疄涓鑸儏鍐典笅鐢ㄤ笉鐫錛屽彧瑕佸叆鍙e嚱鏁版槸 main/WinMain錛宭ink 榛樿灝辨槸鎺у埗鍙扮▼搴?Win32 紼嬪簭 XP 鏀寔錛?/build/config/win:console_subsystem_xp銆?/build/config/win:windows_subsystem_xp 鍏蜂綋瀹炵幇鏄摼鎺ュ弬鏁板姞 /SUBSYSTEM:CONSOLE,5.01 鎴?/SUBSYSTEM:WINDOWS,5.01銆傚叧閿槸鍚庨潰鐨勭増鏈彿 5.01錛屼負(fù)浜?jiǎn)鍔犵増鏈彿鍒欏繀椤绘寚瀹氬瓙绯痪l熷悕縐幫紝鎵浠ュ垎浜?console_subsystem_xp 鍜?windows_subsystem_xp銆傚張錛寈p 榪欓噷鎻愪緵浜?jiǎn)涓や?subsystem 鐨勯厤緗泦錛岄潪 xp 涔熸彁渚涗袱涓?/p>
浣嗘槸鎴戜滑娌℃湁鍔?_WIN32_WINNT=0x0501銆乄INVER=0x0501銆乢USING_V110_SDK71_錛屼篃娌℃湁鎸囧畾蹇呴』浣跨敤 7.0 鐗堟湰鐨?SDK錛岃繖浜涢兘鏄潪蹇呴』鐨勶紝鍙涓嶇敤鍒?XP 浠ュ悗娣誨姞鐨?API 鍗沖彲銆備嬌鐢ㄨ呭彲浠ュ湪鑷繁鐨?target 閲岄潰瀹氫箟榪欎簺瀹忋?/p>
鎻愪緵涓涓嬌鐢ㄦ渚嬶細(xì)https://github.com/Streamlet/gn_toolchain_sample 鍥犱負(fù)瀹冧互 git submodule 褰㈠紡寮曠敤浜?https://github.com/Streamlet/gn_toolchain錛屾墍浠?git clone 浠ュ悗錛岄渶瑕? 鐒跺悗鍦ㄦ牴鐩綍鎵ц錛氾紙紜繚 gn 鍜?ninja 宸茬粡鍦?PATH 涓級(jí) 鍗沖彲銆?/p>
Mac 涓嬩細(xì)棰濆鐢熸垚涓涓?objc 欏圭洰 objc_console_application 浠ュ強(qiáng)涓涓?app_bundle錛歯s_application.app銆?/p>
Win 浼?xì)棰濆鐢熸垚涓涓?Win32 欏圭洰 win32_application銆?/p>
Win 涓嬮渶瑕佸厛鎵ц涓涓?Visual Studio 甯︾殑鍛戒護(hù)琛岀幆澧冿紝濡?VS 2022 Community 鐨?鈥渪64 Native Tools Command Prompt for VS 2022鈥濓紝cl 絳夊伐鍏鋒墠浼?xì)鍙敤銆?/p>
濡傛灉瑕佹祴璇?XP錛?2浣嶏級(jí)錛岀敤鈥渪86 Native Tools Command Prompt for VS 2022鈥濊繘鍏ワ紝CD 鍒伴」鐩洰褰曪紝鎵ц錛?/p>
鎴戜滑鍙敤鍑犲崄 KB 鐨勫ぇ灝忓畬鎴愪簡(jiǎn)璺ㄧ鏀寔錛屾槸寰堣交閲忕殑涓涓厤緗傚鏋滄?zhèn)ㄨ寰楀疄鐢q惰鍙繖縐嶆柟寮忥紝嬈㈣繋涓璧鋒潵緇存姢銆佸畬鍠勩?/p>
榪欐鏄洜涓哄偦閫煎ぇ寰蔣鏀逛簡(jiǎn) System32\IME\shared 閲岀殑涓滆タ錛屽鑷存棫緋葷粺鎷瘋繃鏉ョ殑鏂囦歡涓?System32\IME\shared 鐨勪笢瑗夸笉鍏煎浜?jiǎn)銆傝В鍐蟲柟寮忓緢鏆村姏錛氫粠浠ュ墠鐨勭増鏈鍒?System32\IME\shared 榪囨潵銆?/p> 涓嬭澆錛?a >https://www.streamlet.org/software/mspyforever/ 錛堝師鍙戜簬 GitHub Pages錛?018-10-13 13:36:04錛?/p> 鏈?A銆丅 涓や釜紿楀彛錛孉 鏄?B 鐨?Owner錛孊 涓嶆縺媧諱笉鎶㈢劍鐐廣傚湪 B 鐨?WM_LBUTTONDOWN 鐨勬椂鍊欙紝璁劇疆 A 紿楀彛涓?Capture錛涘湪 A 鐨?WM_LBUTTONUP 鐨勬椂鍊?ReleaseCapture銆?/p> 鎿嶄綔鏄紝鍦?B 涓婃寜涓嬮紶鏍囷紝鐒跺悗涓鐩存寜浣忛紶鏍囬鍟婇銆傚湪鏌愪竴鏃舵満鎶?B 騫叉帀錛岀戶緇姩榧犳爣銆傛鏃?A 榪樺湪錛屽茍涓?A 浠嶇劧鏄?Capture 鐘舵侊紝浣嗘槸 A 鏀朵笉鍒?A 鍙鑼冨洿澶栫殑 WM_MOUSEMOVE 浜?jiǎn)锛佸湪鍏q囩▼涓?A 涔熸病鏈夋敹鍒?WM_CAPTURECHANGED銆?/p> 涓嬮潰鏄牀瀛愶細(xì) http://pan.baidu.com/s/1mgurJIS 姹傝В閲娿傛眰瑙e喅銆傝阿璋錛?/p> [1]鍗佷釜姝ラ鎵懼洖 Win8 涓殑寰蔣鎷奸煶鏂頒綋楠屾ā寮?/a> [2]鍙戝竷涓伐鍏鳳紝涓閿仮澶峎in8/8.1涓殑寰蔣鎷奸煶闀垮彞妯″紡錛堟柊浣撻獙妯″紡錛?/a> 鍦?[1] 涓紝鎴戜滑鎵懼洖浜?Win8 閲岀殑寰蔣鎷奸煶鏂頒綋楠屾ā寮忥紱鍦?[2] 涓紝渚濈収 ePig 鎻愪緵鐨勬柟娉?/a>錛屾垜浠湪 Win8.1 涓篃鎼洖浜?jiǎn)寰蒋鎷奸熛x柊浣撻獙妯″紡錛屼絾鐣欎笅浜?jiǎn)涓鐐歸仐鎲撅紝涓嶆敮鎸?Metro 搴旂敤銆?/p> 錛堝叾瀹炶繕鏈変竴鐐癸紝娌℃湁鏄劇ず鍥炬爣銆傦級(jí) 鍘熸湰鎴戣寰楁棤鎵璋擄紝鍥犱負(fù)鎴戝弽姝d笉澶敤 Metro 搴旂敤錛孧etro 涓嬪氨鐢ㄨ嚜甯︾殑寰蔣鎷奸煶綆鎹鋒ā寮忓ソ浜?jiǎn)銆傚彲鏄紝鍙槸錛岃緭鍏ユ硶綆$悊鍣ㄤ腑錛屾瘮濡備繚鐣欎竴涓吋瀹?Metro 鐨勮緭鍏ユ硶錛屽鑷存闈笅涔熸瘮濡備繚鐣欑畝鎹鋒ā寮忎簡(jiǎn)錛岃繖鏍峰垏鎹㈣緭鍏ユ硶緇忓父鍒囬敊錛岀鎵璋撯滀竴涓緭鍏ユ硶鈥濈殑浼熷ぇ鐩爣鐩稿樊鐢氳繙銆備簬鏄箮錛屼笉鑳藉繊銆傜劧鍚庢槰澶╄搗鏉ョ湅浜?jiǎn)涓嫎q欎釜闂銆?/p> 鍘熷厛寰蔣鎷奸煶杈撳叆娉曠殑涓涓笉鐭ヤ粈涔堢殑GUID鏄?{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}錛岃 GUID 浠h〃鐨勮緭鍏ユ硶涓嬫湁涓や釜杈撳叆妯″紡錛屾柊浣撻獙鍜岀畝鎹楓傦紙榪欎釜鏋勬灦鍜岀浉鍏沖唴瀹規(guī)垜涓嶆槸寰堟噦錛屽叿浣撹鍘繪煡闃?TSF (Text Service Framework) 妗嗘灦鐩稿叧鏂囨。銆傦級(jí) Win 8 涓嬪彧鏄垹闄や簡(jiǎn)鏂頒綋楠屾ā寮忕殑閭d釜娉ㄥ唽琛ㄩ」騫跺娉ㄥ唽琛ㄩ」鍔犳潈闄愪繚鎶よ揪鍒扮鐢ㄧ洰鐨勩俉in8.1 涓嬬殑鍙樺寲鏄紝鑰佺殑鏂囦歡琚垹闄や簡(jiǎn)錛屼笖 {81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e} 琚敤浣滄柊鐨勫井杞嫾闊崇殑 GUID 浜?jiǎn)锛岄噷闈篃涓嶅啀鍒嗕袱涓ā寮忎簡(jiǎn)锛堝叾瀹炲彧鏈夊師鍏堢殑绠鎹鋒ā寮忥級(jí)銆傛寜鐓?ePig 鎻愪緵鐨勬柟娉?/a>錛屼粠 Win8 涓鍒剁浉鍏蟲枃浠訛紝騫舵妸鏂囦歡涓殑 GUID 鏀逛簡(jiǎn)錛岄噸鏂版敞鍐岃繘鍘匯傝繖杈規(guī)垜鍦ㄤ竴閿仮澶嶅伐鍏鋒墍甯︾殑鏂囦歡涓槸鎶?GUID 鏈熬 e 鏀逛負(fù)浜?f錛屽畬鏁寸殑灝辨槸 {81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35F}銆傛寜閬撶悊搴旇瀹屽叏鍏煎鎵嶆槸錛岃搗鐮?Win8 涓嬫槸鏀寔 Metro 鐨勩傚井杞嫾闊沖緢鏃╁氨鏄?TSF 妗嗘灦浜?jiǎn)锛堣屼笉鏄?Imm錛夛紝鎹垜涔嬪墠鐨勪簡(jiǎn)瑙o紝瑕佹敮鎸?Metro錛岃緭鍏ユ硶浣跨敤 TSF 妗嗘灦灝卞ソ浜?jiǎn)銆?/p> 鎯充笉閫氱殑鎯呭喌涓嬶紝灝辨潵姣旇緝涓?Win8.1 涓嬭嚜甯︾殑寰蔣鎷奸煶錛堢畝鎹鋒ā寮忥級(jí)鍜屾垜浠柊鍔犵殑寰蔣鎷奸煶鏂頒綋楠屾ā寮忕殑娉ㄥ唽琛ㄩ」宸紓錛?/p> 鍙戠幇鑷甫鐨勫浜?jiǎn)鍑牂骞锛埦U㈡閮ㄥ垎錛夈備簬鏄豢鐓х潃鎶婅繖浜涜ˉ涓婂幓錛岀粨鏋滅‘瀹炰笉鏄劇ず鈥滀粎閫傜敤浜庢闈㈢増鈥濅簡(jiǎn)錛屽彲鏄ソ鍍忎篃娌℃硶杈撳叆浜?jiǎn)鈥︹︿簬鏄瘡嬈″彧鍔犱竴欏癸紝渚濇璇曡繃鍘伙紙絀蜂婦娉曪紝閯欒錛夈傛渶鍚庡彂鐜板墠涓や釜 錛屼篃灝辨槸 {13A016DF-560B-46CD-947A-4C3AF1E0E35D}銆亄25504FB4-7BAB-4BC1-9C69-CF81890F0EF5} 鍙互瑕侊紝鏈鍚?{74769ee9-4a66-4f9d-90d6-bf8b7c3eb461} 涓嶈兘瑕併?/p> 鍐嶇湅涓?Win8 鐨勶紝鏋滅劧涔熸槸鏈夎繖涓や釜 Category 鐨勶細(xì) 鐒跺悗榪欎簨鎯呭氨綆楁垚浜?jiǎn)锛?xì) 涓閿伐鍏峰凡鏇存柊錛屼笅杞介〉闈細(xì)http://www.streamlet.org/Software/MSPYForever/ 閭d箞榪欎袱涓?GUID 鍒板簳鏄粈涔堝憿錛烥oogle 涓涓嬧︹?/p> 鍏充簬鍓嶈咃紝http://msdn.microsoft.com/zh-cn/library/windows/apps/hh967425.aspx#set_compatibility_flag 涓湁璇存槑濡備笅錛?/p> 澹版槑鍏煎鎬?/em> IME 閫氳繃浣跨敤 ITfCategoryMgr::RegisterCategory 涓哄叾 IME 娉ㄥ唽綾誨埆 GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT 鏉ュ0鏄庡叾鍏煎 Windows 搴旂敤鍟嗗簵搴旂敤銆?/em> 鍏朵腑 GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT 灝辨槸 {13A016DF-560B-46CD-947A-4C3AF1E0E35D}銆?/p> {25504FB4-7BAB-4BC1-9C69-CF81890F0EF5} 涔熸槸涓瀹氫箟鐨勫鹼紝鍙仛 GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT錛屾寜瀛楅潰鐞嗚В錛岀郴緇熸墭鐩樻敮鎸侊紝鍙槸鏌ヤ笉鍒板畼鏂硅鏄庡晩錛?a title="http://msdn.microsoft.com/en-us/library/ms629012.aspx" target="_blank">http://msdn.microsoft.com/en-us/library/ms629012.aspx 涓嶇鎬庝箞璇達(dá)紝闂鏄В鍐充簡(jiǎn)銆傚ぇ蹇漢蹇?jī)銆?/p> 鍐嶉『渚塊粦涓嬪ぇ寰蔣銆?/p> 鐪嬭繖寮犲浘錛屾垜鍦ㄥ啓浠g爜鎴栧啓Word鎴栬呭啓鍒殑鏂囧瓧錛屽紑鐫涓枃璇█涓嬬殑涓枃杈撳叆娉曪紙鍐欎唬鐮佹庝箞浼?xì)寮涓枃錛熶笉瑕佸湪鎰忚繖浜涚粏鑺傗︹︼級(jí)錛岀劧鍚庢潵浜?jiǎn)鏉?QQ 娑堟伅銆傛垜鍘諱換鍔℃爮鐐逛紒楣呭浘鏍囥傜粨鏋滃垰鐐逛笅錛屽洜涓轟換鍔℃爮銆佹闈㈡槸鑻辨枃璇█涓嬬殑緹庡紡閿洏錛岃緭鍏ユ硶鎸囩ず鍣ㄥ彉涓?ENG錛岀緝鐭簡(jiǎn)錛屼紒楣呭浘鏍囪窇鍙寵竟鍘諱簡(jiǎn)錛岀偣絀轟簡(jiǎn)錛侊紒錛?/p> 姝e洜涓哄姝わ紝鎴戜互鍓嶆繪槸鎶婅嫳鏂囪璦鍒犳帀錛屽彧鏈変腑鏂囪璦錛屼笅闈竴涓緭鍏ユ硶錛岄潬 Shift 鍦ㄨ緭鍏ユ硶鍐呭垏鎹腑鑻辨枃銆傚彲鏄?Shift 寰堝鏄撹鎿嶄綔鏈夋湪鏈夈傛渶浣崇殑鏂瑰紡榪樻槸涓枃璇█涓嬬殑緹庡紡閿洏鈥︹﹁繖涓棶棰樺緢鏃╀箣鍓嶇爺絀惰繃鍑犱釜灝忔椂錛屼絾娌″暐緇撴灉錛屽悗鏉ユ兂錛屽鏋滅湡鐨勬病鍔炴硶浜?jiǎn)锛岒q茶剢鍐欎竴涓┖鐨勮緭鍏ユ硶鍘熸牱杈撳叆杈撳嚭錛屽彨鍋氣滅編寮忛敭鐩樷濆緱浜?jiǎn)銆備負(fù)鍟ヤ腑鏂囦笅灝變笉緇欓敭鐩樺竷灞鍛紵涓轟粈涔堝憿涓轟粈涔堝憿涓轟粈涔堝憿錛?/p> 鏄ㄥぉ鍙堝幓緗戜笂鎼滀簡(jiǎn)涓嬶紝緇撴灉楂樹漢宸茬粡緇欏嚭浜?jiǎn)鏂规硶浜?jiǎn)錛屼笉鐭ラ亾鍝瘒鏄師鍒涳紝灝變笉寮曠敤浜?jiǎn)锛屾湁鍏喘懀鐨勮嚜宸辨悳銆傝繖閲岃繕鏈変釜鍗婂畼鏂圭殑鍑哄錛?a title="http://answers.microsoft.com/zh-hans/windows/forum/windows_8-ime/windows-8%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/91917117-c5fd-4c61-ac2e-da0dd29d12fc" target="_blank">http://answers.microsoft.com/zh-hans/windows/forum/windows_8-ime/windows-8%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/91917117-c5fd-4c61-ac2e-da0dd29d12fc 榪欎笅鍚屽湪涓枃璇█涓嬩簡(jiǎn)錛孋trl+Shift 鍒囪緭鍏ユ硶錛屾庝竴涓垝鏈嶄簡(jiǎn)寰梸錛佽嚦姝わ紝W(xué)in8銆乄in8.1 鐨勮緭鍏ユ硶闂瀵規(guī)垜涓漢鑰岃█宸茬粡鍏ㄩ儴瑙e喅浜?jiǎn)锛屽彲浠ュぇ瑙勬ā閲嶈绯痪l熶簡(jiǎn)銆?/p> 蹇嶄笉浣忓啀榛戜笅澶у井杞細(xì)http://answers.microsoft.com/zh-hans/windows/forum/windows_8-ime/%E5%85%B3%E4%BA%8E%E4%B8%AD%E6%96%87%E7%89%88windo/b5c3190f-bb82-4855-97f0-00d6011e3e33錛岃繖涓瓟闈炴墍闂紝鏄笉鏄湪鎼炵瑧錛?/p> 棣栧厛璐翠釜鍥撅紝澶у鏉ヤ竴璧峰康鍙拌瘝~ 蹇靛畬浜?jiǎn)鏈ㄦ湁锛熷緢婵鎯呮編婀冧箟鎰ゅ~鑶烘湁鏈ㄦ湁錛?/p> 榪欎簨鎯呮渶鏃╄拷婧埌鍓嶅勾 8 鏈堢殑涓綃囨枃绔犮?a href="http://m.shnenglu.com/Streamlet/archive/2014/02/17/188249.html" target="_blank">鍗佷釜姝ラ鎵懼洖 Win8 涓殑寰蔣鎷奸煶鏂頒綋楠屾ā寮?/a>銆嬶紝鍏跺疄灝辨槸鎵嬪伐娉ㄥ唽涓涓狢OM瀹屼簨錛屽彧鏄偦閫煎ぇ寰蔣鍒繪剰寮勪簡(jiǎn)娉ㄥ唽琛ㄦ潈闄愭潵灞忚斀錛屾搷浣滆搗鏉ョ暐寰箒鐞愩傚埌鐩墠涓烘錛學(xué)in8閲嶈緋葷粺宸茬粡涓嶄笅鍗佹浜?jiǎn)锛屾瘡娆¢兘鏄瘶q欐牱鎵嬪伐鎿嶄綔錛屾垜宸茬粡鍘屽︿簡(jiǎn)銆?/p> 鍙﹀榪樻湁Win8.1涓婄殑闂錛岀敱浜庡偦閫煎ぇ寰蔣宸茬粡瀹屽叏鍒犻櫎浜?jiǎn)鏂囦挥灱尀娌℃硶杩欎箞鎼炰簡(jiǎn)锛尀q畻浠嶹in8鎷瘋繃鏂囦歡鏉ワ紝涔熸棤娉曠畝鍗曟敞鍐屼嬌鐢ㄣ傚姞涓婃垜瀵?.1闈炲父闈炲父涓嶆劅鍐掞紝涓鐩存病鍘葷爺絀躲傚墠浜涘ぉ鐪嬪埌涔嬪墠鐨勯偅綃囨枃绔犻噷 Charles Leigh 鍥炲浜?jiǎn)涓そ媷鏂囩珷锛?a target="_blank">ePig 閭g瘒鏄師鍒涘惂璨屼技錛屾劅璋級(jí)錛屾彁渚涗簡(jiǎn)瑙e喅鏂規(guī)銆備簬鏄笂涓懆鏈埌鐜板湪灝辨崳榧撲釜涓閿仮澶嶅伐鍏鳳紝鏂逛究鑷繁浠ュ悗閲嶈鐢紝涔熸柟渚垮箍澶у井鎷煎厷銆?/p> 寰嫾鍏氾紙鍖呮嫭鎴戯級(jí)瀛滃瓬涓嶅︾殑榪芥眰寰嫾闀垮彞妯″紡鐨勬儏鎬錛岃鎴戦潪甯告劅鍔ㄣ傚笇鏈涘偦閫煎ぇ寰蔣鐪嬪埌鎴戜滑鐨勫績(jī)澹般傚埆鎼炰粈涔堢牬璇嶇粍杈撳叆娉曚簡(jiǎn)錛屼綘鎼炰笉榪囨湰鍦熻繖涔堝鍘傚鐨勶紝浣犵殑涓嬮檺涔熸病鏈夋湰鍦熷巶瀹朵綆錛屽敮涓鐨勪紭鍔垮彲鑳藉氨鏄病騫垮憡娌″脊紿椾簡(jiǎn)鍚с傝嚦浜庤緭鍏ョ畻娉曚粈涔堢殑錛屽湪璇嶇粍妯″紡閲岄潰鏍規(guī)湰涓嶈凍浠ヤ綋鐜板緱澶錛岄暱鍙ユā寮忔墠鏄冮獙鍟娿傚洖澶村惂錛?/p> 涓嬭澆欏甸潰錛?a title="http://www.streamlet.org/Software/MSPYForever/" target="_blank">http://www.streamlet.org/Software/MSPYForever/ CodePlex 欏圭洰欏甸潰錛?a title="https://mspyforever.codeplex.com/" target="_blank">https://mspyforever.codeplex.com/ 璇峰井鎷煎厷浠浼犳挱銆傛湁 Bug 鍙?qiáng)鏃跺弽棣堛?/p>鏋勫緩緋葷粺瀹夎
gn --version 浠ュ強(qiáng) ninja --version錛岃兘榪愯鍗沖彲鐩爣
buildconfig = "//build/BUILDCONFIG.gn"
宸ュ叿閾炬惌寤?/h2>
鍩虹姒傚康
buildconfig = "//build/BUILDCONFIG.gn"
set_default_toolchain("//build/toolchain:gcc")
toolchain("gcc") {
# ...
}
宸ュ叿閾句腑鐨勫伐鍏?/h3>
"cc": C 緙栬瘧鍣?br />
"cxx": C++ 緙栬瘧鍣?br />
"cxx_module": 鏀寔 module 鐨?C++ 緙栬瘧鍣?br />
"objc": Objective C 緙栬瘧鍣?br />
"objcxx": Objective C++ 緙栬瘧鍣?br />
"rc": Windows 璧勬簮鑴氭湰緙栬瘧鍣?br />
"asm": 姹囩紪鍣?br />
"swift": Swift 緙栬瘧鍣?/li>
"alink": 闈欐佸簱閾炬帴鍣?br />
"solink": 鍔ㄦ佸簱閾炬帴鍣?br />
"link": 鍙墽琛屾枃浠墮摼鎺ュ櫒toolchain("gcc") {
tool("cc") {
command = "gcc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("cxx") {
command = "g++ -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
outputs = [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
# ...
}
tool("alink") {
command = "rm -f {{output}} && ar rcs {{output}} {{inputs}}"
outputs = [ "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" ]
# ...
}
tool("solink") {
command = "g++ -shared {{ldflags}} -o $sofile $os_specific_option @$rspfile"
outputs = [ sofile ]
# ...
}
tool("link") {
command = "g++ {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group {{libs}}"
outputs = [ outfile ]
# ...
}
tool("stamp") {
command = "touch {{output}}"
}
tool("copy") {
command = "cp -af {{source}} {{output}}"
}
}
瀵規(guī)瘮 Chromium 涓殑閰嶇疆
Linux
Mac
Win
寤虹珛鎴戜滑鐨勫伐鍏烽摼
gn gen out --args="is_debug=true"浼犲叆銆傞粯璁?is_debug 涓?false錛屽紑鍚墍鏈変紭鍖栥?/p>
$ld ... && dsymutil ... && strip
浣跨敤妗堜緥
git submodule update --init涓涓嬨?/p>
gn gen out
ninja -C out
gn gen out --args="target_cpu=\"x86\""
ninja -C out
鎬葷粨
]]>
]]>
]]>
]]>
]]>
]]>
2*2鐨勪細(xì)琚紕鎴愶細(xì)
鏇村ぇ鐨勫浘鐗囷紝琛ㄧ幇涓哄彸杈圭紭鍜屼笅杈圭紭娓愬彉錛?/p>
GDI+鑷綔鑱槑浜?jiǎn)鈥︹?/p>
瑙e喅鏂規(guī)硶錛?/p>
Graphics g;
g.SetInterpolationMode(InterpolationModeNearestNeighbor);
g.SetPixelOffsetMode(PixelOffsetModeHalf);
鏁堟灉錛?/p>
鐗規(guī)璁板綍銆?/p>
鍙傝冭祫鏂欙細(xì)http://bbs.csdn.net/topics/310212346
寰蔣鎷奸煶杈撳叆娉曠殑鏂頒綋楠屾ā寮忥紝鍏跺疄鏄井杞嫾闊充竴鐩翠互鏉ョ殑涓昏妯″紡銆傜瑪鑰呬粠1.5鐗堝紑濮嬫帴瑙﹀井杞嫾闊充互鏉ュ氨涓鐩存槸榪欑妯″紡錛屼富瑕佺壒鐐瑰氨鏄暱鍙ヨ緭鍏ャ佷簩嬈$‘璁わ紝鍦ㄧ涓嬈$‘璁ょ殑鏃跺欙紝鏂囧瓧灝辮繘鍏ヤ豢浣?jīng)瀹為檯杈撳叆鍖哄煙锛屼絾鏄枃瀛椾笅闈㈡湁铏毦U匡紝姝ゆ椂鎴戜滑鍙互鐢ㄥ厜鏍囬敭宸﹀彸縐誨姩錛屽氨鍍忎笅鍥炬樉紺虹殑涓鏍鳳細(xì)
鑰屽湪杈撳叆鎷奸煶鐨勬椂鍊欙紝鎴戜滑鍏跺疄鏃犻渶寮鍚欓夎瘝紿楀彛錛屼篃涓嶇敤鐪嬪睆騫曪細(xì)
杈撳叆瀹屾瘯涔嬪悗鎸夌┖鏍鹼紝瑙傚療棣栭夋槸鍚︽紜紝濡傛灉姝g‘鐨勮瘽鍐嶄竴嬈$┖鏍肩‘璁わ紝鍚﹀垯鎸変竴涓嬪彸鍏夋爣閿洖鍒板彞棣栧紑濮嬮夎瘝銆傞潪甯告柟渚匡紝涔熸樉寰楀緢涓撲笟銆?
涔?fàn)鎯簬璇嵕l勮緭鍏ョ殑鍚屽鍙兘鍠滄鏃跺埢鐩潃灞忓箷鍑虹幇鐨勫欓夎瘝錛屼竴鏃︽湁閿欑珛鍒葷籂姝i夋嫨銆傝岄暱鍙ヨ緭鍏ュ垯涓嶅繀榪欐牱錛岃緭鍏ユ暣涓彞瀛愶紝璁╄緭鍏ユ硶鍦ㄦ暣鍙ョ殑璇涓浛浣犻夎瘝錛屽懡涓巼浼?xì)楂樺緢澶氬Q岀壒鍒槸鍦ㄦ墦闀跨瘒鏂囩珷鐨勬椂鍊欙紝闈炲父鏈夌敤銆?
寰堝鏃跺欏埆浜哄湪鐪嬫垜杈撳叆鐨勬椂鍊欙紝鍙戠幇灞忓箷涓婃湁閿欏埆瀛楋紝浼?xì)蹇嶄笉浣忔彁閱掓垜閿欎簡(jiǎn)锛屼絾鏄綋鎴戞渶鍚庣‘璁ょ殑鏃跺欙紝寰寰鍙堝浜?jiǎn)锛屼細(xì)鏄惧緱鏈変竴鐐圭偣鐤戞儜錛屼絾鏄氬父涓嶈銆傛湁瓚g殑鏄紝鎴戝湪鎵撳埆浜哄悕瀛楃殑鏃跺欙紝浠栦滑鍙戠幇涓寮濮嬬殑閿欏埆瀛楋紝涔熶細(xì)蹇嶄笉浣忔彁閱掓垜閿欎簡(jiǎn)錛屽茍涓斿杈撳叆娉曟妸鏌愪漢鐨勫悕瀛楀紕鎴愬彟澶栦竴涓瓧闈炲父鎰熷叴瓚o紝鏈夋椂浼?xì)浠ユ?鍢茬瑧"閭d釜浜恒傜劧鍚庡綋鎴戞渶鍚庡洖鏉ラ夎瘝鐨勬椂鍊欙紝浠栦滑浼?鎸囪矗"騫插槢涓寮濮嬩笉閫夊鐨勫瓧鈥︹︽垜宸茬粡涔?fàn)鎯簡(jiǎn)銆備絾鏄暣鍙ヨ緭鍏ュ甫鏉ョ殑渚挎嵎涔嬪錛屽ぇ閮ㄥ垎浜烘槸娌℃硶璁よ瘑鍒扮殑銆傛墍浠ユ垜浠婂ぉ鍦ㄨ繖閲岃姳寰堝ぇ鐨勭瘒騫呬粙緇嶄竴涓嬨?
閬楁喚鐨勬槸錛屽井杞嫾闊?.5銆?.0銆?.0閮芥病浜哄彨濂姐傚埌Office2003鐨勬椂鍊欙紝鍥犱負(fù)"鏂頒綋楠?妯″紡鐨勫嚭鐜幫紝浣垮緱涓閮ㄥ垎浜哄彨濂斤紝浣嗛偅閮ㄥ垎浜哄叾瀹炶繕鏄妸瀹冨綋浣滆瘝緇勮緭鍏ユ硶鏉ョ敤鐨勩傚埌Office2010鍑烘潵鐨勬椂鍊欙紝鍙堟湁涓閮ㄥ垎浜哄彨濂斤紝瀹為檯涓婂緢澶т竴閮ㄥ垎浜烘槸涓?綆鎹?妯″紡鍙ソ銆傚埌鐜板湪Win8鎴愪簡(jiǎn)綆浣撲腑鏂囪璦涓嬮粯璁よ緭鍏ユ硶錛屽嵆渚挎湁寮烘帹鐨勫懗閬擄紝浣嗗ソ澶氫漢榪樻槸鍙ソ錛岃屾柊浣撻獙妯″紡鐨勬秷澶憋紝鍗村緢灝戞湁浜洪棶媧ャ?
涓嬮潰姝e紡鏉ョ湅鏍囬涓彁鍒扮殑闂銆俉in8瀹夎瀹屾瘯鍚庣畝浣撲腑鏂囦笅鍙湁涓涓井杞嫾闊崇畝鎹鳳紝鏂頒綋楠屾ā寮忎笉瑙佷簡(jiǎn)錛侊紒錛?
鏈夐渶瑕佺殑鍚屽錛岃璺熼殢絎旇咃紝涓姝ヤ竴姝ユ壘鍥炴柊浣撻獙妯″紡銆?
1銆佹墦寮寮濮嬪睆騫曪紝鍦ㄨ嫳鏂囩姸鎬佷笅杈撳叆regedit錛岀劧鍚庡洖杞︼紝鎵撳紑娉ㄥ唽琛ㄧ紪杈戝櫒銆傦紙閬囧埌UAC鎻愰啋錛岃閫夋嫨"鏄?錛?
2銆佸湪宸︿晶灞曞紑鐩綍鏍?wèi)锛屼竴鐩村埌HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP\{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}錛?
寰蔣瀵硅繖涓欏瑰仛浜?jiǎn)鐗箤D婄殑鏉冮檺淇濇姢錛屽畠鐨勬潈闄愬拰鐩擱偦鐨勯偅鍑犱釜涓嶄竴鏍鳳紝鎴戜滑瑕佸彇寰楀啓鏉冮檺銆?
3銆佸彸閿崟鍑誨畠銆侀夋嫨鏉冮檺錛屾墦寮濡備笅鍥劇殑紿楀彛錛?
4銆佸崟鍑?楂樼駭"錛屽啀鎵撳紑涓涓獥鍙o細(xì)
5銆佸湪鎵鏈夎呯殑鍙寵竟鐐瑰嚮"鏇存敼"錛岃緭鍏?everyone"鎴栬呭綋鍓嶇櫥褰曠敤鎴峰悕錛屾寜"紜畾"錛屽茍閫変腑"鏇挎崲瀛愬鍣ㄥ拰瀵硅薄鐨勬墍鏈夎?錛岀劧鍚庢寜搴旂敤銆傦紙涓嶈鍏抽棴榪欎釜紿楀彛錛岀瓑涓嬫垜浠繕瑕佹敼鍥炴潵銆傦級(jí)
6銆佺劧鍚庣偣鍑誨乏涓嬫柟鐨勫惎鐢ㄧ戶鎵匡紙鎸変簡(jiǎn)鍚庤鎸夐挳鍙樹負(fù)紱佺敤緇ф壙錛夛紝騫墮変腑"浣跨敤鍙粠姝ゅ璞$戶鎵跨殑鏉冮檺欏圭洰鏇挎崲鎵鏈夊瓙瀵硅薄鐨勬潈闄愰」鐩?銆傛渶鍚庢寜"搴旂敤"錛岄亣鍒版彁紺洪夋嫨"鏄?銆?
鐜板湪錛岃繖涓獥鍙e彉鎴愯繖涓牱瀛愪簡(jiǎn)錛?
淇濈暀榪欎釜紿楀彛錛屾垜浠繘琛屼笅涓姝ャ?
7銆佹墦寮寮濮嬪睆騫曪紝鍦ㄨ嫳鏂囩姸鎬佷笅杈撳叆"cmd"錛屽乏渚у嚭鐜?鍛戒護(hù)鎻愮ず絎?錛屽彸閿偣鍑婚変腑瀹冿紝鍐嶅埌灞忓箷涓嬫柟鐐瑰嚮"浠ョ鐞嗗憳韜喚榪愯"錛岄亣鍒癠AC鎻愮ず閫夋嫨"鏄?銆傝繖鏍鋒垜浠墦寮鍏鋒湁綆$悊鍛樻潈闄愮殑鍛戒護(hù)鎻愮ず絎︾獥鍙o紝宸ヤ綔璺緞浣嶄簬System32鐩綍銆?
8銆佽緭鍏?regsvr32 ime\imesc\imsctip.dll"錛屽茍鎸夊洖杞︺?
鐩村埌鐪嬪埌涓嬪浘鐨勬彁紺猴紝鐐瑰嚮紜畾錛屽叧闂懡浠ゆ彁紺虹紿楀彛銆?
9銆佸洖鍒板垰鎵嶇殑楂樼駭瀹夊叏璁劇疆紿楀彛錛岀偣鍑誨乏涓嬫柟鐨?紱佺敤緇ф壙"鎸夐挳錛岃繖鏃跺嚭鐜頒笅鍥炬彁紺猴細(xì)
閫夋嫨絎簩欏癸紝"浠庢瀵硅薄涓垹闄ゆ墍鏈変互緇ф壙鐨勬潈闄?錛?
騫墮変腑"浣跨敤鍙粠姝ゅ璞$戶鎵跨殑鏉冮檺欏圭洰鏇挎崲鎵鏈夊瓙瀵硅薄鐨勬潈闄愰」鐩?錛屾寜"搴旂敤"錛岄亣鍒版彁紺洪夋嫨"鏄?銆?
10銆佺偣鍑諱笂鏂規(guī)墍鏈夎呭彸杈圭殑"鏇存敼"錛岃緭鍏?nt service\trustedinstaller"錛屾寜"紜畾"錛屽茍閫変腑"鏇挎崲瀛愬鍣ㄥ拰瀵硅薄鐨勬墍鏈夎?錛岀劧鍚庢寜"搴旂敤"銆?
鑷蟲錛屾垜浠皢娉ㄥ唽琛ㄦ潈闄愭仮澶嶅鍒濅簡(jiǎn)銆?
鎵撳紑杈撳叆娉曠鐞嗙晫闈細(xì)
鎴戜滑鍙互鐪嬪埌澶氬嚭鏉ョ殑"Microsoft Pinyin NewExperience"浜?jiǎn)锛屽畠灏辨槸鎴戜滑瑕佹墑勬栴C綋楠屾ā寮忥紒
鎮(zhèn)插墽鐨勬槸錛岃矊浼兼柊浣撻獙妯″紡鍦∕etro鐣岄潰涓嬫湁闂錛屾瘡嬈$‘璁よ緭鍏ワ紝鍏夋爣閮戒細(xì)鍥炲埌鏈鍓嶉潰錛堟敞錛氱‘璁よ繖鏄綋鏃舵柊嫻井鍗歐in8瀹㈡埛绔殑Bug錛屼笉鏄緭鍏ユ硶鐨勯棶棰橈紝鏂版氮寰崥璨屼技宸茬粡淇姝ら棶棰橈級(jí)銆備篃璁告槸鍥犱負(fù)鏈夎繖浜汢ug錛屽井杞墠闅愯棌瀹冪殑鍚с備笉榪囷紝妗岄潰妯″紡涓嬩嬌鐢ㄨ搗鏉ユ湭鍙戠幇浠諱綍闂鍝︺?
錛堟墍鏈夊唴瀹歸拡瀵?VC 緙栬瘧騫沖彴錛?/p>
涓銆亁86
| 鍚嶇О | 浼犲弬鏂瑰紡 | 鏍堟竻鐞?/td> | C 璇█鍑芥暟閲嶅懡鍚嶏紙渚嬶細(xì)int func(int, double)錛?/td> |
| __cdecl | 浠庡彸鑷沖乏鍘嬫爤 | 涓昏皟鍑芥暟 | 鍓嶉潰鍔犫淿鈥濓紙_func錛?/td> |
| __stdcall | 浠庡彸鑷沖乏鍘嬫爤 | 琚皟鍑芥暟 | 鍓嶉潰鍔犫淿鈥濓紝鍚庨潰鍔犫淍鈥濆啀鍔犲弬鏁板崄榪涘埗瀛楄妭鏁幫紙_func@12錛?/td> |
| __fastcall | 鍓嶄袱涓笉澶т簬DWORD闀垮害鐨勫弬鏁頒粠宸﹁嚦鍙沖垎鍒瓨鍒?ECX銆丒DX錛屽叾浣欎粠鍙寵嚦宸﹀帇鏍?/td> | 琚皟鍑芥暟 | 鍓嶉潰鍔犫淍鈥濓紝鍚庨潰鍔犫淍鈥濆啀鍔犲弬鏁板崄榪涘埗瀛楄妭鏁幫紙@func@12錛?/td> |
| __thiscall | ECX 瀛?this錛屽叾浣欎粠鍙寵嚦宸﹀帇鏍?/td> | 琚皟鍑芥暟 | 浠呯敤浜?C++ |
浜屻亁64
| 鍚嶇О | 浼犲弬鏂瑰紡 | 鏍堟竻鐞?/td> | |
| __fastcall | 鍓嶅洓涓暣鏁?嫻偣鏁版斁鍦?RCX/XMM0銆丷DX/XMM1銆丷8/XMM2銆丷9/XMM3錛屽叾浣欏帇鏍堛?br>濡傛灉鍓?4 涓弬鏁板垎鍒負(fù) int銆乫loat銆乴ong銆乨ouble錛屽畠浠皢鍒嗗埆琚瓨鍒?RCX銆乆MM1銆丷8銆乆MM3 | 琚皟鍑芥暟 |
64浣嶇紪璇戠幆澧冧笅錛屽彲浠ユ寚瀹?__cdecl銆乢_stdcall銆乢_fastcall錛屼絾鏄紪璇戝櫒浼?xì)蹇界暐瀹冧滑銆備袱涓樉紺烘寚瀹氫簡(jiǎn)涓嶅悓璋冪敤綰﹀畾鐨勫嚱鏁頒笉鏋勬垚閲嶈澆錛岃屾瀯鎴愰噸瀹氫箟閿欒銆?/p>
紼嶅井瑙i噴涓嬶紝鍥犱負(fù)鏈夊彲鑳芥湁浜轟細(xì)璇細(xì)錛氭斁鏂扮嚎紼嬮噷闈㈠幓涓嶅氨鍙互浜?jiǎn)锛煒q欐病鏈夎В鍐抽棶棰樸傚姝ょ殑璇濓紝浣犻偅涓嚎紼嬪嚱鏁版庝箞鍐欙紵鎴栬呯嚎紼嬪嚱鏁伴噷璋冪敤鐨勬煇涓換鍔″嚱鏁版庝箞鍐欙紵鎬諱箣錛屽綰跨▼铏界劧鎬繪槸鍑虹幇鍦ㄨ繖浜涢棶棰樼殑瑙e喅鏂規(guī)涓紝浣嗕笉鏄綰跨▼瑙e喅浜?jiǎn)杩欎釜闂銆傚棷鈥︹︿笉鐭ラ亾璇存竻妤氫簡(jiǎn)娌★紵
鐩墠鎴戝績(jī)閲岀殑絳旀鍙湁榪欎竴縐嶆ā寮忥細(xì)
bool DoTask(HANDLE hQuitSignal)
{
while (!QuitCondition)
{
if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0)
{
return false;
}
// Do something
}
return true;
}
鍏朵腑錛屸?/ Do something鈥濋儴鍒嗚緇嗗寲鍒扮灛闂存墽琛屽畬鎴愮殑緇嗗害銆?/p>
浣嗘槸鎴戝緢鍥版儜鐨勬槸錛屽鏋滆繖浜涗換鍔″緢綣侀噸錛岄毦閬撴垜蹇呴』姣忚繘琛屼竴浜涙搷浣滃氨 if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0) 媯(gè)鏌ヤ笅鍚楋紵榪欐牱宀備笉鏄繖縐嶆嫻嬩唬鐮佸厖鏂ュ湪浠誨姟涓簡(jiǎn)錛?/p>
涓嶇煡鍚勪綅鏈変綍緇忛獙鍜屼綋浼?xì)锛屾眰鏁檦
GUI妗嗘灦錛岃鍋氱殑浜嬫儏鎴戞兂澶ф鏄繖涔堝嚑姝ワ細(xì)
鍓嶄笁姝ヨ璧扮殑姣旇緝?yōu)畯蹇?jī)錛岀鍥涙鏄綋鍔涘姵鍔ㄣ?/p>
絎竴姝ワ紝W(xué)indows涓嬪彲鍙傝冪殑鏄疢FC鏂瑰紡銆乄TL鏂瑰紡錛屼互鍙?qiáng)鍒╃敤Window鐩稿叧灞炴т腑鐨勬煇浜涚┖浣嶃傚墠涓嶄箙鍒氬垵姝ョ湅榪嘩TL鐨勬満鍒訛紝铏界劧褰撴椂娌″啓GUI妗嗘灦鐨勬墦綆楋紝涓嶈繃涔熸湁鐐規(guī)妧鏈噯澶囩殑鎰忔濅簡(jiǎn)銆傜幇瀛︾幇鐢ㄥ惂銆傝繖閲屼竴涓彲浠ラ瑙佺殑闂鏄?4浣嶅吋瀹癸紝鐜板湪娌℃湁嫻嬭瘯鐜錛屽厛涓嶇銆?/p>
鎺ヤ笅鏉ョ湅絎簩姝ヤ簡(jiǎn)錛屾墍瑕佸仛鐨勪簨鎯呭氨鏄妸 WndProc 涓嬬殑 涓鍫?case 鏈夋晥鍦扮粍緇囪搗鏉ワ紝鎴栬呮崲涓啓娉曘備箣鍓嶈繕鐪熶笉鐭ラ亾 MFC/WTL 鐨?BEGIN_MSG_MAP銆備互涓哄緢楂樻繁鐨勶紝鎯充笉鍒板氨鏄嫾瑁呮垚涓涓ぇ鐨?WndProc銆傚厛鎶勪簡(jiǎn)錛屽仛鎴愪竴涓彲榪愯鐨勭増鏈備絾鏄紝榪欐柟闈細(xì)鐩存帴鍐沖畾浠ュ悗鐨勫ぇ閮ㄥ垎浣跨敤鏂瑰紡錛屽崟鍗曟妱涓涓嬫剰涔変笉澶с傚悗鏉ュ幓 @OwnWaterloo 鏇炬帹鑽愯繃鐨?@cexer 鐨勫崥瀹笂閫涗簡(jiǎn)鍑犲湀錛岀涓鍦堢湅浜?jiǎn)涓浜涙弿榪版ф枃瀛楋紝絎簩鍦堝ぇ姒傜湅浜?jiǎn)涓嬫妧鏈紝絎笁鍦堟槸鎸栧潫錛岄偅涓紶璇翠腑鐨?cppblog 絎竴楂樻ゼ鍟娿傘傚叾涓湁涓涓嬌鐢ㄦ柟寮忓緢鏂伴錛屽棷鈥︹︽槸閭d釜涓嶉渶瑕佹墜鍔ㄥ啓鏄犲皠浠g爜錛岀洿鎺ュ疄鐜版秷鎭鐞嗗嚱鏁扮殑鏂瑰紡銆備笉榪囨垜鍚庢潵瑙夊緱榪樻槸涓嶈榪欑鏍峰瓙浜?jiǎn)锛屽嚟鎴戜釜錆h鐨勭洿瑙夛紝濡傛灉鎴戝啓涓嬭繖鏍風(fēng)殑澶勭悊鍑芥暟錛屾垜澶ф浼?xì)鍥犱皋Z笉鐭ラ亾浣曟椂娉ㄥ唽浜?jiǎn)杩欎釜鍑芥暟鑰屾壘涓嶅埌璋冪敤鏉ユ簮鑰屾劅鍒伴儊闂楓傚湪Windows鍥炶皟鏈哄埗鐨勫獎(jiǎng)鍝嶄笅錛屾垜鍙兘浼?xì)寰堟姳鏈夊亸瑙佸湴璁や负锛屽彧鏈夌洿鎺ユ潵鑷猈ndProc鐨勮皟鐢紝鎵嶇畻鏄潵婧愭槑紜殑錛屼笉闇瑕佺戶緇拷韙殑鈥斺斿綋鐒?dòng)灱寴q欐槸寤虹珛鍦ㄦ垜涓嶇啛鎮(zhèn)夎繖涓鏋剁殑鍩虹涓婄殑銆傛鏋跺繀鐒墮渶瑕侀殣钘忚皟鐢ㄦ潵婧愶紝浠ュ強(qiáng)鍏朵粬涓浜涚粏鑺傦紝浣嗘槸鍦ㄨ繖涓姝ワ紝鎴戣寰楃◢寰湁鐐規(guī)棭銆?/p>
鍒氭墠璇村埌鐨勯兘鏄潤鎬佺粦瀹氥傜幇鍦ㄦ垜鏈夌偣鍊懼悜浜庡姩鎬佺粦瀹氥備粠浣跨敤鏂逛究紼嬪害涓婃潵鐪嬶紝鍔ㄦ佺粦瀹氭洿鍏風(fēng)伒媧繪с備粠鎬ц兘涓婏紝鍔ㄦ佺粦瀹氫笅錛屾秷鎭埌澶勭悊鍑芥暟鐨勬煡鎵捐繃紼嬪彲浠ユ洿蹇紝闈欐佺粦瀹氬彧鑳介亶鍘嗐傚綋鐒?dòng)灱屾湭蹇厼畣鈥滄坊鍔犲鐞嗗嚱鏁扳濊繖鏍風(fēng)殑鎺ュ彛鎻愪緵緇欐渶緇堢敤鎴鳳紝浣嗘槸榪欎釜鎿嶄綔瀵逛簬鏁翠釜鎺т歡浣撶郴鐨勫艦鎴愬簲璇ヨ洰鏈夊府鍔╃殑鍚с傛瘮濡侻FC涓嬩竴涓帶浠剁被浣跨敤Message Map鍋氫簡(jiǎn)涓浜涗簨鎯咃紝緇ф壙綾誨氨鏃犳硶鐩存帴緇ф壙榪欎釜鍔ㄤ綔錛屼簬鏄彲鑳介渶瑕佸仛涓ゅ澶勭悊鍑芥暟璋冪敤鏈哄埗錛屼竴濂楁槸緇欏唴閮ㄧ戶鎵跨敤鐨勶紝涓濂楁槸緇欑敤鎴風(fēng)殑銆傚鏋滃湪鏈寮濮嬬殑鍩虹被淇濆瓨涓涓秷鎭槧灝勶紝姣忎釜娑堟伅瀵瑰簲涓鏃忓鐞嗗嚱鏁幫紝姣忎釜緇ф壙綾婚兘鍙互娣誨姞澶勭悊鍑芥暟錛屼絾涓嶅垹闄ょ埗綾誨凡娣誨姞鐨勫嚱鏁幫紝榪欐牱灝卞彲浠ュ湪涓濂桵essage Map鏈哄埗涓嬭幏寰楃埗綾葷殑琛屼負(fù)銆備互涓婏紝涓嶇煡閬撹冭檻寰楀涓嶅錛屾榪庤璁恒?/p>
鍏朵腑錛岀埗綾諱繚瀛樺瓙綾葷粰鍑虹殑鍙皟鐢ㄤ綋騫舵紜墽琛屾槸涓棶棰樸傛姌鑵句簡(jiǎn)涓浜涙椂闂達(dá)紝閮芥病鏈夋垚鍔熴傛垜姣旇緝綰犵粨錛屾兂鐭ラ亾闄や簡(jiǎn)鐢╢unction涔嬬被鐨勭帺鎰忓効澶栬繕鏈夋病鏈夊叾浠栫畝鍗曞彲琛岀殑鍔炴硶銆傚悗鏉ュ幓@zblc鐨勭兢涓婇棶錛?a href="mailto:zblc@vczh" target="_blank">@vczh涔熻闇瑕佷竴濂梖unction鏈哄埗銆傜湅鏉ユ槸閫冧笉寮榪欎釜闂浜?jiǎn)銆傚棷鈥︹︽兂璧鋒潵澶х害涓や釜鏈堝墠涓涓悓浜嬩粠codeproject鎵炬潵浜?jiǎn)涓涓狦UI妗嗘灦鐪嬶紝鐪嬪埌鍑犺鏁存暣榻愰綈鐨?AddMsgHandler(WM_CREATE, XXX(this, &MyWindow::OnCreate));錛屽徆涓嶅凡銆傛垜褰撴椂鎵撹叮璇達(dá)紝榪欏緢綆鍗曠殑錛屾棤闈炴槸鎼炰簡(jiǎn)涓?function 鑰屽凡錛屽摜鍝ヤ袱澶╁氨鑳芥悶瀹氥備簬鏄粬浠彨鎴戜袱澶╂悶瀹氥傛垜榧撴崳浜?0鍒嗛挓錛屾悶涓嶅畾錛屽彧濂戒涪涓鍙ワ紝鐪熺殑寰堢畝鍗曠殑錛岀被浼糱oost::function錛屼綘鍘葷湅涓涓嬪氨鐭ラ亾浜?jiǎn)锛屽摜鍝ヨ骞矉z諱簡(jiǎn)銆?/p>
鏃㈢劧鐜板湪榪樻槸緇曚笉寮榪欎釜闂錛岄偅榪樻槸鎼炰竴涓嬩簡(jiǎn)錛屾悶濂戒互鍚庡氨鏉冧笖褰撳仛緇欎粬浠氦浣滀笟鍚с傛垜浼?xì)鍙﹀啓涓綃囨枃绔犺璇磃unction鐨勪簨鎯咃紝榪欓噷鍏堢暐榪囥傜幇鍦ㄥ紑濮嬪亣璁捐繖涓鏂藉凡緇忛犲ソ浜?jiǎn)銆傞偅涔堬紝紿楀彛綾諱腑澶ф鍙互榪欎箞瀹氫箟鐩稿叧綾誨瀷錛?/p>
typedef Function<bool (WPARAM, LPARAM)> MsgHandler;
typedef List<MsgHandler> MsgHandlerList;
typedef Map<UINT, MsgHandlerList> MsgMap;
鐒跺悗鍐嶅畾涔変竴涓彉閲忥細(xì)
MsgMap m_MsgMap;
瀹冪敤浜庝繚瀛樻秷鎭槧灝勩傛渶緇堢殑鍥炶皟鍑芥暟鍙互鍐欐垚錛?/p>
LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
bool bHandled = false;
MsgMap::Iterator itMsgMap = m_MsgMap.Find(uMsg);
if (itMsgMap != m_MsgMap.End())
{
for (MsgHandlerList::Iterator it = itMsgMap->Value.Begin();
!bHandled && it != itMsgMap->Value.End(); ++it)
{
bHandled = (*it)(wParam, lParam);
}
}
return bHandled ? TRUE : DefWindowProc(m_hWnd, uMsg, wParam, lParam);
}
鏈鍚庣粰涓坊鍔犳秷鎭槧灝勭殑鎺ュ彛錛?/p>
void AppendMsgHandler(UINT uMsg, MsgHandler pMsgHandler)
{
m_MsgMap[uMsg].PushBack(pMsgHandler);
}
鍒扮洰鍓嶄負(fù)姝紝鎴戜滑鐨勭獥鍙g被澶ц嚧涓婂彲浠ュ啓鎴愯繖鏍鳳細(xì)
#include <Windows.h>
#include <tchar.h>
#include "../GUIFramework/xlWindowBase.h"
class Window : public xl::WindowBase
{
public:
Window()
{
AppendMsgHandler(WM_ERASEBKGND, MsgHandler(this, &Window::OnEraseBackground));
AppendMsgHandler(WM_PAINT, MsgHandler(this, &Window::OnPaint));
AppendMsgHandler(WM_LBUTTONUP, MsgHandler(this, &Window::OnLButtonUp));
AppendMsgHandler(WM_RBUTTONUP, MsgHandler(this, &Window::OnRButtonUp));
AppendMsgHandler(WM_DESTROY, MsgHandler(this, &Window::OnDestroy));
}
protected:
bool OnEraseBackground(WPARAM wParam, LPARAM lParam)
{
return false;
}
bool OnPaint(WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps = {};
BeginPaint(m_hWnd, &ps);
RECT rect = { 200, 200, 400, 400 };
DrawText(ps.hdc, _T("Hello, world!"), -1, &rect, DT_CENTER | DT_VCENTER);
EndPaint(m_hWnd, &ps);
return false;
}
bool OnLButtonUp(WPARAM wParam, LPARAM lParam)
{
MessageBox(m_hWnd, _T("LButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
return false;
}
bool OnRButtonUp(WPARAM wParam, LPARAM lParam)
{
MessageBox(m_hWnd, _T("RButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
return false;
}
bool OnDestroy(WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return false;
}
};
鍦ㄦ渶鍩虹鐨?WindowBase 閲岋紝鎼炴垚榪欐牱澶ф宸笉鏄緢澶氫簡(jiǎn)銆傛殏鏃跺厛鐪嬬涓夋銆傚埌鐩墠涓烘錛屾垜鎵鍚榪囩殑 GUI 妗嗘灦閮芥槸鐪熸鐨勬鏋訛紝浼間箮娌℃湁鈥淕UI 搴撯濄備負(fù)浠涔堜竴瀹氳浠ョ戶鎵挎煇涓熀綾葷殑鏂瑰紡鏉ヤ嬌鐢ㄥ憿錛熷鏋滃儚涓嬮潰榪欐牱浣跨敤鍛紵
class Window
{
private:
xl::WindowBase m_WindowBase;
public:
Window()
{
m_WindowBase.AppendMsgHandler(WM_ERASEBKGND, MsgHandler(this, &Window::OnEraseBackground));
m_WindowBase.AppendMsgHandler(WM_PAINT, MsgHandler(this, &Window::OnPaint));
m_WindowBase.AppendMsgHandler(WM_LBUTTONUP, MsgHandler(this, &Window::OnLButtonUp));
m_WindowBase.AppendMsgHandler(WM_RBUTTONUP, MsgHandler(this, &Window::OnRButtonUp));
m_WindowBase.AppendMsgHandler(WM_DESTROY, MsgHandler(this, &Window::OnDestroy));
}
};
榪欎釜闂錛屼笉鐭ラ亾鍚勪綅鏈夋病鏈変粈涔堟濊冿紵
榪樻湁涓涓棶棰樻槸錛屾帴涓嬪幓瑕佷笉瑕佸皢 WPARAM 鍜?LPARAM 鐨勫惈涔夊交搴曡В鏋愭帀錛屾悶鎴愪竴緋誨垪 PaintParam銆丒raseBackgroundParam銆丩ButtonUpParam銆丷ButtonUpParam錛孌estroyParam錛岃浣跨敤鐨勬椂鍊欎笌鍘熷娑堟伅鍙傛暟褰誨簳闅旂鍛紵
鏈鍚庝竴姝ワ紝铏借鏄綋鍔涙椿錛屼絾榪欒窡鏈緇堢殑搴旂敤鍦哄悎瀵嗗垏鐩稿叧錛岄渶瑕佹彁渚涙庝箞鏍風(fēng)殑鍔熻兘鏄竴浠墮渶瑕佽冮噺鐨勪簨銆?/p>
鐩墠璧板湪絎簩姝ワ紝鎵浠ヤ笅闈㈢殑涓や釜闂鎬濊冨緱涓嶅銆傛眰緇忛獙錛屾眰鎰忚銆?/p>
闂錛?br>鏈夋病鏈夊瓨鍦ㄤ竴縐嶅ソ鐨勬柟寮忥紝璁〥LL鑳藉琚姩鎬佸姞杞斤紝騫朵笖鑳藉鏂逛究鍦板緱鍒伴噷闈㈢殑 C++ class 淇℃伅錛?br>澶囬夛細(xì)
1銆佸埆鎯充簡(jiǎn)錛岃佽佸疄瀹炲湴鐢ㄥ惂錛岃繕鏄鍑虹函C鍑芥暟= =
2銆佸ぇ鑳嗙殑瀵煎嚭 class 鍚э紝濡傛灉鍔ㄦ佸姞杞斤紝鑷繁鍘繪嫾閭d簺緙栬瘧鍚庡悕瀛楀惂銆傘?br>3銆丆OM 褰㈠紡錛熷彲鏄紝瑕佹敞鍐屽埌緋葷粺涓幓錛屽嚟絀哄浜?jiǎn)绯痪l熸敞鍐岃〃渚濊禆
4銆佽繕鏈夊悧錛?br>5銆佺敋鑷沖彲浠ユ姏寮DLL錛屾湁娌℃湁綾諱技鐨勪竴縐嶆柟寮忥紝鍙敤浜庝簩榪涘埗浠g爜鐨勬ā鍧楀垝鍒嗕互鍙?qiáng)闂簮鐨勪唬鐮侀噸鐢ㄥQ?/p>
錛堣嚦浜庤法騫沖彴鍟ョ殑鍏堜笉鑰冭檻鍚э紝鏆傚畾Windows騫沖彴涓嬪惂錛?/p>
璇蜂笉鍚濇寚鏁檦
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
LPVOID lpThreadParameter
);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
榪欐牱錛屽綋鎴戜滑瀹炵幇綰跨▼綾葷殑鏃跺欙紝灝卞彲浠ワ細(xì)
class Thread
{
private:
HANDLE m_hThread;
public:
BOOL Create()
{
m_hThread = CreateThread(NULL, 0, StaticThreadProc, (LPVOID)this, 0, NULL);
return m_hThread != NULL;
}
private:
DWORD WINAPI ThreadProc()
{
// TODO
return 0;
}
private:
static DWORD WINAPI StaticThreadProc(LPVOID lpThreadParameter)
{
((Thread *)lpThreadParameter)->ThreadProc();
}
};
涓嶈繃錛岃繖鏍鳳紝鎴愬憳鍑芥暟 ThreadProc() 渚夸撫澶變簡(jiǎn)涓涓弬鏁幫紝榪欓氬父鏃犱激澶ч泤錛屼換浣曞師鏈渶瑕佷粠鍙傛暟浼犲叆鐨勪俊鎭兘鍙互浣滀負(fù)鎴愬憳鍙橀噺璁?ThreadProc 鏉ヨ鍐欍傚鏋滀竴瀹氭湁浜涗粈涔堟槸闈炰粠鍙傛暟浼犲叆涓嶅彲鐨勶紝閭d篃鍙互錛屼竴縐嶅仛娉曪紝鍒涘緩綰跨▼鐨勬椂鍊欎紶鍏ヤ竴涓寘鍚?this 鎸囬拡淇℃伅鐨勭粨鏋勩傜浜岀鍋氭硶錛屽璇?class 浣滃崟渚嬮檺鍒垛斺斿鏋滅幇瀹炴儏鍐靛厑璁哥殑璇濄?/p>
鎵浠ワ紝鏈夐澶栧弬鏁扮殑鍥炶皟鍑芥暟閮藉ソ澶勭悊銆備笉騫哥殑鏄紝W(xué)indows 鐨勭獥鍙e洖璋冨嚱鏁版病鏈夎繖鏍蜂竴涓澶栧弬鏁幫細(xì)
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
榪欎嬌寰楀紿楀彛鐨?C++ 灝佽鍙樺緱鍥伴毦銆備負(fù)浜?jiǎn)瑙e唽櫩欎釜闂锛屼竴涓緢鑷劧鐨勬兂娉曟槸錛岀淮鎶や竴浠藉叏灞鐨勭獥鍙e彞鏌勫埌紿楀彛綾葷殑瀵瑰簲鍏崇郴錛屽錛?/p>
#include <map>
class Window
{
public:
Window();
~Window();
public:
BOOL Create();
protected:
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);
protected:
HWND m_hWnd;
protected:
static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static std::map<HWND, Window *> m_sWindows;
};
鍦?Create 鐨勬椂鍊欙紝鎸囧畾 StaticWndProc 涓虹獥鍙e洖璋冨嚱鏁幫紝騫跺皢 hWnd 涓?this 瀛樺叆 m_sWindows錛?/p>
BOOL Window::Create()
{
LPCTSTR lpszClassName = _T("ClassName");
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.lpfnWndProc = StaticWndProc;
wcex.hInstance = hInstance;
wcex.lpszClassName = lpszClassName;
RegisterClassEx(&wcex);
m_hWnd = CreateWindow(lpszClassName, NULL, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (m_hWnd == NULL)
{
return FALSE;
}
m_sWindows.insert(std::make_pair(m_hWnd, this));
ShowWindow(m_hWnd, SW_SHOW);
UpdateWindow(m_hWnd);
return TRUE;
}
鍦?StaticWindowProc 涓紝鐢?hWnd 鎵懼埌 this錛岀劧鍚庤漿鍙戠粰鎴愬憳鍑芥暟錛?/p>
LRESULT CALLBACK Window::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::map<HWND, Window *>::iterator it = m_sWindows.find(hWnd);
assert(it != m_sWindows.end() && it->second != NULL);
return it->second->WndProc(message, wParam, lParam);
}
錛坢_sWindows 鐨勫綰跨▼淇濇姢鐣ヨ繃錛屼笅鍚岋級(jí)
鎹 MFC 閲囩敤鐨勫氨鏄被浼肩殑鍋氭硶銆傜己鐐規(guī)槸錛屾瘡嬈?StaticWndProc 閮借浠?m_sWindows 涓幓鎵?this銆傜敱浜庣獥鍙g被涓鑸細(xì)淇濆瓨紿楀彛鍙ユ焺錛屽洖璋冨嚱鏁伴噷鐨?hWnd 灝辨病澶氬ぇ浣滅敤浜?jiǎn)锛屽鏋湗q欎釜 hWnd 鑳藉琚敤鏉ュ瓨 this 鎸囬拡灝卞ソ浜?jiǎn)锛岄偅涔垶p兘鍐欐垚榪欐牱錛?/p>
LRESULT CALLBACK Window::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return ((Window *)hWnd)->WndProc(message, wParam, lParam);
}
榪欐牱鐪嬩笂鍘誨氨鐖藉浜?jiǎn)銆備紶璇翠腑 WTL 鎵閲囧彇鐨?thunk 鎶鏈氨鏄繖涔堝共鐨勩備箣鍓嶏紝鍙槸鍚繃榪欓仴榪滅殑浼犺錛屼粖澶╋紝緇堜簬鏈夋満浼?xì)璧皹q涜繖涓紶璇村幓鐪嬩竴鐪嬨傚弬鑰冭祫鏂欐槸涓綃囦笉鐭ュ師濮嬪嚭澶勭殑鏂囩珷銆婃繁鍏ュ墫鏋怶TL鈥擶TL妗嗘灦紿楀彛鍒嗘瀽銆嬶紝浠ュ強(qiáng)閮ㄥ垎 WTL 8.0 浠g爜錛岃繕鏈夊叾浠栦貢涓冨叓緋熺殑鏂囩珷銆?/p>
WTL 鐨勬濊礬鏄紝姣忔鍦ㄧ郴緇熻皟鐢?WndProc 鐨勬椂鍊欙紝璁╁畠楝間嬌紲炲樊鍦板厛璧板埌鎴戜滑鐨勫彟涓澶勪唬鐮侊紝璁╂垜浠湁鏈轟細(xì)淇敼鍫嗘爤涓殑 hWnd銆傝繖澶勪唬鐮佸彲鑳芥槸綾諱技榪欐牱鐨勶細(xì)
__asm
{
mov dword ptr [esp+4], pThis ;璋冪敤 WndProc 鏃訛紝鍫嗘爤緇撴瀯涓猴細(xì)RetAddr, hWnd, message, wParam, lParam, ... 鏁?[esp+4]
jmp WndProc
}
鐢變簬 pThis 鍜?WndProc 闇瑕佽浜嬪厛淇敼錛堜絾鍙堟棤娉曞湪緙栬瘧鍓嶅畾濂斤級(jí)錛屾墍浠ユ垜浠渶瑕佽繍琛岀殑鏃跺欏幓淇敼榪欓儴鍒嗕唬鐮併傚厛寮勪竴涓皬紼嬪簭鎺㈡祴涓嬭繖涓よ璇彞鐨勬満鍣ㄧ爜錛?/p>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return 0;
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, NULL, NULL, MB_OK);
__asm
{
mov dword ptr [esp+4], 1
jmp WndProc
}
return 0;
}
鏈鍓嶉潰鐨?MessageBox 鏄負(fù)浜?jiǎn)绛変笅璋冭瘯鐨勬椂鍊欏鏄撴壘鍒拌繘鍏ョ偣銆?/p>
鐒跺悗浣跨敤 OllyDbg錛屽湪 MessageBoxW 涓婅緗柇鐐癸紝鎵ц鍒拌鍑芥暟榪斿洖錛?/p>
榪欓噷鎴戜滑鐪嬪埌錛宮ov dword ptr [esp+4] 鐨勬満鍣ㄧ爜涓?C7 44 24 04錛屽悗闈㈢揣鎺ョ潃鐨勪竴涓?DWORD 鏄?mov 鐨勭浜屼釜鎿嶄綔鏁般俲mp 鐨勬満鍣ㄧ爜鏄?e9錛屽悗闈㈢揣鎺ョ潃鐨勪竴涓?DWORD 鏄煩杞殑鐩稿鍦板潃銆傚叾涓?00061000h - 0006102Bh = FFFFFFD5h銆?/p>
浜庢槸瀹氫箟榪欐牱涓涓粨鏋勶細(xì)
#pragma pack(push,1)
typedef struct _StdCallThunk
{
DWORD m_mov; // = 0x042444C7
DWORD m_this; // = this
BYTE m_jmp; // = 0xe9
DWORD m_relproc; // = relative distance
} StdCallThunk;
#pragma pack(pop)
榪欎釜緇撴瀯鍙互浣滀負(fù)紿楀彛綾葷殑鎴愬憳鍙橀噺瀛樺湪銆傛垜浠殑紿楀彛綾葷幇鍦ㄥ彉鎴愪簡(jiǎn)榪欐牱瀛愶細(xì)
class Window
{
public:
Window();
~Window();
public:
BOOL Create();
protected:
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);
protected:
HWND m_hWnd;
StdCallThunk m_thunk;
protected:
static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};
浼間箮灝戜簡(jiǎn)鐐逛粈涔堚︹﹀垱寤虹獥鍙g殑鏃跺欙紝鎴戜滑鏄笉鑳界洿鎺ユ妸鍥炶皟鍑芥暟璁懼埌 StaticWndPorc 涓幓鐨勶紝鍥犱負(fù)榪欎釜鍑芥暟鏄笇鏈涜鍐欐垚榪欐牱瀛愮殑錛?/p>
LRESULT CALLBACK Window::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return ((Window *)hWnd)->WndProc(message, wParam, lParam);
}
閭d箞鑷沖皯闇瑕佷竴涓復(fù)鏃剁殑鍥炶皟鍑芥暟錛屽湪榪欎釜鍑芥暟閲屽幓璁劇疆鏂扮殑鍥炶皟鍑芥暟錛堣鍒?m_thunk 涓婏級(jí)錛屽啀鐢?m_thunk 鏉ヨ皟鐢?StaticWndProc錛孲taticWndProc 鍐嶅幓璋冪敤 WndProc錛岃繖鏍鋒暣涓繃紼嬪氨閫氫簡(jiǎn)銆?/p>
浣嗘槸錛屼復(fù)鏃跺洖璋冨嚱鏁拌繕鏄渶瑕佺煡閬撲粠 hWnd 鍒?this 鐨勫搴斿叧緋匯傚彲鏄幇鍦ㄦ垜浠笉鑳界収鎼敤鍒氭墠鐨?m_sWindows 浜?jiǎn)銆傚洜涓虹獥鍙e湪鍒涘緩榪囩▼涓氨浼?xì)璋冪敤鍒板洖璋冨嚱鏁板Q岄渶瑕佷嬌鐢ㄥ埌 m_sWindows 閲岀殑 this錛岃岀獥鍙h鎴愬姛鍒涘緩涔嬪墠錛屾垜浠病娉曟彁鍓嶆嬁鍒?HWND 瀛樺叆 m_sWindows銆傜幇鍦紝鎹釜鏂規(guī)硶錛屽瓨褰撳墠綰跨▼ ID 涓?this 鐨勫搴斿叧緋匯傝繖鏍鳳紝榪欎釜綾誨彉鎴愪簡(jiǎn)錛?/p>
#include <map>
class Window
{
public:
Window();
~Window();
public:
BOOL Create();
protected:
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);
protected:
HWND m_hWnd;
StdCallThunk m_thunk;
protected:
static LRESULT CALLBACK TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
鐒跺悗瀹炵幇 Create 鍜?TempWndProc錛?/p>
BOOL Window::Create()
{
LPCTSTR lpszClassName = _T("ClassName");
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.lpfnWndProc = TempWndProc;
wcex.hInstance = hInstance;
wcex.lpszClassName = lpszClassName;
RegisterClassEx(&wcex);
DWORD dwThreadId = GetCurrentThreadId();
m_sWindows.insert(std::make_pair(dwThreadId, this));
m_thunk.m_mov = 0x042444c7;
m_thunk.m_jmp = 0xe9;
m_hWnd = CreateWindow(lpszClassName, NULL, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (m_hWnd == NULL)
{
return FALSE;
}
ShowWindow(m_hWnd, SW_SHOW);
UpdateWindow(m_hWnd);
return TRUE;
}
LRESULT CALLBACK Window::TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::map<DWORD, Window *>::iterator it = m_sWindows.find(GetCurrentThreadId());
assert(it != m_sWindows.end() && it->second != NULL);
Window *pThis = it->second;
m_sWindows.erase(it);
WNDPROC pWndProc = (WNDPROC)&pThis->m_thunk;
pThis->m_thunk.m_this = (DWORD)pThis;
pThis->m_thunk.m_relproc = (DWORD)&Window::StaticWndProc - ((DWORD)&pThis->m_thunk + sizeof(StdCallThunk));
m_hWnd = hWnd;
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pWndProc);
return pWndProc(hWnd, message, wParam, lParam);
}
宸笉澶氬彲浠ヤ簡(jiǎn)錛岃皟璇曚竴涓嬨傜粨鏋滐紝鍦?thunk 鐨勭涓琛屽嚭閿欎簡(jiǎn)銆傛垜鍘熶互涓哄湴鍧綆楅敊浜?jiǎn)绁為┈鐨勫Q屽皾璇曟妸 thunk.m_mov 鏀逛負(fù) 0x90909090錛屽啀榪愯錛岃繕鏄嚭閿欍備簬鏄偦鎺変簡(jiǎn)鈥︹﹁繃浜?jiǎn)濂戒竴浼?xì)鍎挎墠鎰忚瘑鍒板Q屽彲鑳芥槸鍥犱負(fù) thunk 鍦ㄦ暟鎹錛屾棤娉曡鎵ц銆傚彲鏄紝寰堜箙寰堜箙浠ュ墠鍋舵淮涓涓暚鐖辯殑鑰佸笀鍦?TC 涓紦鎹g▼搴忚繍琛屾椂鏀瑰彉鑷韓浠g爜鏃訛紝璨屼技鏃犳闂鍟娿傘傘傜劧鍚庢煡鍛鏌ワ紝鍘熸潵鏄?Windows 鍦ㄧ殑鏁版嵁鎵ц淇濇姢鎼炵殑楝箋備簬鏄紝闇瑕佺敤 VirtualAlloc 鏉ョ敵璇蜂竴孌墊湁鎵ц鏉冮檺鐨勫唴瀛樸俉TL 閲岄潰涔熸槸榪欎箞鍋氱殑錛屼笉榪囧畠浼間箮緇存姢浜?jiǎn)涓鍧楄緝澶х殑鍙墽琛屽唴瀛樺尯浣滀負(fù) thunk 鍐呭瓨姹狅紝鎴戜滑榪欓噷浠庣畝銆傛渶鍚庯紝鏁翠釜嫻佺▼緇堜簬璺戦氫簡(jiǎn)銆傛渶緇堜唬鐮佹竻鍗曞涓嬶細(xì)
#include <Windows.h>#pragma pack(push,1)
typedef struct _StdCallThunk
{
DWORD m_mov;
DWORD m_this;
BYTE m_jmp;
DWORD m_relproc;
} StdCallThunk;
#pragma pack(pop)
class Window
{
public:
Window();
~Window();
public:
BOOL Create();
protected:
LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);
protected:
HWND m_hWnd;
StdCallThunk *m_pThunk;
protected:
static LRESULT CALLBACK TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
static std::map<DWORD, Window *> m_sWindows;
};
std::map<DWORD, Window *> Window::m_sWindows;
Window::Window()
{
}
Window::~Window()
{
VirtualFree(m_pThunk, sizeof(StdCallThunk), MEM_RELEASE);
}
BOOL Window::Create()
{
LPCTSTR lpszClassName = _T("ClassName");
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.lpfnWndProc = TempWndProc;
wcex.hInstance = hInstance;
wcex.lpszClassName = lpszClassName;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
RegisterClassEx(&wcex);
DWORD dwThreadId = GetCurrentThreadId();
m_sWindows.insert(std::make_pair(dwThreadId, this));
m_pThunk = (StdCallThunk *)VirtualAlloc(NULL, sizeof(StdCallThunk), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
m_pThunk->m_mov = 0x042444c7;
m_pThunk->m_jmp = 0xe9;
m_hWnd = CreateWindow(lpszClassName, NULL, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (m_hWnd == NULL)
{
return FALSE;
}
ShowWindow(m_hWnd, SW_SHOW);
UpdateWindow(m_hWnd);
return TRUE;
}
LRESULT Window::WndProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONUP:
MessageBox(m_hWnd, _T("LButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
break;
case WM_RBUTTONUP:
MessageBox(m_hWnd, _T("RButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc(m_hWnd, message, wParam, lParam);
}
LRESULT CALLBACK Window::TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::map<DWORD, Window *>::iterator it = m_sWindows.find(GetCurrentThreadId());
assert(it != m_sWindows.end() && it->second != NULL);
Window *pThis = it->second;
m_sWindows.erase(it);
WNDPROC pWndProc = (WNDPROC)pThis->m_pThunk;
pThis->m_pThunk->m_this = (DWORD)pThis;
pThis->m_pThunk->m_relproc = (DWORD)&Window::StaticWndProc - ((DWORD)pThis->m_pThunk + sizeof(StdCallThunk));
pThis->m_hWnd = hWnd;
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)pWndProc);
return pWndProc(hWnd, message, wParam, lParam);
}
LRESULT CALLBACK Window::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
return ((Window *)hWnd)->WndProc(message, wParam, lParam);
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
Window wnd;
wnd.Create();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
鍒氭墠鏈変竴澶勶紝瀛?this 鎸囬拡鐨勬椂鍊欙紝鎴戝緢姝︽柇鍦版妸瀹冧笌褰撳墠綰跨▼ ID 鍏寵仈璧鋒潵浜?jiǎn)锛屽叾瀹灅q欐鏄?WTL 鏈韓鐨勫仛娉曘傚畠鐢?CAtlWinModule::AddCreateWndData 瀛樼殑 this錛屾渶緇堜細(xì)鎶婂綋鍓嶇嚎紼?ID 鍜?this 浣滃叧鑱斻傛垜鏄繖涔堢悊瑙g殑鍚э紝鍚屼竴綰跨▼涓嶅彲鑳藉悓鏃舵湁涓ゅ鍦ㄨ皟鐢?CreateWindow錛屾墍浠ヨ繖鏍峰彇鍥炴潵鐨?this 鏄彲闈犵殑銆?/p>
濂戒簡(jiǎn)錛屽埌姝や負(fù)姝紝杈硅瘯楠岃竟璁板綍鐨勶紝涓嶇煡閬撶悊瑙f槸鍚︽紜傛榪庢寚鍑轟笉褰撲箣澶勶紝涔熸榪庢彁鍑虹浉鍏崇殑闂鏉ヨ冩垜錛屾榪庝粙緇嶆湁鍏蟲闂鐨勬柊鏂規(guī)硶銆佹柊鎬濊礬錛岀瓑絳夛紝鎬諱箣錛岃鍚勪綅鐪嬪畼澶氭寚鏁欏搱銆?/p>
鍓嶄袱澶╃粓浜庢湁鍙互闅忔椂鎿嶄綔鐨勪笖閲嶇幇鍑犵巼闈炲父楂樼殑鏈哄櫒浜?jiǎn)锛寢箣璇曚簡(jiǎn)涓涓嬶紝鍙戠幇涓涓寰嬶細(xì)鍙鍦ㄨ皟鐢?InternetOpenURL 涔嬪墠璋冪敤榪?SHGetFolderPath錛屾闂鐨勯噸鐜板嚑鐜囧氨闈炲父楂橈紱濡傛灉娌℃湁璋冪敤榪?SHGetFolderPath錛屽垯鍩烘湰涓嶅嚭鐜般?/p>
鐩墠緗戜笂鎵懼埌鐨勪竴涓嚑涔庡敮涓鐨勫笘瀛愭槸 http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/2982efc6-8403-4577-9dba-ad5cfdf01753錛岀幇璞″嚑涔庝竴妯′竴鏍楓傚彧鍙儨娌℃湁鏈変環(huán)鍊肩殑鍥炲銆傝鏂囩珷鐨勪綔鑰呮寚鍑虹殑 VPN 絳夌綉緇滃師鍥犲ソ鍍忎笉鏄叧閿紝鍦ㄦ垜榪欓噷鏄緢鏅氱殑灞鍩熺綉錛屼竴鏍瘋兘鍑虹幇銆?/p>
嫻嬭瘯浠g爜濡備笅錛?/p>
#include <Windows.h>
#include <tchar.h>
#include <ShlObj.h>
#include <WinInet.h>
#pragma comment(lib, "wininet.lib")
#define URL _T("http://www.baidu.com/")
int main()
{
TCHAR szCommonAppData[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, szCommonAppData);
HINTERNET hInternet = InternetOpen(_T("WCU"), INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
if (hInternet == NULL)
{
return 0;
}
HINTERNET hInternetFile = InternetOpenUrl(hInternet, URL, NULL, 0, INTERNET_FLAG_NO_UI | INTERNET_FLAG_RELOAD, 0);
if (hInternetFile == NULL)
{
InternetCloseHandle(hInternet);
return 0;
}
InternetCloseHandle(hInternetFile);
InternetCloseHandle(hInternet);
return 0;
}
鍦ㄨ兘澶熷嚭鐜版闂鐨勬満鍣ㄤ笂錛孋trl + F5 鐩存帴榪愯錛屽嚑涔庢瘡嬈″繀鐜幫紱濡傛灉 F5 璋冭瘯榪愯錛屽垯鍑犵巼灝忎竴鐐癸紝浣嗘槸璺戜釜涓冨叓嬈″乏鍙沖熀鏈笂鑳藉嚭鐜般傜洰鍓?XP 32/64 涓婇兘鏈夊彂鐜拌繖涓棶棰橈紝Vista/Win7 涓婃殏鏃舵病鏈夊彂鐢熸鐜拌薄銆傦紙濡傛灉 InternetOpenURL 鎹㈡垚 InternetConnect銆丠ttpOpenRequest銆丠ttpSendrequest錛屽垯浼?crash 鍦?HttpSendRequest 鍐呫傦級(jí)
闄勪歡鏄竴涓祴璇曞伐紼嬶紝闄勫甫涓婁簡(jiǎn) Debug銆丷elease 鐗堟湰鐨?EXE銆丳DB 鏂囦歡浠ュ強(qiáng) Crash 鏃剁殑 Dump 鏂囦歡銆傝鏈夊績(jī)浜哄府蹇欑湅鐪嬨俕_^
鐐瑰嚮涓嬭澆
鍙槸錛屽鏋滆繖涓棶棰樼‘瀹炲瓨鍦紝涓轟粈涔堢綉涓婃煡鍒扮殑鐩稿叧鍐呭榪欎箞灝戝憿錛熷鎬獈
濂借鍘岋紝ri鍟妑i銆傘傘?/p>
鍚勪綅鏈夋病鏈夌獊鐮存柟娉曪細(xì)鎵懼埌涓涓換浣曠敤鎴烽兘鍙互鍙潬璇誨啓鐨勪綅緗紵
灝忚涓絎斻傛槑澶╃戶緇湅 64 浣嶇殑銆?/p>
==================================================
WinXP x64: 0x158
Vista x64: 0x160
Win7 x64: 0x200
浣嗗鏋滀粠鎺у埗闈㈡澘=>娣誨姞鍒犻櫎紼嬪簭錛堢▼搴忓拰鍔熻兘錛夐噷鎵ц錛堢浉褰撲簬鎵ц msiexec /鈥︼級(jí)錛屽湪榪囦竴浼?xì)鍎垮脊鍑虹?UAC 瀵硅瘽妗嗕腑閫夌鐞嗗憳鐢ㄦ埛錛屾鏃?HKEY_CURRENT_USER 涓虹鐞嗗憳鐢ㄦ埛鐨勬暟鎹紝浣嗘槸 SH鈥?緋誨垪 API 鐨勬墽琛岀幆澧冨嵈鏄爣鍑嗙敤鎴楓傛煡鐪嬩袱涓?MsiExec.exe 榪涚▼錛屽叾涓竴涓槸 System 鐢ㄦ埛鐨勶紝涔熷氨鏄?Windows Installer 鏈嶅姟瀵瑰簲鐨勮繘紼嬶紱鍙︿竴涓槸綆$悊鍛樼敤鎴風(fēng)殑錛屼絾鏄敤 Process Explorer 鏌ョ湅錛屽畠鐨勬墍鏈夌幆澧冭礬寰勫叏鏄爣鍑嗙敤鎴風(fēng)殑銆?/p>
瑙夊緱鏈夌偣濂囨紝鏄互璁頒箣銆俕_^