锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 瀛楃緙栫爜鐨勯棶棰樼湅浼煎緢灝忥紝緇忓父琚妧鏈漢鍛樺拷瑙嗭紝浣嗘槸寰堝鏄撳鑷翠竴浜涜帿鍚嶅叾濡欑殑闂銆傝繖閲屾葷粨浜嗕竴涓嬪瓧絎︾紪鐮佺殑涓浜涙櫘鍙婃х殑鐭ヨ瘑錛屽笇鏈涘澶у鏈夋墍甯姪銆?/p>
璇村埌瀛楃緙栫爜錛屼笉寰椾笉璇碅SCII鐮佺殑綆鍙層傝綆楁満涓寮濮嬪彂鏄庣殑鏃跺欐槸鐢ㄦ潵瑙e喅鏁板瓧璁$畻鐨勯棶棰橈紝鍚庢潵浜轟滑鍙戠幇錛岃綆楁満榪樺彲浠ュ仛鏇村鐨勪簨錛屼緥濡傛枃鏈鐞嗐備絾鐢變簬璁$畻鏈哄彧璇?#8220;鏁?#8221;錛屽洜姝や漢浠繀欏誨憡璇夎綆楁満鍝釜鏁板瓧鏉ヤ唬琛ㄥ摢涓壒瀹氬瓧絎︼紝渚嬪65浠h〃瀛楁瘝‘A’錛?6浠h〃瀛楁瘝‘B’錛屼互姝ょ被鎺ㄣ備絾鏄?strong>璁$畻鏈轟箣闂村瓧絎?鏁板瓧鐨勫搴斿叧緋誨繀欏誨緱涓鑷達紝鍚﹀垯灝變細閫犳垚鍚屼竴孌墊暟瀛楀湪涓嶅悓璁$畻鏈轟笂鏄劇ず鍑烘潵鐨勫瓧絎︿笉涓鏍?/span>銆傚洜姝ょ編鍥藉浗瀹舵爣鍑嗗崗浼欰NSI鍒跺畾浜嗕竴涓爣鍑嗭紝瑙勫畾浜嗗父鐢ㄥ瓧絎︾殑闆嗗悎浠ュ強姣忎釜瀛楃瀵瑰簲鐨勭紪鍙鳳紝榪欏氨鏄疉SCII瀛楃闆嗭紙Character Set錛夛紝涔熺ОASCII鐮併?/p>
褰撴椂鐨勮綆楁満鏅亶浣跨敤8姣旂壒瀛楄妭浣滀負鏈灝忕殑瀛樺偍鍜屽鐞嗗崟鍏冿紝鍔犱箣褰撴椂鐢ㄥ埌鐨勫瓧絎︿篃寰堝皯錛?6涓ぇ灝忓啓鑻辨枃瀛楁瘝榪樻湁鏁板瓧鍐嶅姞涓婂叾浠栧父鐢ㄧ鍙鳳紝涔熶笉鍒?00涓紝鍥犳浣跨敤7涓瘮鐗逛綅灝卞彲浠ラ珮鏁堢殑瀛樺偍鍜屽鐞咥SCII鐮侊紝鍓╀笅鏈楂樹綅1姣旂壒琚敤浣滀竴浜涢氳緋葷粺鐨勫鍋舵牎楠屻?/p>
娉ㄦ剰錛屽瓧鑺備唬琛ㄧ郴緇熻兘澶熷鐞嗙殑鏈灝忓崟浣嶏紝涓嶄竴瀹氭槸8姣旂壒銆傚彧鏄幇浠h綆楁満鐨勪簨瀹炴爣鍑嗗氨鏄敤8姣旂壒鏉ヤ唬琛ㄤ竴涓瓧鑺傘傚湪寰堝鎶鏈鏍兼枃鐚腑錛屼負浜嗛伩鍏嶄駭鐢熸涔夛紝鏇村懼悜浜庝嬌鐢?浣嶇粍錛圤ctet錛夎屼笉鏄瓧鑺傦紙Byte錛夎繖涓湳璇潵寮鴻皟8涓瘮鐗圭殑浜岃繘鍒舵祦銆備笅鏂囦腑涓轟簡渚夸簬鐞嗚В錛屾垜浼氬歡鐢ㄥぇ瀹剁啛鎮夌殑“瀛楄妭”榪欎釜姒傚康銆?/p> ASCII瀛楃闆嗙敱95涓彲鎵撳嵃瀛楃錛?x20-0x7E錛夊拰33涓帶鍒跺瓧絎︼紙0x00-0x19錛?x7F錛夌粍鎴愩傚彲鎵撳嵃瀛楃鐢ㄤ簬鏄劇ず鍦ㄨ緭鍑鴻澶囦笂錛屼緥濡傝崸灞忔垨鑰呮墦鍗扮焊涓婏紝鎺у埗瀛楃鐢ㄤ簬鍚戣綆楁満鍙戝嚭涓浜涚壒孌婃寚浠わ紝渚嬪0x07浼氳璁$畻鏈哄彂鍑哄摂鐨勪竴澹幫紝0x00閫氬父鐢ㄤ簬鎸囩ず瀛楃涓茬殑緇撴潫錛?x0D鍜?x0A鐢ㄤ簬鎸囩ず鎵撳嵃鏈虹殑鎵撳嵃閽堝ご閫鍒拌棣栵紙鍥炶濺錛夊茍縐誨埌涓嬩竴琛岋紙鎹㈣錛夈?/p>
閭f椂鍊欑殑瀛楃緙栬В鐮佺郴緇熼潪甯哥畝鍗曪紝灝辨槸綆鍗曠殑鏌ヨ〃榪囩▼銆備緥濡傚皢瀛楃搴忓垪緙栫爜涓轟簩榪涘埗嫻佸啓鍏ュ瓨鍌ㄨ澶囷紝鍙渶瑕佸湪ASCII瀛楃闆嗕腑渚濇鎵懼埌瀛楃瀵瑰簲鐨勫瓧鑺傦紝鐒跺悗鐩存帴灝嗚瀛楄妭鍐欏叆瀛樺偍璁懼鍗沖彲銆傝В鐮佷簩榪涘埗嫻佺殑榪囩▼涔熸槸綾諱技銆?/p>
褰撹綆楁満寮濮嬪彂灞曡搗鏉ョ殑鏃跺欙紝浜轟滑閫愭笎鍙戠幇錛孉SCII瀛楃闆嗛噷閭e彲鎬滅殑128涓瓧絎﹀凡緇忎笉鑳藉啀婊¤凍浠栦滑鐨勯渶姹備簡銆備漢浠氨鍦ㄦ兂錛屼竴涓瓧鑺傝兘澶熻〃紺虹殑鏁板瓧錛堢紪鍙鳳級鏈?56涓紝鑰孉SCII瀛楃鍙敤鍒頒簡0x00~0x7F錛屼篃灝辨槸鍗犵敤浜嗗墠128涓紝鍚庨潰128涓暟瀛椾笉鐢ㄧ櫧涓嶇敤錛屽洜姝ゅ緢澶氫漢鎵撹搗浜嗗悗闈㈣繖128涓暟瀛楃殑涓繪剰銆傚彲鏄棶棰樺湪浜庯紝寰堝浜哄悓鏃舵湁榪欐牱鐨勬兂娉曪紝浣嗘槸澶у瀵逛簬0x80-0xFF榪欏悗闈㈢殑128涓暟瀛楀垎鍒搴斾粈涔堟牱鐨勫瓧絎︼紝鍗存湁鍚勮嚜鐨勬兂娉曘傝繖灝卞鑷翠簡褰撴椂閿寰涓栫晫鍚勫湴鐨勬満鍣ㄤ笂鍑虹幇浜嗗ぇ閲忓悇寮忓悇鏍風殑OEM瀛楃闆嗐?/p>
涓嬮潰榪欏紶琛ㄦ槸IBM-PC鏈烘帹鍑虹殑鍏朵腑涓涓狾EM瀛楃闆嗭紝瀛楃闆嗙殑鍓?28涓瓧絎﹀拰ASCII瀛楃闆嗙殑鍩烘湰涓鑷達紙涓轟粈涔堣鍩烘湰涓鑷村憿錛屾槸鍥犱負鍓?2涓帶鍒跺瓧絎﹀湪鏌愪簺鎯呭喌涓嬩細琚獻BM-PC鏈哄綋浣滃彲鎵撳嵃瀛楃瑙i噴錛夛紝鍚庨潰128涓瓧絎︾┖闂村姞鍏ヤ簡涓浜涙媧插浗瀹剁敤鍒扮殑閲嶉煶瀛楃錛屼互鍙婁竴浜涚敤浜庣敾綰挎潯鐢葷殑瀛楃銆?/p>
浜嬪疄涓婏紝澶ч儴鍒哋EM瀛楃闆嗘槸鍏煎ASCII瀛楃闆嗙殑錛屼篃灝辨槸璇達紝澶у瀵逛簬0x00~0x7F榪欎釜鑼冨洿鐨勮В閲婂熀鏈槸鐩稿悓鐨勶紝鑰屽浜庡悗鍗婇儴鍒?x80~0xFF鐨勮В閲婂嵈涓嶄竴瀹氱浉鍚屻傜敋鑷蟲湁鏃跺欏悓鏍風殑瀛楃鍦ㄤ笉鍚孫EM瀛楃闆嗕腑瀵瑰簲鐨勫瓧鑺備篃鏄笉鍚岀殑銆?/p>
涓嶅悓鐨凮EM瀛楃闆嗗鑷翠漢浠棤娉曡法鏈哄櫒浜ゆ祦鍚勭鏂囨。銆備緥濡傝亴鍛樼敳鍙戜簡涓灝佺畝鍘唕ésumés緇欒亴鍛樹箼錛岀粨鏋滆亴鍛樹箼鐪嬪埌鐨勫嵈鏄痳 涓婇潰鎴戜滑鎻愬埌鐨勫瓧絎﹂泦閮芥槸鍩轟簬鍗曞瓧鑺傜紪鐮侊紝涔熷氨鏄錛屼竴涓瓧鑺傜炕璇戞垚涓涓瓧絎︺傝繖瀵逛簬鎷変竵璇郴鍥藉鏉ヨ鍙兘娌℃湁浠涔堥棶棰橈紝鍥犱負浠栦滑閫氳繃鎵╁睍絎?涓瘮鐗癸紝灝卞彲浠ュ緱鍒?56涓瓧絎︿簡錛岃凍澶熺敤浜嗐備絾鏄浜庝簹媧插浗瀹舵潵璇達紝256涓瓧絎︽槸榪滆繙涓嶅鐢ㄧ殑銆傚洜姝よ繖浜涘浗瀹剁殑浜轟負浜嗙敤涓婄數鑴戯紝鍙堣淇濇寔鍜孉SCII瀛楃闆嗙殑鍏煎錛屽氨鍙戞槑浜嗗瀛楄妭緙栫爜鏂瑰紡錛岀浉搴旂殑瀛楃闆嗗氨縐頒負澶氬瓧鑺傚瓧絎﹂泦銆備緥濡備腑鍥戒嬌鐢ㄧ殑灝辨槸鍙屽瓧鑺傚瓧絎﹂泦緙栫爜錛圖BCS錛孌ouble Byte Character Set錛夈?/p>
瀵逛簬鍗曞瓧鑺傚瓧絎﹂泦鏉ヨ錛屼唬鐮侀〉涓彧闇瑕佹湁涓寮犵爜琛ㄥ嵆鍙紝涓婇潰璁板綍鐫256涓暟瀛椾唬琛ㄧ殑瀛楃銆傜▼搴忓彧闇瑕佸仛綆鍗曠殑鏌ヨ〃鎿嶄綔灝卞彲浠ュ畬鎴愮紪瑙g爜鐨勮繃紼嬨?/p>
浠g爜欏墊槸瀛楃闆嗙紪鐮佺殑鍏蜂綋瀹炵幇錛屼綘鍙互鎶婁粬鐞嗚В涓轟竴寮?#8220;瀛楃-瀛楄妭”鏄犲皠琛紝閫氳繃鏌ヨ〃瀹炵幇“瀛楃-瀛楄妭”鐨勭炕璇戙備笅闈細鏈夋洿璇︾粏鐨勬弿榪般?/p> 鑰屽浜庡瀛楄妭瀛楃闆嗭紝浠g爜欏典腑閫氬父浼氭湁寰堝鐮佽〃銆傞偅涔堢▼搴忔庝箞鐭ラ亾璇ヤ嬌鐢ㄥ摢寮犵爜琛ㄥ幓瑙g爜浜岃繘鍒舵祦鍛紵絳旀鏄紝鏍規嵁絎竴涓瓧鑺傛潵閫夋嫨涓嶅悓鐨勭爜琛ㄨ繘琛岃В鏋?/span>銆?/p>
渚嬪鐩墠鏈甯哥敤鐨勪腑鏂囧瓧絎﹂泦GB2312錛屾兜鐩栦簡鎵鏈夌畝浣撳瓧絎︿互鍙婁竴閮ㄥ垎鍏朵粬瀛楃錛汫BK錛圞浠h〃鎵╁睍鐨勬剰鎬濓級鍒欏湪GB2312鐨勫熀紜涓婂姞鍏ヤ簡瀵圭箒浣撳瓧絎︾瓑鍏朵粬闈炵畝浣撳瓧絎︼紙GB18030瀛楃闆嗕笉鏄弻瀛楄妭瀛楃闆嗭紝鎴戜滑鍦ㄨUnicode鐨勬椂鍊欎細鎻愬埌錛夈傝繖涓や釜瀛楃闆嗙殑瀛楃閮芥槸浣跨敤1-2涓瓧鑺傛潵琛ㄧず銆俉indows緋葷粺閲囩敤936浠g爜欏墊潵瀹炵幇瀵笹BK瀛楃闆嗙殑緙栬В鐮併傚湪瑙f瀽瀛楄妭嫻佺殑鏃跺欙紝濡傛灉閬囧埌瀛楄妭鐨勬渶楂樹綅鏄?鐨勮瘽錛岄偅涔堝氨浣跨敤936浠g爜欏典腑鐨勭1寮犵爜琛ㄨ繘琛岃В鐮侊紝榪欏氨鍜屽崟瀛楄妭瀛楃闆嗙殑緙栬В鐮佹柟寮忎竴鑷翠簡銆?/p>
褰撳瓧鑺傜殑楂樹綅鏄?鐨勬椂鍊欙紝紜垏鐨勮錛屽綋絎竴涓瓧鑺備綅浜?x 錛堝叧浜?36浠g爜欏典腑瀹屾暣鐨勭爜琛ㄤ俊鎭紝鍙傝MSDN錛?a >http://msdn.microsoft.com/en-us/library/cc194913%28v=MSDN.10%29.aspx.錛?/p>
鎸夌収936浠g爜欏電殑鐮佽〃錛屽綋紼嬪簭閬囧埌榪炵畫瀛楄妭嫻?x81 0x40鐨勬椂鍊欙紝灝變細瑙g爜涓?#8220;涓?#8221;瀛楃銆? 涓嶅悓ASCII琛嶇敓瀛楃闆嗙殑鍑虹幇錛岃鏂囨。浜ゆ祦鍙樺緱闈炲父鍥伴毦錛屽洜姝ゅ悇縐嶇粍緇囬兘闄嗙畫榪涜浜嗘爣鍑嗗寲嫻佺▼銆備緥濡傜編鍥紸NSI緇勭粐鍒跺畾浜咥NSI鏍囧噯瀛楃緙栫爜錛堟敞鎰忥紝鎴戜滑鐜板湪閫氬父璇村埌ANSI緙栫爜錛岄氬父鎸囩殑鏄鉤鍙扮殑榛樿緙栫爜錛屼緥濡傝嫳鏂囨搷浣滅郴緇熶腑鏄疘SO-8859-1錛屼腑鏂囩郴緇熸槸GBK錛夛紝ISO緇勭粐鍒跺畾鐨勫悇縐岻SO鏍囧噯瀛楃緙栫爜錛岃繕鏈夊悇鍥戒篃浼氬埗瀹氫竴浜涘浗瀹舵爣鍑嗗瓧絎﹂泦錛屼緥濡備腑鍥界殑GBK錛孏B2312鍜孏B18030銆?/p>
鎿嶄綔緋葷粺鍦ㄥ彂甯冪殑鏃跺欙紝閫氬父浼氬線鏈哄櫒閲岄瑁呰繖浜涙爣鍑嗙殑瀛楃闆嗚繕鏈夊鉤鍙頒笓鐢ㄧ殑瀛楃闆嗭紝榪欐牱鍙浣犵殑鏂囨。鏄嬌鐢ㄦ爣鍑嗗瓧絎﹂泦緙栧啓鐨勶紝閫氱敤鎬у氨姣旇緝楂樹簡銆備緥濡備綘鐢℅B2312瀛楃闆嗙紪鍐欑殑鏂囨。錛屽湪涓浗澶ч檰鍐呯殑浠諱綍鏈哄櫒涓婇兘鑳芥紜樉紺恒傚悓鏃訛紝鎴戜滑涔熷彲浠ュ湪涓鍙版満鍣ㄤ笂闃呰澶氫釜鍥藉涓嶅悓璇█鐨勬枃妗d簡錛屽墠鎻愭槸鏈満蹇呴』瀹夎璇ユ枃妗d嬌鐢ㄧ殑瀛楃闆嗐?/p>
铏界劧閫氳繃浣跨敤涓嶅悓瀛楃闆嗭紝鎴戜滑鍙互鍦ㄤ竴鍙版満鍣ㄤ笂鏌ラ槄涓嶅悓璇█鐨勬枃妗o紝浣嗘槸鎴戜滑浠嶇劧鏃犳硶瑙e喅涓涓棶棰橈細鍦ㄤ竴浠芥枃妗d腑鏄劇ず鎵鏈夊瓧絎?/span>銆備負浜嗚В鍐寵繖涓棶棰橈紝鎴戜滑闇瑕佷竴涓叏浜虹被杈炬垚鍏辮瘑鐨勫法澶х殑瀛楃闆嗭紝榪欏氨鏄疷nicode瀛楃闆嗐?/p>
Unicode瀛楃闆嗘兜鐩栦簡鐩墠浜虹被浣跨敤鐨勬墍鏈夊瓧絎︼紝騫朵負姣忎釜瀛楃榪涜緇熶竴緙栧彿錛屽垎閰嶅敮涓鐨勫瓧絎︾爜錛圕ode Point錛夈俇nicode瀛楃闆嗗皢鎵鏈夊瓧絎︽寜鐓т嬌鐢ㄤ笂鐨勯綣佸害鍒掑垎涓?7涓眰闈紙Plane錛夛紝姣忎釜灞傞潰涓婃湁216=65536涓瓧絎︾爜絀洪棿銆?/p>
鍏朵腑絎?涓眰闈MP錛屽熀鏈兜鐩栦簡褰撲粖涓栫晫鐢ㄥ埌鐨勬墍鏈夊瓧絎︺傚叾浠栫殑灞傞潰瑕佷箞鏄敤鏉ヨ〃紺轟竴浜涜繙鍙ゆ椂鏈熺殑鏂囧瓧錛岃涔堟槸鐣欎綔鎵╁睍銆傛垜浠鉤甯哥敤鍒扮殑Unicode瀛楃錛屼竴鑸兘鏄綅浜嶣MP灞傞潰涓婄殑銆傜洰鍓峌nicode瀛楃闆嗕腑灝氭湁澶ч噺瀛楃絀洪棿鏈嬌鐢ㄣ? 鍦║nicode鍑虹幇涔嬪墠錛屾墍鏈夌殑瀛楃闆嗛兘鏄拰鍏蜂綋緙栫爜鏂規緇戝畾鍦ㄤ竴璧風殑錛岄兘鏄洿鎺ュ皢瀛楃鍜屾渶緇堝瓧鑺傛祦緇戝畾姝諱簡錛屼緥濡侫SCII緙栫爜緋葷粺瑙勫畾浣跨敤7姣旂壒鏉ョ紪鐮丄SCII瀛楃闆嗭紱GB2312浠ュ強GBK瀛楃闆嗭紝闄愬畾浜嗕嬌鐢ㄦ渶澶?涓瓧鑺傛潵緙栫爜鎵鏈夊瓧絎︼紝騫朵笖瑙勫畾浜嗗瓧鑺傚簭銆傝繖鏍風殑緙栫爜緋葷粺閫氬父鐢ㄧ畝鍗曠殑鏌ヨ〃錛屼篃灝辨槸閫氳繃浠g爜欏靛氨鍙互鐩存帴灝嗗瓧絎︽槧灝勪負瀛樺偍璁懼涓婄殑瀛楄妭嫻佷簡銆備緥濡備笅闈㈣繖涓緥瀛愶細 榪欑鏂瑰紡鐨勭己鐐瑰湪浜庯紝瀛楃鍜屽瓧鑺傛祦涔嬮棿鑰﹀悎寰楀お绱у瘑浜嗭紝浠庤岄檺瀹氫簡瀛楃闆嗙殑鎵╁睍鑳藉姏銆傚亣璁句互鍚庣伀鏄熶漢鍏ヤ綇鍦扮悆浜嗭紝瑕佸線鐜版湁瀛楃闆嗕腑鍔犲叆鐏槦鏂囧氨鍙樺緱寰堥毦鐢氳嚦涓嶅彲鑳戒簡錛岃屼笖寰堝鏄撶牬鍧忕幇鏈夌殑緙栫爜瑙勫垯銆?/p>
鍥犳Unicode鍦ㄨ璁′笂鑰冭檻鍒頒簡榪欎竴鐐癸紝灝嗗瓧絎﹂泦鍜屽瓧絎︾紪鐮佹柟妗堝垎紱誨紑銆?/p>
涔熷氨鏄錛?strong>铏界劧姣忎釜瀛楃鍦║nicode瀛楃闆嗕腑閮借兘鎵懼埌鍞竴紜畾鐨勭紪鍙鳳紙瀛楃鐮侊紝鍙堢ОUnicode鐮侊級錛屼絾鏄喅瀹氭渶緇堝瓧鑺傛祦鐨勫嵈鏄叿浣撶殑瀛楃緙栫爜銆備緥濡傚悓鏍鋒槸瀵筓nicode瀛楃“A”榪涜緙栫爜錛孶TF-8瀛楃緙栫爜寰楀埌鐨勫瓧鑺傛祦鏄?x41錛岃孶TF-16錛堝ぇ绔ā寮忥級寰楀埌鐨勬槸0x00 0x41銆?/p>
UCS-2/UTF-16 濡傛灉瑕佹垜浠潵瀹炵幇Unicode瀛楃闆嗕腑BMP瀛楃鐨勭紪鐮佹柟妗堬紝鎴戜滑浼氭庝箞瀹炵幇錛熺敱浜嶣MP灞傞潰涓婃湁216=65536涓瓧絎︾爜錛屽洜姝ゆ垜浠彧闇瑕佷袱涓瓧鑺傚氨鍙互瀹屽叏琛ㄧず榪欐墍鏈夌殑瀛楃浜嗐?/p>
涓句釜渚嬪瓙錛?#8220;涓?#8221;鐨刄nicode瀛楃鐮佹槸0x4E2D(01001110 00101101)錛岄偅涔堟垜浠彲浠ョ紪鐮佷負01001110 00101101錛堝ぇ绔級鎴栬?0101101 01001110 錛堝皬绔級銆?/p>
UCS-2鍜孶TF-16瀵逛簬BMP灞傞潰鐨勫瓧絎﹀潎鏄嬌鐢?涓瓧鑺傛潵琛ㄧず錛屽茍涓旂紪鐮佸緱鍒扮殑緇撴灉瀹屽叏涓鑷淬備笉鍚屼箣澶勫湪浜庯紝UCS-2鏈鍒濊璁$殑鏃跺欏彧鑰冭檻鍒癇MP瀛楃錛屽洜姝や嬌鐢ㄥ浐瀹?涓瓧鑺傞暱搴︼紝涔熷氨鏄錛屼粬鏃犳硶琛ㄧずUnicode鍏朵粬灞傞潰涓婄殑瀛楃錛岃孶TF-16涓轟簡瑙i櫎榪欎釜闄愬埗錛屾敮鎸乁nicode鍏ㄥ瓧絎﹂泦鐨勭紪瑙g爜錛岄噰鐢ㄤ簡鍙橀暱緙栫爜錛屾渶灝戜嬌鐢?涓瓧鑺傦紝濡傛灉瑕佺紪鐮丅MP浠ュ鐨勫瓧絎︼紝鍒欓渶瑕?涓瓧鑺傜粨瀵?/span>錛岃繖閲屽氨涓嶈璁洪偅涔堣繙錛屾湁鍏磋叮鍙互鍙傝冪淮鍩虹櫨縐戯細UTF-16/UCS-2銆?/p>
Windows浠嶯T鏃朵唬寮濮嬪氨閲囩敤浜哢TF-16緙栫爜錛屽緢澶氭祦琛岀殑緙栫▼騫沖彴錛屼緥濡?Net錛孞ava錛孮t榪樻湁Mac涓嬬殑Cocoa絳夐兘鏄嬌鐢║TF-16浣滀負鍩虹鐨勫瓧絎︾紪鐮併備緥濡備唬鐮佷腑鐨勫瓧絎︿覆錛屽湪鍐呭瓨涓浉搴旂殑瀛楄妭嫻佸氨鏄敤UTF-16緙栫爜榪囩殑銆?/p>
UTF-8 UTF-8搴旇鏄洰鍓嶅簲鐢ㄦ渶騫挎硾鐨勪竴縐峌nicode緙栫爜鏂規銆傜敱浜嶶CS-2/UTF-16瀵逛簬ASCII瀛楃浣跨敤涓や釜瀛楄妭榪涜緙栫爜錛屽瓨鍌ㄥ拰澶勭悊鏁堢巼鐩稿浣庝笅錛屽茍涓旂敱浜嶢SCII瀛楃緇忚繃UTF-16緙栫爜鍚庡緱鍒扮殑涓や釜瀛楄妭錛岄珮瀛楄妭濮嬬粓鏄?x00錛屽緢澶欳璇█鐨勫嚱鏁伴兘灝嗘瀛楄妭瑙嗕負瀛楃涓叉湯灝句粠鑰屽鑷存棤娉曟紜В鏋愭枃鏈傚洜姝や竴寮濮嬫帹鍑虹殑鏃跺欓伃鍒板緢澶氳タ鏂瑰浗瀹剁殑鎶佃Е錛屽ぇ澶у獎鍝嶄簡Unicode鐨勬帹琛屻傚悗鏉ヨ仾鏄庣殑浜轟滑鍙戞槑浜哢TF-8緙栫爜錛岃В鍐充簡榪欎釜闂銆?/p>
UTF-8緙栫爜鏂規閲囩敤1-4涓瓧鑺傛潵緙栫爜瀛楃錛屾柟娉曞叾瀹炰篃闈炲父綆鍗曘?/p>
錛堜笂鍥句腑鐨剎浠h〃Unicode鐮佺殑浣?浣嶏紝y浠h〃楂?浣嶏級 瀵逛簬ASCII瀛楃鐨勭紪鐮佷嬌鐢ㄥ崟瀛楄妭錛屽拰ASCII緙栫爜涓鎽鎬竴鏍鳳紝榪欐牱鎵鏈夊師鍏堜嬌鐢ˋSCII緙栬В鐮佺殑鏂囨。灝卞彲浠ョ洿鎺ヨ漿鍒癠TF-8緙栫爜浜嗐傚浜庡叾浠栧瓧絎︼紝鍒欎嬌鐢?-4涓瓧鑺傛潵琛ㄧず錛屽叾涓紝棣栧瓧鑺傚墠緗?鐨勬暟鐩唬琛ㄦ紜В鏋愭墍闇瑕佺殑瀛楄妭鏁幫紝鍓╀綑瀛楄妭鐨勯珮2浣嶅緇堟槸10銆備緥濡傞瀛楄妭鏄?110yyyy錛屽墠緗湁3涓?錛岃鏄庢紜В鏋愭誨叡闇瑕?涓瓧鑺傦紝闇瑕佸拰鍚庨潰2涓互10寮澶寸殑瀛楄妭緇撳悎鎵嶈兘姝g‘瑙f瀽寰楀埌瀛楃銆?/p>
鍏充簬UTF-8鐨勬洿澶氫俊鎭紝鍙傝冪淮鍩虹櫨縐戯細UTF-8銆?/p>
GB18030 浠諱綍鑳藉灝哢nicode瀛楃鏄犲皠涓哄瓧鑺傛祦鐨勭紪鐮侀兘灞炰簬Unicode緙栫爜銆備腑鍥界殑GB18030緙栫爜錛岃鐩栦簡Unicode鎵鏈夌殑瀛楃錛屽洜姝や篃綆楁槸涓縐峌nicode緙栫爜銆傚彧涓嶈繃浠栫殑緙栫爜鏂瑰紡騫朵笉鍍廢TF-8鎴栬匲TF-16涓鏍鳳紝灝哢nicode瀛楃鐨勭紪鍙烽氳繃涓瀹氱殑瑙勫垯榪涜杞崲錛岃屽彧鑳介氳繃鏌ヨ〃鐨勬墜孌佃繘琛岀紪鐮併?/p>
鍏充簬GB18030鐨勬洿澶氫俊鎭紝鍙傝冿細GB18030銆?/p>
Unicode鏄袱涓瓧鑺傚悧錛?/strong> Unicode鍙槸瀹氫箟浜嗕竴涓簽澶х殑銆佸叏鐞冮氱敤鐨勫瓧絎﹂泦錛屽茍涓烘瘡涓瓧絎﹁瀹氫簡鍞竴紜畾鐨勭紪鍙鳳紝鍏蜂綋瀛樺偍涓轟粈涔堟牱鐨勫瓧鑺傛祦錛屽彇鍐充簬瀛楃緙栫爜鏂規銆傛帹鑽愮殑Unicode緙栫爜鏄疷TF-16鍜孶TF-8銆?/p>
甯︾鍚嶇殑UTF-8鎸囩殑鏄粈涔堟剰鎬濓紵 甯︾鍚嶆寚鐨勬槸瀛楄妭嫻佷互BOM鏍囪寮濮嬨傚緢澶氳蔣浠朵細“鏅鴻兘”鐨勬帰嫻嬪綋鍓嶅瓧鑺傛祦浣跨敤鐨勫瓧絎︾紪鐮侊紝榪欑鎺㈡祴榪囩▼鍑轟簬鏁堢巼鑰冭檻錛岄氬父浼氭彁鍙栧瓧鑺傛祦鍓嶉潰鑻ュ共涓瓧鑺傦紝鐪嬬湅鏄惁絎﹀悎鏌愪簺甯歌瀛楃緙栫爜鐨勭紪鐮佽鍒欍傜敱浜嶶TF-8鍜孉SCII緙栫爜瀵逛簬綰嫳鏂囩殑緙栫爜鏄竴鏍風殑錛屾棤娉曞尯鍒嗗紑鏉ワ紝鍥犳閫氳繃鍦ㄥ瓧鑺傛祦鏈鍓嶉潰娣誨姞BOM鏍囪鍙互鍛婅瘔杞歡錛屽綋鍓嶄嬌鐢ㄧ殑鏄疷nicode緙栫爜錛屽垽鍒垚鍔熺巼灝卞崄鍒嗗噯紜簡銆備絾鏄渶瑕佹敞鎰忥紝涓嶆槸鎵鏈夎蔣浠舵垨鑰呯▼搴忛兘鑳芥紜鐞咮OM鏍囪錛屼緥濡侾HP灝變笉浼氭嫻婤OM鏍囪錛岀洿鎺ユ妸瀹冨綋鏅氬瓧鑺傛祦瑙f瀽浜嗐傚洜姝ゅ鏋滀綘鐨凱HP鏂囦歡鏄噰鐢ㄥ甫BOM鏍囪鐨刄TF-8榪涜緙栫爜鐨勶紝閭d箞鏈夊彲鑳戒細鍑虹幇闂銆?/p>
Unicode緙栫爜鍜屼互鍓嶇殑瀛楃闆嗙紪鐮佹湁浠涔堝尯鍒紵 鏃╂湡瀛楃緙栫爜銆佸瓧絎﹂泦鍜屼唬鐮侀〉絳夋蹇甸兘鏄〃杈懼悓涓涓剰鎬濄備緥濡侴B2312瀛楃闆嗐丟B2312緙栫爜錛?36浠g爜欏碉紝瀹為檯涓婅鐨勬槸鍚屼釜涓滆タ銆備絾鏄浜嶶nicode鍒欎笉鍚岋紝Unicode瀛楃闆嗗彧鏄畾涔変簡瀛楃鐨勯泦鍚堝拰鍞竴緙栧彿錛孶nicode緙栫爜錛屽垯鏄UTF-8銆乁CS-2/UTF-16絳夊叿浣撶紪鐮佹柟妗堢殑緇熺О鑰屽凡錛屽茍涓嶆槸鍏蜂綋鐨勭紪鐮佹柟妗堛傛墍浠ュ綋闇瑕佺敤鍒板瓧絎︾紪鐮佺殑鏃跺欙紝浣犲彲浠ュ啓gb2312錛宑odepage936錛寀tf-8錛寀tf-16錛屼絾璇蜂笉瑕佸啓unicode錛堢湅榪囧埆浜哄湪緗戦〉鐨刴eta鏍囩閲屽ご鍐檆harset=unicode錛屾湁鎰熻屽彂錛夈?/p>
涔辯爜鎸囩殑鏄▼搴忔樉紺哄嚭鏉ョ殑瀛楃鏂囨湰鏃犳硶鐢ㄤ換浣曡璦鍘昏В璇匯備竴鑸儏鍐典笅浼氬寘鍚ぇ閲?鎴栬咃拷銆備貢鐮侀棶棰樻槸鎵鏈夎綆楁満鐢ㄦ埛鎴栧鎴栧皯浼氶亣鍒扮殑闂銆?span style="color: #008000">閫犳垚涔辯爜鐨勫師鍥犲氨鏄洜涓轟嬌鐢ㄤ簡閿欒鐨勫瓧絎︾紪鐮佸幓瑙g爜瀛楄妭嫻?/strong> 渚嬪鏈甯歌鐨勭綉欏典貢鐮侀棶棰樸傚鏋滀綘鏄綉绔欐妧鏈漢鍛橈紝閬囧埌榪欐牱鐨勯棶棰橈紝闇瑕?span style="color: #000000">媯鏌ヤ互涓嬪師鍥狅細 娉ㄦ剰錛岀綉欏佃В鏋愮殑榪囩▼濡傛灉浣跨敤鐨勫瓧絎︾紪鐮佷笉姝g‘錛岃繕鍙兘浼氬鑷磋剼鏈垨鑰呮牱寮忚〃鍑洪敊銆傚叿浣撶粏鑺傚彲浠ュ弬鑰冩垜浠ュ墠鍐欒繃鐨勬枃绔狅細鏂囨。瀛楃闆嗗鑷寸殑鑴氭湰閿欒鍜?a >Asp.Net欏甸潰鐨勭紪鐮侀棶棰?/font>銆?/p>
涓嶄箙鍓嶇湅鍒版煇鎶鏈鍧涙湁浜哄弽棣堬紝WinForm紼嬪簭浣跨敤Clipboard綾葷殑GetData鏂規硶鍘昏闂壀鍒囨澘涓殑HTML鍐呭鏃朵細鍑虹幇涔辯爜鐨勯棶棰橈紝鎴戜及璁′篃鏄敱浜嶹inForm鍦ㄨ幏鍙朒TML鏂囨湰鐨勬椂鍊欐病鏈夌敤瀵規紜殑瀛楃緙栫爜瀵艱嚧鐨勩俉indows鍓創鏉垮彧鏀寔UTF-8緙栫爜錛屼篃灝辨槸璇翠綘浼犲叆鐨勬枃鏈兘浼氳UTF-8緙栬В鐮併傝繖鏍蜂竴鏉ワ紝鍙涓や釜紼嬪簭閮芥槸璋冪敤Windows鍓垏鏉緼PI緙栫▼鐨勮瘽錛岄偅涔堝鍒剁矘璐寸殑榪囩▼涓笉浼氬嚭鐜頒貢鐮併傞櫎闈炰竴鏂瑰湪鑾峰彇鍒板壀璐存澘鏁版嵁涔嬪悗浣跨敤浜嗛敊璇殑瀛楃緙栫爜榪涜瑙g爜錛屾墠浼氬緱鍒頒貢鐮侊紙鎴戝仛浜嗙畝鍗曠殑WinForm鍓垏鏉跨紪紼嬪疄楠岋紝鍙戠幇GetData浣跨敤鐨勬槸緋葷粺榛樿緙栫爜錛岃屼笉鏄疷TF-8緙栫爜錛夈?/p>
鍏充簬涔辯爜涓嚭鐜?鎴栬咃拷錛岃繖閲岄渶瑕侀澶栨彁涓涓嬶紝褰撶▼搴忎嬌鐢ㄧ壒瀹氬瓧絎︾紪鐮佽В鏋愬瓧鑺傛祦鐨勬椂鍊欙紝涓鏃﹂亣鍒版棤娉曡В鏋愮殑瀛楄妭嫻佹椂錛屽氨浼氱敤?鎴栬咃拷鏉ユ浛浠c傚洜姝わ紝涓鏃︿綘鏈緇堣В鏋愬緱鍒扮殑鏂囨湰鍖呭惈榪欐牱鐨勫瓧絎︼紝鑰屼綘鍙堟棤娉曞緱鍒板師濮嬪瓧鑺傛祦鐨勬椂鍊欙紝璇存槑姝g‘鐨勪俊鎭凡緇忓交搴曚涪澶變簡錛屽皾璇曚換浣曞瓧絎︾紪鐮侀兘鏃犳硶浠庤繖鏍風殑瀛楃鏂囨湰涓繕鍘熷嚭姝g‘鐨勪俊鎭潵銆?/p>
瀛楃闆嗭紙Character Set錛?/strong>錛屽瓧闈笂鐨勭悊瑙e氨鏄瓧絎︾殑闆嗗悎錛屼緥濡侫SCII瀛楃闆嗭紝瀹氫箟浜?28涓瓧絎︼紱GB2312瀹氫箟浜?445涓瓧絎︺傝?strong>璁$畻鏈虹郴緇熶腑鎻愬埌鐨勫瓧絎﹂泦鍑嗙‘鏉ヨ錛屾寚鐨勬槸宸茬紪鍙風殑瀛楃鐨勬湁搴忛泦鍚堬紙涓嶄竴瀹氭槸榪炵畫錛?/span>銆?/p>
瀛楃鐮侊紙Code Point錛?/strong>鎸囩殑灝辨槸瀛楃闆嗕腑姣忎釜瀛楃鐨勬暟瀛楃紪鍙楓備緥濡侫SCII瀛楃闆嗙敤0-127榪欒繛緇殑128涓暟瀛楀垎鍒〃紺?28涓瓧絎︼紱GBK瀛楃闆嗕嬌鐢ㄥ尯浣嶇爜鐨勬柟寮忎負姣忎釜瀛楃緙栧彿錛岄鍏堝畾涔変竴涓?4X94鐨勭煩闃碉紝琛岀О涓?#8220;鍖?#8221;錛屽垪縐頒負“浣?#8221;錛岀劧鍚庡皢鎵鏈夊浗鏍囨眽瀛楁斁鍏ョ煩闃靛綋涓紝榪欐牱姣忎釜姹夊瓧灝卞彲浠ョ敤鍞竴鐨?#8220;鍖轟綅”鐮佹潵鏍囪瘑浜嗐備緥濡?#8220;涓?#8221;瀛楄鏀懼埌54鍖虹48浣嶏紝鍥犳瀛楃鐮佸氨鏄?448銆傝孶nicode涓皢瀛楃闆嗘寜鐓т竴瀹氱殑綾誨埆鍒掑垎鍒?~16榪?7涓眰闈紙Planes錛変腑錛屾瘡涓眰闈腑鎷ユ湁216=65536涓瓧絎︾爜錛屽洜姝nicode鎬誨叡鎷ユ湁鐨勫瓧絎︾爜錛屼篃鍗蟲槸Unicode鐨勫瓧絎︾┖闂存誨叡鏈?7*65536=1114112銆?/p>
緙栫爜鐨勮繃紼嬫槸灝嗗瓧絎﹁漿鎹㈡垚瀛楄妭嫻併?/p>
瑙g爜鐨勮繃紼嬫槸灝嗗瓧鑺傛祦瑙f瀽涓哄瓧絎︺?/p>
瀛楃緙栫爜錛圕haracter Encoding錛?/strong>鏄皢瀛楃闆嗕腑鐨勫瓧絎︾爜鏄犲皠涓哄瓧鑺傛祦鐨勪竴縐嶅叿浣撳疄鐜版柟妗堛備緥濡侫SCII瀛楃緙栫爜瑙勫畾浣跨敤鍗曞瓧鑺備腑浣庝綅鐨?涓瘮鐗瑰幓緙栫爜鎵鏈夌殑瀛楃銆備緥濡?#8216;A’鐨勭紪鍙鋒槸65錛岀敤鍗曞瓧鑺傝〃紺哄氨鏄?x41錛屽洜姝ゅ啓鍏ュ瓨鍌ㄨ澶囩殑鏃跺欏氨鏄痓’01000001’銆侴BK緙栫爜鍒欐槸灝嗗尯浣嶇爜錛圙BK鐨勫瓧絎︾爜錛変腑鐨勫尯鐮佸拰浣嶇爜鐨勫垎鍒姞涓?xA0錛?60錛夌殑鍋忕Щ錛堜箣鎵浠ヨ鍔犱笂榪欐牱鐨勫亸縐伙紝涓昏鏄負浜嗗拰ASCII鐮佸吋瀹癸級錛屼緥濡傚垰鍒氭彁鍒扮殑“涓?#8221;瀛楋紝鍖轟綅鐮佹槸5448錛屽崄鍏繘鍒舵槸0x3630錛屽尯鐮佸拰浣嶇爜鍒嗗埆鍔犱笂0xA0鐨勫亸縐諱箣鍚庡氨寰楀埌0xD6D0錛岃繖灝辨槸“涓?#8221;瀛楃殑GBK緙栫爜緇撴灉銆?/p>
浠g爜欏碉紙Code Page錛?/strong>涓縐嶅瓧絎︾紪鐮佸叿浣撳艦寮忋傛棭鏈熷瓧絎︾浉瀵瑰皯錛屽洜姝ら氬父浼氫嬌鐢ㄧ被浼艱〃鏍肩殑褰㈠紡灝嗗瓧絎︾洿鎺ユ槧灝勪負瀛楄妭嫻侊紝鐒跺悗閫氳繃鏌ヨ〃鐨勬柟寮忔潵瀹炵幇瀛楃鐨勭紪瑙g爜銆傜幇浠f搷浣滅郴緇熸部鐢ㄤ簡榪欑鏂瑰紡銆備緥濡俉indows浣跨敤936浠g爜欏點丮ac緋葷粺浣跨敤EUC-CN浠g爜欏靛疄鐜癎BK瀛楃闆嗙殑緙栫爜錛屽悕瀛楄櫧鐒朵笉涓鏍鳳紝浣嗗浜庡悓涓姹夊瓧鐨勭紪鐮佽偗瀹氭槸涓鏍風殑銆?/p>
澶у皬绔?/strong>鐨勮娉曟簮鑷婃牸鍒椾經娓歌銆嬨傛垜浠煡閬擄紝楦¤泲閫氬父涓绔ぇ涓绔皬錛屽皬浜哄浗鐨勪漢浠浜庡墺铔嬪3鏃跺簲浠庡摢涓绔紑濮嬪墺璧鋒湁鐫涓嶄竴鏍風殑鐪嬫硶銆傚悓鏍鳳紝璁$畻鏈虹晫瀵逛簬浼犺緭澶氬瓧鑺傚瓧錛堢敱澶氫釜瀛楄妭鏉ュ叡鍚岃〃紺轟竴涓暟鎹被鍨嬶級鏃訛紝鏄厛浼犻珮浣嶅瓧鑺傦紙澶х錛夎繕鏄厛浼犱綆浣嶅瓧鑺傦紙灝忕錛変篃鏈夌潃涓嶄竴鏍風殑鐪嬫硶錛岃繖灝辨槸璁$畻鏈洪噷澶村ぇ灝忕妯″紡鐨勭敱鏉ヤ簡銆傛棤璁烘槸鍐欐枃浠惰繕鏄綉緇滀紶杈擄紝瀹為檯涓婇兘鏄線嫻佽澶囪繘琛屽啓鎿嶄綔鐨勮繃紼嬶紝鑰屼笖榪欎釜鍐欐搷浣滄槸浠庢祦鐨勪綆鍦板潃鍚戦珮鍦板潃寮濮嬪啓錛堣繖寰堢鍚堜漢鐨勪範鎯級錛屽浜庡瀛楄妭瀛楁潵璇達紝濡傛灉鍏堝啓鍏ラ珮浣嶅瓧鑺傦紝鍒欑О浣滃ぇ绔ā寮忋傚弽涔嬪垯縐頒綔灝忕妯″紡銆備篃灝辨槸璇達紝澶х妯″紡涓嬶紝瀛楄妭搴忓拰嫻佽澶囩殑鍦板潃欏哄簭鏄浉鍙嶇殑錛岃屽皬绔ā寮忓垯鏄浉鍚岀殑銆備竴鑸綉緇滃崗璁兘閲囩敤澶х妯″紡榪涜浼犺緭銆?/p>
鍙傝冮摼鎺ワ細 鍏跺疄def鐨勫姛鑳界浉褰撲簬extern “C” __declspec(dllexport)錛屾墍浠ュ畠涔熶粎鑳藉鐞?/span>C鍑芥暟錛岃屼笉鑳藉鐞嗛噸杞藉嚱鏁般傝?/span>__declspec(dllexport)鍜?/span>__declspec(dllimport)閰嶅悎浣跨敤鑳藉閫傚簲浠諱綍鎯呭喌錛屽洜姝?/span>__declspec(dllexport)鏄洿涓哄厛榪涚殑鏂規硶銆傛墍浠ワ紝鐩墠鏅亶鐨勭湅娉曟槸涓嶄嬌鐢?/span>def鏂囦歡錛屾垜涔熷悓鎰忚繖涓湅娉曘?br /> 鎬諱綋鏉ヨ鏈変袱縐嶆柟娉曪紝 2)鍚嶅瓧淇グ綰﹀畾 榪欑澹版槑鏂瑰紡鐨勮瘽錛屽鍏ヤ細鍑洪敊錛屽洜涓烘壘涓嶅埌build榪欎釜鍑芥暟錛岃繖閲岀殑build宸茬粡鏀規垚鍚嶅瓧鏄痏build@4銆傚綋鐒訛紝濡傛灉鎴戜滑鐩存帴鍐?#8220;external 'test.dll' name '_build@4';”搴旇鏄病鏈夐棶棰樼殑銆備笉榪囦笉鐖姐備負浠涔坵in api鐨勫嚱鏁板氨娌℃湁榪欎簺涔變竷鍏碂鐨勪笢瑗匡紵 鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/gobitan/archive/2007/03/18/1532769.aspx// convert_from_char.cpp
// compile with: /clr /link comsuppw.lib
#include <iostream>
#include <stdlib.h>
#include <string>
#include "atlbase.h"
#include "atlstr.h"
#include "comutil.h"
using namespace std;
using namespace System;
int main()
{
// Create and display a C style string, and then use it
// to create different kinds of strings.
char *orig = "Hello, World!";
cout << orig << " (char *)" << endl;
// newsize describes the length of the
// wchar_t string called wcstring in terms of the number
// of wide characters, not the number of bytes.
size_t newsize = strlen(orig) + 1;
// The following creates a buffer large enough to contain
// the exact number of characters in the original string
// in the new format. If you want to add more characters
// to the end of the string, increase the value of newsize
// to increase the size of the buffer.
wchar_t * wcstring = new wchar_t[newsize];
// Convert char* string to a wchar_t* string.
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE);
// Display the result and indicate the type of string that it is.
wcout << wcstring << _T(" (wchar_t *)") << endl;
// Convert the C style string to a _bstr_t string.
_bstr_t bstrt(orig);
// Append the type of string to the new string
// and then display the result.
bstrt += " (_bstr_t)";
cout << bstrt << endl;
// Convert the C style string to a CComBSTR string.
CComBSTR ccombstr(orig);
if (ccombstr.Append(_T(" (CComBSTR)")) == S_OK)
{
CW2A printstr(ccombstr);
cout << printstr << endl;
}
// Convert the C style string to a CstringA and display it.
CStringA cstringa(orig);
cstringa += " (CStringA)";
cout << cstringa << endl;
// Convert the C style string to a CStringW and display it.
CStringW cstring(orig);
cstring += " (CStringW)";
// To display a CStringW correctly, use wcout and cast cstring
// to (LPCTSTR).
wcout << (LPCTSTR)cstring << endl;
// Convert the C style string to a basic_string and display it.
string basicstring(orig);
basicstring += " (basic_string)";
cout << basicstring << endl;
// Convert the C style string to a System::String and display it.
String ^systemstring = gcnew String(orig);
systemstring += " (System::String)";
Console::WriteLine("{0}", systemstring);
delete systemstring;
}
Output
]]>榪樻槸寰椾粠ASCII鐮佽璧?/h2>

OEM瀛楃闆嗙殑琛嶇敓
sum
s錛屽洜涓?#233;瀛楃鍦ㄨ亴鍛樼敳鏈哄櫒涓婄殑OEM瀛楃闆嗕腑瀵瑰簲鐨勫瓧鑺傛槸0x82錛岃屽湪鑱屽憳涔欑殑鏈哄櫒涓婏紝鐢變簬浣跨敤鐨凮EM瀛楃闆嗕笉鍚岋紝瀵?x82瀛楄妭瑙g爜鍚庡緱鍒扮殑瀛楃鍗存槸
銆?/p>
澶氬瓧鑺傚瓧絎﹂泦錛圡BCS錛夊拰涓枃瀛楃闆?/h2>
81–0xFE涔嬮棿鏃訛紝鏍規嵁絎竴涓瓧鑺備笉鍚屾壘鍒頒唬鐮侀〉涓殑鐩稿簲鐨勭爜琛紝渚嬪褰撶涓涓瓧鑺傛槸0x81錛岄偅涔堝搴?36涓殑涓嬮潰榪欏紶鐮佽〃錛?/code>
ANSI鏍囧噯銆佸浗瀹舵爣鍑嗐両SO鏍囧噯
Unicode鐨勫嚭鐜?/h2>
Unicode瀛楃闆嗘榪?/h3>

緙栫爜緋葷粺鐨勫彉鍖?/h3>


甯歌鐨刄nicode緙栫爜

Unicode鐩稿叧鐨勫父瑙侀棶棰?/h3>
涔辯爜闂
蹇呰鐨勬湳璇В閲?/h2>
]]>Def鍜?/span>__declspec(dllexport)
濡備綍鍦╠ll涓畾涔夎緭鍑哄嚱鏁?/h1>
涓縐嶆槸娣誨姞涓涓猟ef瀹氫箟鏂囦歡錛屽湪姝ゆ枃浠朵腑瀹氫箟dll涓杈撳嚭鐨勫嚱鏁幫紱
絎簩縐嶆槸鍦ㄦ簮浠g爜涓緟杈撳嚭鐨勫嚱鏁板墠鍔犱笂__declspec(dllexport)鍏抽敭瀛椼?/font>
1銆佷慨楗板悕(Decoration name)
“C”鎴栬?#8220;C++”鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇戝嚱鏁板畾涔夋垨鑰呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?#8220;C++”閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤“C””鎴?#8220;C++”鍑芥暟絳夈?
淇グ鍚嶇敱鍑芥暟鍚嶃佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓鍐沖畾銆?
2銆佸悕瀛椾慨楗扮害瀹氶殢璋冪敤綰﹀畾鍜岀紪璇戠綾?C鎴朇++)鐨勪笉鍚岃屽彉鍖栥傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾誨拰璋冪敤綰﹀畾鐨勪笉鍚岃屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?
a銆丆緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負_functionname@number銆?
__cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負_functionname銆?
__fastcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?#8220;@”絎﹀彿錛屽悗闈篃鏄竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負@functionname@number銆?
瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓錛岃繖鍜孭ASCAL璋冪敤綰﹀畾涓嶅悓錛孭ASCAL綰﹀畾杈撳嚭鐨勫嚱鏁板悕鏃犱換浣曚慨楗頒笖鍏ㄩ儴澶у啓銆?
b銆丆++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾錛?
1銆佷互“?”鏍囪瘑鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱
2銆佸嚱鏁板悕鍚庨潰浠?#8220;@@YG”鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱
3銆佸弬鏁拌〃浠ヤ唬鍙瘋〃紺猴細
X--void 錛?
D--char錛?
E--unsigned char錛?
F--short錛?
H--int錛?
I--unsigned int錛?
J--long錛?
K--unsigned long錛?
M--float錛?
N--double錛?
_N--bool錛?
....
PA--琛ㄧず鎸囬拡錛屽悗闈㈢殑浠e彿琛ㄦ槑鎸囬拡綾誨瀷錛屽鏋滅浉鍚岀被鍨嬬殑鎸囬拡榪炵畫鍑虹幇錛屼互“0”浠f浛錛屼竴涓?#8220;0”浠h〃涓嬈¢噸澶嶏紱
4銆佸弬鏁拌〃鐨勭涓欏逛負璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠錛?
5銆佸弬鏁拌〃鍚庝互“@Z”鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?#8220;Z”鏍囪瘑緇撴潫銆?
鍏舵牸寮忎負“?functionname@@YG*****@Z”鎴?#8220;?functionname@@YG*XZ”錛屼緥濡?
int Test1錛坈har *var1,unsigned long錛?----“?Test1@@YGHPADK@Z”
void Test2錛堬級 -----“?Test2@@YGXXZ”
__cdecl璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YA”銆?
__fastcall璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YI”銆?
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?"__cedcl ",灝嗗彧鑳借C/C++璋冪敤.
澶у閮藉簲璇ョ煡閬擄紝鍑芥暟璋冪敤閮芥湁淇グ絎︼紝鏈塤_cdecl,__stdcall,__fastcall絳夌瓑錛屼笉鍚屼慨楗扮鎰忓懗鐫涓嶅悓鐨勫弬鏁板嚭鏍堟柟寮忎互鍙婁笉鍚岀殑鍑芥暟鍚嶇О鍙樺寲銆?
瀵逛簬C璇█錛岄粯璁ゆ槸__cdecl錛屼絾濡傛灉鎴戜滑瑕佸仛DLL闇瑕佸叾瀹冭璦渚嬪Delphi銆乂B絳夎皟鐢紝閫氬父閮藉緩璁0鏄庝負__stdcall銆倃in32鐨刟pi鍩烘湰閮芥槸__stdcall鏂瑰紡錛堝氨鏄偅涓猈INAPI瀹忥級銆?
闂灝卞嚭鍦ㄨ繖涓猻tdcall浜嗐傚浜嶸C鏉ヨ錛宊_cdecl淇グ鐨勫嚱鏁幫紝鍦―LL鐨勫鍑哄悕瀛椾竴鑸槸娌℃湁鍙樺寲鐨勶紝浣嗗浜巁_stdcall灝變細鍋氫竴浜涙敼鍙橈紝鍦ㄥ墠闈㈠姞涓涓笅鍒掔嚎錛屽悗闈㈠啀琛ヤ笂涓涓?#8220;@”錛屽啀鍔犱笂鍙傛暟鐨勫瓧鑺傞暱搴︽誨拰銆?
渚嬪錛屽浜庡嚱鏁?int add(int a, int b)錛屽鏋渋nt __cdecl add(int a, int b)錛屽湪DLL鐨勫鍑哄悕瀛楄繕鏄?#8220;add”錛屼絾濡傛灉鏄痠nt __stdcall add(int a, int b)錛屽湪DLL鐨勫鍑哄悕瀛楀氨鏄?#8220;_add@8”錛堟煡鐪嬪鍑哄悕瀛楀彲浠ョ敤VC鑷甫鐨刣umpbin鍛戒護錛屾柟娉曟槸“dumpbin /exports aaa.dll”錛夈?
濂戒簡錛岃浜嗕竴澶у爢搴熻瘽錛屽紑濮嬭繘涓婚鍟︺?
寮濮嬬殑鏃跺欙紝鎴戝仛浜嗕竴涓猼est.dll錛屼緥濡傚寘鍚竴涓鍑虹殑鍑芥暟 int __stdcall build(int n)銆?
鍦╠elphi鐨勬椂鍊欙紝濡傛灉鐢?
鍚庢潵鍦ㄧ綉涓婃壘浜嗕竴閬嶏紝鍐欎簡涓涓猟ef鏂囦歡銆?
榪欐牱鐢熸垚鐨刣ll鐨勫鍑哄悕瀛楀氨娌℃湁閭d簺涔變竷鍏碂鐨勪慨楗扮浜嗐備笉榪囪繖涓椂鍊欏張杞埌C榪欒竟鏈夐棶棰樹簡銆傚師鍥犳槸C榪欒竟鍦ㄩ摼鎺ョ殑鏃跺欐壘涓嶅埌_build@4榪欎釜鍑芥暟銆傜湡鏄檿鍊掞紝涓よ竟涓嶈濂姐?
鎴戝氨瑙夊緱濂囨紝鎬庝箞win api鐨勫嚱鏁幫紝鍗蟲病鏈夐偅浜涗慨楗扮錛屼絾鍙堝彲浠ヨdelphi銆丆銆乂B絳夋紜皟鐢ㄥ憿錛熷鎬晩銆?br />
浠婂ぉ鍐欑嚎紼嬪嚱鏁版椂錛屽彂鐜癿sdn涓ThreadProc鐨勫畾涔夋湁瑕佹眰錛欴WORD WINAPI ThreadProc(LPVOID lpParameter);
涓嶈В涓轟粈涔堣鐢╓INAPI瀹忓畾涔夛紝鏌ヤ簡鍚庡彂鐜頒笅闈㈢殑瀹氫箟銆備簬鏄箮闇瑕佸尯鍒玙_stdcall鍜宊_cdecl涓よ呯殑鍖哄埆錛?#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#define cdecl _cdecl
#ifndef CDECL
#define CDECL _cdecl
#endif
鍑犱箮鎴戜滑鍐欑殑姣忎竴涓猈INDOWS API鍑芥暟閮芥槸__stdcall綾誨瀷鐨勶紝棣栧厛錛岄渶瑕佷簡瑙d袱鑰呬箣闂寸殑鍖哄埆錛?WINDOWS鐨勫嚱鏁拌皟鐢ㄦ椂闇瑕佺敤鍒版爤錛圫TACK錛屼竴縐嶅厛鍏ュ悗鍑虹殑瀛樺偍緇撴瀯錛夈傚綋鍑芥暟璋冪敤瀹屾垚鍚庯紝鏍堥渶瑕佹竻妤氾紝榪欓噷灝辨槸闂鐨勫叧閿紝濡備綍娓呴櫎錛燂紵濡傛灉鎴戜滑鐨勫嚱鏁頒嬌鐢ㄤ簡_cdecl錛岄偅涔堟爤鐨勬竻闄ゅ伐浣滄槸鐢辮皟鐢ㄨ咃紝鐢–OM鐨勬湳璇潵璁插氨鏄鎴鋒潵瀹屾垚鐨勩傝繖鏍峰甫鏉ヤ簡涓涓鎵嬬殑闂錛屼笉鍚岀殑緙栬瘧鍣ㄤ駭鐢熸爤鐨勬柟寮忎笉灝界浉鍚岋紝閭d箞璋冪敤鑰呰兘鍚︽甯哥殑瀹屾垚娓呴櫎宸ヤ綔鍛紵絳旀鏄笉鑳姐傚鏋滀嬌鐢╛_stdcall錛屼笂闈㈢殑闂灝辮В鍐充簡錛屽嚱鏁拌嚜宸辮В鍐蟲竻闄ゅ伐浣溿傛墍浠ワ紝鍦ㄨ法錛堝紑鍙戯級騫沖彴鐨勮皟鐢ㄤ腑錛屾垜浠兘浣跨敤__stdcall錛堣櫧鐒舵湁鏃舵槸浠?WINAPI鐨勬牱瀛愬嚭鐜幫級銆傞偅涔堜負浠涔堣繕闇瑕乢cdecl鍛紵褰撴垜浠亣鍒拌繖鏍風殑鍑芥暟濡俧printf()瀹冪殑鍙傛暟鏄彲鍙樼殑錛屼笉瀹氶暱鐨勶紝琚皟鐢ㄨ呬簨鍏堟棤娉曠煡閬撳弬鏁扮殑闀垮害錛屼簨鍚庣殑娓呴櫎宸ヤ綔涔熸棤娉曟甯哥殑榪涜錛屽洜姝わ紝榪欑鎯呭喌鎴戜滑鍙兘浣跨敤_cdecl銆傚埌榪欓噷鎴戜滑鏈変竴涓粨璁猴紝濡傛灉浣犵殑紼嬪簭涓病鏈夋秹鍙婂彲鍙樺弬鏁幫紝鏈濂戒嬌鐢╛_stdcall鍏抽敭瀛椼?
2.
__cdecl,__stdcall鏄0鏄庣殑鍑芥暟璋冪敤鍗忚.涓昏鏄紶鍙傚拰寮規爤鏂歸潰鐨勪笉鍚?涓鑸琧++鐢ㄧ殑鏄痏_cdecl,windows閲屽ぇ閮界敤鐨勬槸__stdcall(API)
__cdecl 鏄疌/C++鍜孧FC紼嬪簭榛樿浣跨敤鐨勮皟鐢ㄧ害瀹氾紝涔熷彲浠ュ湪鍑芥暟澹版槑鏃跺姞涓奯_cdecl鍏抽敭瀛楁潵鎵嬪伐鎸囧畾銆傞噰鐢╛_cdecl綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝騫朵笖鐢辮皟鐢ㄥ嚱鏁拌呮妸鍙傛暟寮瑰嚭鏍堜互娓呯悊鍫嗘爤銆傚洜姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾銆傜敱浜庢瘡涓涓嬌鐢╛_cdecl綰﹀畾鐨勫嚱鏁伴兘瑕佸寘鍚竻鐞嗗爢鏍堢殑浠g爜錛屾墍浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇緝澶с俖_cdecl鍙互鍐欐垚_cdecl銆?
__stdcall璋冪敤綰﹀畾鐢ㄤ簬璋冪敤Win32 API鍑芥暟銆傞噰鐢╛_stdcall綰﹀畾鏃訛紝鍑芥暟鍙傛暟鎸夌収浠庡彸鍒板乏鐨勯『搴忓叆鏍堬紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鏍堬紝鍑芥暟鍙傛暟涓暟鍥哄畾銆傜敱浜庡嚱鏁頒綋鏈韓鐭ラ亾浼犺繘鏉ョ殑鍙傛暟涓暟錛屽洜姝よ璋冪敤鐨勫嚱鏁板彲浠ュ湪榪斿洖鍓嶇敤涓鏉et n鎸囦護鐩存帴娓呯悊浼犻掑弬鏁扮殑鍫嗘爤銆俖_stdcall鍙互鍐欐垚_stdcall銆?
__fastcall 綰﹀畾鐢ㄤ簬瀵規ц兘瑕佹眰闈炲父楂樼殑鍦哄悎銆俖_fastcall綰﹀畾灝嗗嚱鏁扮殑浠庡乏杈瑰紑濮嬬殑涓や釜澶у皬涓嶅ぇ浜?涓瓧鑺傦紙DWORD錛夌殑鍙傛暟鍒嗗埆鏀懼湪ECX鍜孍DX瀵勫瓨鍣紝鍏朵綑鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍫嗘爤銆俖_fastcall鍙互鍐欐垚_fastcall
3.
__stdcall:
_stdcall 璋冪敤綰﹀畾鐩稿綋浜?6浣嶅姩鎬佸簱涓粡甯鎬嬌鐢ㄧ殑PASCAL璋冪敤綰﹀畾銆?
鍦?2浣嶇殑VC++5.0涓璓ASCAL璋冪敤綰﹀畾涓嶅啀琚敮鎸侊紙瀹為檯涓婂畠宸茶瀹氫箟涓?__stdcall銆傞櫎浜哶_pascal澶栵紝__fortran鍜宊_syscall涔熶笉琚敮鎸侊級錛屽彇鑰屼唬涔嬬殑鏄痏_stdcall璋冪敤綰﹀畾銆備袱鑰呭疄璐ㄤ笂鏄竴鑷寸殑錛屽嵆鍑芥暟鐨勫弬鏁拌嚜鍙沖悜宸﹂氳繃鏍堜紶閫掞紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬紝浣嗕笉鍚岀殑鏄嚱鏁板悕鐨勪慨楗伴儴鍒嗭紙鍏充簬鍑芥暟鍚嶇殑淇グ閮ㄥ垎鍦ㄥ悗闈㈠皢璇︾粏璇存槑錛夈?
_stdcall鏄疨ascal紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忥紝閫氬父鐢ㄤ簬Win32 Api涓紝鍑芥暟閲囩敤浠庡彸鍒板乏鐨勫帇鏍堟柟寮忥紝鑷繁鍦ㄩ鍑烘椂娓呯┖鍫嗘爤銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?
_cdecl:
_cdecl c璋冪敤綰﹀畾, 鎸変粠鍙寵嚦宸︾殑欏哄簭鍘嬪弬鏁板叆鏍堬紝鐢辮皟鐢ㄨ呮妸鍙傛暟寮瑰嚭鏍堛傚浜庝紶閫佸弬鏁扮殑鍐呭瓨鏍堟槸鐢辮皟鐢ㄨ呮潵緇存姢鐨勶紙姝e洜涓哄姝わ紝瀹炵幇鍙彉鍙傛暟鐨勫嚱鏁板彧鑳戒嬌鐢ㄨ璋冪敤綰﹀畾錛夈傚彟澶栵紝鍦ㄥ嚱鏁板悕淇グ綰﹀畾鏂歸潰涔熸湁鎵涓嶅悓銆?
_cdecl鏄疌鍜孋錛嬶紜紼嬪簭鐨勭己鐪佽皟鐢ㄦ柟寮忋傛瘡涓涓皟鐢ㄥ畠鐨勫嚱鏁伴兘鍖呭惈娓呯┖鍫嗘爤鐨勪唬鐮侊紝鎵浠ヤ駭鐢熺殑鍙墽琛屾枃浠跺ぇ灝忎細姣旇皟鐢╛stdcall鍑芥暟鐨勫ぇ銆傚嚱鏁伴噰鐢ㄤ粠鍙沖埌宸︾殑鍘嬫爤鏂瑰紡銆俈C灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓婁笅鍒掔嚎鍓嶇紑銆傛槸MFC緙虹渷璋冪敤綰﹀畾銆?
__fastcall:
__fastcall璋冪敤綰﹀畾鏄?浜?濡傚叾鍚嶏紝瀹冪殑涓昏鐗圭偣灝辨槸蹇紝鍥犱負瀹冩槸閫氳繃瀵勫瓨鍣ㄦ潵浼犻佸弬鏁扮殑錛堝疄闄呬笂錛屽畠鐢‥CX鍜孍DX浼犻佸墠涓や釜鍙屽瓧錛圖WORD錛夋垨鏇村皬鐨勫弬鏁幫紝鍓╀笅鐨勫弬鏁頒粛鏃ц嚜鍙沖悜宸﹀帇鏍堜紶閫侊紝琚皟鐢ㄧ殑鍑芥暟鍦ㄨ繑鍥炲墠娓呯悊浼犻佸弬鏁扮殑鍐呭瓨鏍堬級錛屽湪鍑芥暟鍚嶄慨楗扮害瀹氭柟闈紝瀹冨拰鍓嶄袱鑰呭潎涓嶅悓銆?
_fastcall鏂瑰紡鐨勫嚱鏁伴噰鐢ㄥ瘎瀛樺櫒浼犻掑弬鏁幫紝VC灝嗗嚱鏁扮紪璇戝悗浼氬湪鍑芥暟鍚嶅墠闈㈠姞涓?@"鍓嶇紑錛屽湪鍑芥暟鍚嶅悗鍔犱笂"@"鍜屽弬鏁扮殑瀛楄妭鏁般?
thiscall:
thiscall浠呬粎搴旂敤浜?C++"鎴愬憳鍑芥暟銆倀his鎸囬拡瀛樻斁浜嶤X瀵勫瓨鍣紝鍙傛暟浠庡彸鍒板乏鍘嬨倀hiscall涓嶆槸鍏抽敭璇嶏紝鍥犳涓嶈兘琚▼搴忓憳鎸囧畾銆?
naked call:
閲囩敤1-4鐨勮皟鐢ㄧ害瀹氭椂錛屽鏋滃繀瑕佺殑璇濓紝榪涘叆鍑芥暟鏃剁紪璇戝櫒浼氫駭鐢熶唬鐮佹潵淇濆瓨ESI錛孍DI錛孍BX錛孍BP瀵勫瓨鍣紝閫鍑哄嚱鏁版椂鍒欎駭鐢熶唬鐮佹仮澶嶈繖浜涘瘎瀛樺櫒鐨勫唴瀹廣?
naked call涓嶄駭鐢熻繖鏍風殑浠g爜銆俷aked call涓嶆槸綾誨瀷淇グ絎︼紝鏁呭繀欏誨拰_declspec鍏卞悓浣跨敤銆?
鍙﹂檮:
鍏抽敭瀛?__stdcall銆乢_cdecl鍜宊_fastcall鍙互鐩存帴鍔犲湪瑕佽緭鍑虹殑鍑芥暟鍓嶏紝涔熷彲浠ュ湪緙栬瘧鐜鐨凷etting...\C/C++ \Code Generation欏歸夋嫨銆傚綋鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛椾笌緙栬瘧鐜涓殑閫夋嫨涓嶅悓鏃訛紝鐩存帴鍔犲湪杈撳嚭鍑芥暟鍓嶇殑鍏抽敭瀛楁湁鏁堛傚畠浠搴旂殑鍛戒護琛屽弬鏁板垎鍒負/Gz銆?/Gd鍜?Gr銆傜己鐪佺姸鎬佷負/Gd錛屽嵆__cdecl銆?
瑕佸畬鍏ㄦā浠縋ASCAL璋冪敤綰﹀畾棣栧厛蹇呴』浣跨敤__stdcall璋冪敤綰﹀畾錛岃嚦浜庡嚱鏁板悕淇グ綰﹀畾錛屽彲浠ラ氳繃鍏跺畠鏂規硶妯′豢銆傝繕鏈変竴涓煎緱涓鎻愮殑鏄疻INAPI瀹忥紝Windows.h鏀寔璇ュ畯錛屽畠鍙互灝嗗嚭鍑芥暟緲昏瘧鎴愰傚綋鐨勮皟鐢ㄧ害瀹氾紝鍦╓IN32涓紝瀹冭瀹氫箟涓篲_stdcall銆備嬌鐢╓INAPI瀹忓彲浠ュ垱寤鴻嚜宸辯殑APIs銆?
鍚嶅瓧淇グ綰﹀畾
1銆佷慨楗板悕(Decoration name)
“C” 鎴栬?#8220;C++”鍑芥暟鍦ㄥ唴閮紙緙栬瘧鍜岄摼鎺ワ級閫氳繃淇グ鍚嶈瘑鍒備慨楗板悕鏄紪璇戝櫒鍦ㄧ紪璇戝嚱鏁板畾涔夋垨鑰呭師鍨嬫椂鐢熸垚鐨勫瓧絎︿覆銆傛湁浜涙儏鍐典笅浣跨敤鍑芥暟鐨勪慨楗板悕鏄繀瑕佺殑錛屽鍦ㄦā鍧楀畾涔夋枃浠墮噷澶存寚瀹氳緭鍑?#8220;C++”閲嶈澆鍑芥暟銆佹瀯閫犲嚱鏁般佹瀽鏋勫嚱鏁幫紝鍙堝鍦ㄦ眹緙栦唬鐮侀噷璋冪敤“C””鎴?#8220;C++”鍑芥暟絳夈?
淇グ鍚嶇敱鍑芥暟鍚嶃佺被鍚嶃佽皟鐢ㄧ害瀹氥佽繑鍥炵被鍨嬨佸弬鏁扮瓑鍏卞悓鍐沖畾銆?
2銆佸悕瀛椾慨楗扮害瀹氶殢璋冪敤綰﹀畾鍜岀紪璇戠綾?C鎴朇++)鐨勪笉鍚岃屽彉鍖栥傚嚱鏁板悕淇グ綰﹀畾闅忕紪璇戠綾誨拰璋冪敤綰﹀畾鐨勪笉鍚岃屼笉鍚岋紝涓嬮潰鍒嗗埆璇存槑銆?
a銆丆緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓笅鍒掔嚎鍓嶇紑錛屽悗闈㈠姞涓婁竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負_functionname@number銆?
__cdecl璋冪敤綰﹀畾浠呭湪杈撳嚭鍑芥暟鍚嶅墠鍔犱笂涓涓笅鍒掔嚎鍓嶇紑錛屾牸寮忎負_functionname銆?
__fastcall璋冪敤綰﹀畾鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞涓婁竴涓?#8220;@”絎﹀彿錛屽悗闈篃鏄竴涓?#8220;@”絎﹀彿鍜屽叾鍙傛暟鐨勫瓧鑺傛暟錛屾牸寮忎負@functionname@number銆?
瀹冧滑鍧囦笉鏀瑰彉杈撳嚭鍑芥暟鍚嶄腑鐨勫瓧絎﹀ぇ灝忓啓錛岃繖鍜孭ASCAL璋冪敤綰﹀畾涓嶅悓錛孭ASCAL綰﹀畾杈撳嚭鐨勫嚱鏁板悕鏃犱換浣曚慨楗頒笖鍏ㄩ儴澶у啓銆?
b銆丆++緙栬瘧鏃跺嚱鏁板悕淇グ綰﹀畾瑙勫垯錛?
__stdcall璋冪敤綰﹀畾錛?
1銆佷互“?”鏍囪瘑鍑芥暟鍚嶇殑寮濮嬶紝鍚庤窡鍑芥暟鍚嶏紱
2銆佸嚱鏁板悕鍚庨潰浠?#8220;@@YG”鏍囪瘑鍙傛暟琛ㄧ殑寮濮嬶紝鍚庤窡鍙傛暟琛紱
3銆佸弬鏁拌〃浠ヤ唬鍙瘋〃紺猴細
X--void 錛?
D--char錛?
E--unsigned char錛?
F--short錛?
H--int錛?
I--unsigned int錛?
J--long錛?
K--unsigned long錛?
M--float錛?
N--double錛?
_N--bool錛?
....
PA--琛ㄧず鎸囬拡錛屽悗闈㈢殑浠e彿琛ㄦ槑鎸囬拡綾誨瀷錛屽鏋滅浉鍚岀被鍨嬬殑鎸囬拡榪炵畫鍑虹幇錛屼互“0”浠f浛錛屼竴涓?#8220;0”浠h〃涓嬈¢噸澶嶏紱
4銆佸弬鏁拌〃鐨勭涓欏逛負璇ュ嚱鏁扮殑榪斿洖鍊肩被鍨嬶紝鍏跺悗渚濇涓哄弬鏁扮殑鏁版嵁綾誨瀷,鎸囬拡鏍囪瘑鍦ㄥ叾鎵鎸囨暟鎹被鍨嬪墠錛?
5銆佸弬鏁拌〃鍚庝互“@Z”鏍囪瘑鏁翠釜鍚嶅瓧鐨勭粨鏉燂紝濡傛灉璇ュ嚱鏁版棤鍙傛暟錛屽垯浠?#8220;Z”鏍囪瘑緇撴潫銆?
鍏舵牸寮忎負“?functionname@@YG*****@Z”鎴?#8220;?functionname@@YG*XZ”錛屼緥濡?
int Test1錛坈har *var1,unsigned long錛?----“?Test1@@YGHPADK@Z”
void Test2錛堬級 -----“?Test2@@YGXXZ”
__cdecl璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YA”銆?
__fastcall璋冪敤綰﹀畾錛?
瑙勫垯鍚屼笂闈㈢殑_stdcall璋冪敤綰﹀畾錛屽彧鏄弬鏁拌〃鐨勫紑濮嬫爣璇嗙敱涓婇潰鐨?#8220;@@YG”鍙樹負“@@YI”銆?
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?#8220;__cedcl“,灝嗗彧鑳借C/C++璋冪敤.
CB鍦ㄨ緭鍑哄嚱鏁板0鏄庢椂浣跨敤4縐嶄慨楗扮鍙?
//__cdecl
cb鐨勯粯璁ゅ鹼紝瀹冧細鍦ㄨ緭鍑哄嚱鏁板悕鍓嶅姞_錛屽茍淇濈暀姝ゅ嚱鏁板悕涓嶅彉錛屽弬鏁版寜鐓т粠鍙沖埌宸︾殑欏哄簭渚濇浼犻掔粰鏍堬紝涔熷彲浠ュ啓鎴恄cdecl鍜宑decl褰㈠紡銆?
//__fastcall
濂逛慨楗扮殑鍑芥暟鐨勫弬鏁板皢灝借偗鍛㈡劅鍦頒嬌鐢ㄥ瘎瀛樺櫒鏉ュ鐞嗭紝鍏跺嚱鏁板悕鍓嶅姞@錛屽弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__pascal
瀹冭鏄庣殑鍑芥暟鍚嶄嬌鐢≒ascal鏍煎紡鐨勫懡鍚嶇害瀹氥傝繖鏃跺嚱鏁板悕鍏ㄩ儴澶у啓銆傚弬鏁版寜鐓т粠宸﹀埌鍙崇殑欏哄簭鍘嬫爤錛?
//__stdcall
浣跨敤鏍囧噯綰﹀畾鐨勫嚱鏁板悕銆傚嚱鏁板悕涓嶄細鏀瑰彉銆備嬌鐢╛_stdcall淇グ鏃躲傚弬鏁版寜鐓х敱鍙沖埌宸︾殑欏哄簭鍘嬫爤錛屼篃鍙互鏄痏stdcall錛?
VC++瀵瑰嚱鏁扮殑鐪佺己澹版槑鏄?__cedcl",灝嗗彧鑳借C/C++璋冪敤.
娉ㄦ剰錛?
1銆乢beginthread闇瑕乢_cdecl鐨勭嚎紼嬪嚱鏁板湴鍧錛宊beginthreadex鍜孋reateThread闇瑕乢_stdcall鐨勭嚎紼嬪嚱鏁板湴鍧銆?
2銆佷竴鑸琖IN32鐨勫嚱鏁伴兘鏄痏_stdcall銆傝屼笖鍦╓indef.h涓湁濡備笅鐨勫畾涔夛細
#define CALLBACK __stdcall
#define WINAPI銆 __stdcall
3銆乪xtern "C" _declspec(dllexport) int __cdecl Add(int a, int b);
typedef int (__cdecl*FunPointer)(int a, int b);
淇グ絎︾殑涔﹀啓欏哄簭濡備笂銆?
4銆乪xtern "C"鐨勪綔鐢細濡傛灉Add(int a, int b)鏄湪c璇█緙栬瘧鍣ㄧ紪璇戯紝鑰屽湪c++鏂囦歡浣跨敤錛屽垯闇瑕佸湪c++鏂囦歡涓0鏄庯細extern "C" Add(int a, int b)錛屽洜涓篶緙栬瘧鍣ㄥ拰c++緙栬瘧鍣ㄥ鍑芥暟鍚嶇殑瑙i噴涓嶄竴鏍鳳紙c++緙栬瘧鍣ㄨВ閲婂嚱鏁板悕鐨勬椂鍊欒鑰冭檻鍑芥暟鍙傛暟錛岃繖鏍鋒槸浜嗘柟渚垮嚱鏁伴噸杞斤紝鑰屽湪c璇█涓笉瀛樺湪鍑芥暟閲嶈澆鐨勯棶棰橈級錛屼嬌鐢╡xtern "C"錛屽疄璐ㄥ氨鏄憡璇塩++緙栬瘧鍣紝璇ュ嚱鏁版槸c搴撻噷闈㈢殑鍑芥暟銆傚鏋滀笉浣跨敤extern "C"鍒欎細鍑虹幇閾炬帴閿欒銆?
涓鑸薄濡備笅浣跨敤錛?
#ifdef _cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif
#ifdef _cplusplus
extern "C"{
#endif
EXTERN_C int func(int a, int b);
#ifdef _cplusplus
}
#endif
5銆丮FC鎻愪緵浜嗕竴浜涘畯錛屽彲浠ヤ嬌鐢ˋFX_EXT_CLASS鏉ヤ唬鏇縚_declspec(DLLexport)錛屽茍淇グ綾誨悕錛屼粠鑰屽鍑虹被錛孉FX_API_EXPORT鏉ヤ慨楗板嚱鏁幫紝AFX_DATA_EXPORT鏉ヤ慨楗板彉閲?
AFX_CLASS_IMPORT錛歘_declspec(DLLexport)
AFX_API_IMPORT錛歘_declspec(DLLexport)
AFX_DATA_IMPORT錛歘_declspec(DLLexport)
AFX_CLASS_EXPORT錛歘_declspec(DLLexport)
AFX_API_EXPORT錛歘_declspec(DLLexport)
AFX_DATA_EXPORT錛歘_declspec(DLLexport)
AFX_EXT_CLASS錛?ifdef _AFXEXT
AFX_CLASS_EXPORT
#else
AFX_CLASS_IMPORT
6銆丏LLMain璐熻矗鍒濆鍖?Initialization)鍜岀粨鏉?(Termination)宸ヤ綔錛屾瘡褰撲竴涓柊鐨勮繘紼嬫垨鑰呰榪涚▼鐨勬柊鐨勭嚎紼嬭闂瓺LL鏃訛紝鎴栬呰闂瓺LL鐨勬瘡涓涓繘紼嬫垨鑰呯嚎紼嬩笉鍐嶄嬌鐢―LL鎴栬呯粨鏉熸椂錛岄兘浼氳皟鐢―LLMain銆備絾鏄紝浣跨敤TerminateProcess鎴朤erminateThread緇撴潫榪涚▼鎴栬呯嚎紼嬶紝涓嶄細璋冪敤DLLMain銆?
7銆佷竴涓狣LL鍦ㄥ唴瀛樹腑鍙湁涓涓疄渚?
DLL紼嬪簭鍜岃皟鐢ㄥ叾杈撳嚭鍑芥暟鐨勭▼搴忕殑鍏崇郴錛?
1)銆丏LL涓庤繘紼嬨佺嚎紼嬩箣闂寸殑鍏崇郴
DLL妯″潡琚槧灝勫埌璋冪敤瀹冪殑榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿銆?
DLL浣跨敤鐨勫唴瀛樹粠璋冪敤榪涚▼鐨勮櫄鎷熷湴鍧絀洪棿鍒嗛厤錛屽彧鑳借璇ヨ繘紼嬬殑綰跨▼鎵璁塊棶銆?
DLL鐨勫彞鏌勫彲浠ヨ璋冪敤榪涚▼浣跨敤錛涜皟鐢ㄨ繘紼嬬殑鍙ユ焺鍙互琚獶LL浣跨敤銆?
DLLDLL鍙互鏈夎嚜宸辯殑鏁版嵁孌碉紝浣嗘病鏈夎嚜宸辯殑鍫嗘爤錛屼嬌鐢ㄨ皟鐢ㄨ繘紼嬬殑鏍堬紝涓庤皟鐢ㄥ畠鐨勫簲鐢ㄧ▼搴忕浉鍚岀殑鍫嗘爤妯″紡銆?
2)銆佸叧浜庡叡浜暟鎹
DLL瀹氫箟鐨勫叏灞鍙橀噺鍙互琚皟鐢ㄨ繘紼嬭闂紱DLL鍙互璁塊棶璋冪敤榪涚▼鐨勫叏灞鏁版嵁銆備嬌鐢ㄥ悓涓 DLL鐨勬瘡涓涓繘紼嬮兘鏈夎嚜宸辯殑DLL鍏ㄥ眬鍙橀噺瀹炰緥銆傚鏋滃涓嚎紼嬪茍鍙戣闂悓涓鍙橀噺錛屽垯闇瑕佷嬌鐢ㄥ悓姝ユ満鍒訛紱瀵逛竴涓狣LL鐨勫彉閲忥紝濡傛灉甯屾湜姣忎釜浣跨敤DLL鐨勭嚎紼嬮兘鏈夎嚜宸辯殑鍊鹼紝鍒欏簲璇ヤ嬌鐢ㄧ嚎紼嬪眬閮ㄥ瓨鍌?TLS錛孴hread Local Strorage)銆?
]]>
/* file TestC.h */
#ifndef TESTC_H
#define TESTC_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif /* TESTC_H */
/* file TestC.c */
#include "TestC.h"
int add(int a, int b)
{
return (a + b);
}
/* file TestCpp.cpp */
#include "stdio.h"
#include "TestC.h"
int main()
{
printf("add = %d\n", add(2, 5));
return 0;
}
璇存槑錛?br />file TestC.h鏄疌鐨勫ご鏂囦歡錛宖ile TestC.c鏄叾瀹炵幇鏂囦歡錛宖ile TestCpp.cpp鏄皟鐢–鍑芥暟鐨凜++鏂囦歡銆?br />鏂囦歡TestC.h涓殑TESTC_H瀹氫箟鏄負浜嗗ご鏂囦歡淇濇姢錛?#8221; #ifdef __cplusplus”榪欎釜涓嶈兘緙哄皯錛屼綘鍙互鍘繪煡鐪婥鐨勬爣鍑嗗簱澶存枃浠朵腑閮芥湁榪欎釜錛屽”stdio.h”銆傛湁浜嗚繖涓畯緙栬瘧鍣ㄥ氨鐭ラ亾鐜板湪鏄疌榪樻槸C++鍦ㄨ皟鐢ㄥ畠銆?br />涓轟粈涔堣鍖哄垎C涓嶤++璋冪敤鍛紵鍏舵繁灞傛鍘熷洜鏄洜涓篊鍜孋++緙栬瘧鍣ㄥ湪緙栬瘧鍜岄摼鎺ユ椂瀵逛簬鍑芥暟鐨勫鐞嗕笉涓鏍楓侰++涓轟簡鏀寔鍑芥暟閲嶈澆鍦ㄧ紪璇戞椂浼氬姞鍏ュ嚱鏁板弬鏁板強綾誨瀷淇℃伅銆傚涓婇潰鐨刟dd鏂規硶錛孋緙栬瘧鍣ㄧ紪璇戝悗鍦ㄧ鍙峰簱涓殑鍚嶅瓧涓篲add錛岃孋++緙栬瘧鍣ㄥ垯浼氫駭鐢熷儚_add_int_int涔嬬被鐨勫悕瀛椼侰++姝f槸渚濋潬榪欑鏈哄埗瀹炵幇浜嗗嚱鏁扮殑閲嶈澆銆?br />extern鍏抽敭瀛楄〃紺哄皢鍑芥暟鎴栧彉閲忓0鏄庝負鍏ㄥ眬綾誨瀷錛屼笌涔嬬浉瀵瑰簲鐨勬槸static銆俿tatic闄愬畾鍑芥暟鎴栧彉閲忕殑浣滅敤鍩熶負鏈枃浠躲俥xtern榪樻湁涓涓綔鐢ㄥ氨鏄笌”C”榪炲湪涓璧蜂嬌鐢紝鍗砮xtern “C”閫氱煡緙栬瘧鍣ㄥ皢extern “C”鎵鍖呭惈鐨勪唬鐮佹寜鐓鐨勬柟寮忕紪璇戝拰閾炬帴銆?br />
涓嬮潰鎴戜滑灝辨潵鐪嬬湅濡備綍鍦–璇█涓嬌鐢–++鐨勪唬鐮侊紙鍖呮嫭C++綾葷殑鏂規硶錛夈備負浜嗙畝鍗曡搗瑙侊紝鎴戝皢綾葷殑瀹氫箟鍜屽疄鐜版斁鍦ㄤ竴涓枃浠朵腑(閫氬父搴旇鏄皢鍒嗗埆鏀懼湪.h鍜?cpp鏂囦歡涓?銆傝嚜瀹氫箟綾繪枃浠?榪欓噷鐪佺暐浜嗗ご鏂囦歡淇濇姢絳夊叾瀹冪粏鑺?濡備笅錛?br />//* file TestClass.h */
class HJH
{
public:
int add(int a, int b)
{
return (a + b);
}
};
灝咰++綾誨皝瑁呬負C鍑芥暟鐨勬枃浠訛紙涓轟簡綆鐣ヤ篃灝嗗0鏄庡拰瀹炵幇鏀懼湪浜嗗悓涓涓枃浠朵腑錛夊涓嬶細
/* file TestCpp.cpp */
#include "TestClass.h"
extern "C" int add_cpp(int a, int b);
int add_cpp(int a, int b)
{
HJH hjh;
return hjh.add(a, b);
}
瀹為檯璋冪敤C++浠g爜鐨凜鏂囦歡濡備笅錛?br />/*file TestC.c */
#include "stdio.h"
extern int add_cpp(int a, int b);
int main()
{
printf("add_cpp = %d\n", add_cpp(2, 5));
return 0;
}
涓婇潰鐨勮繃紼嬪緢娓呮櫚錛屽氨鏄敤涓涓嚱鏁板皢C++綾葷殑浣跨敤灝佽璧鋒潵錛岀劧鍚庡皢瀹冨閮ㄥ0鏄庝負C鍑芥暟灝卞彲浠ヤ簡銆?br />鏂囦歡TestClass.h瀹氫箟騫跺疄鐜頒簡涓涓被錛岃綾誨彧鏈変竴涓猘dd鏂規硶銆傛枃浠禩estCpp.cpp瀹氫箟騫跺疄鐜頒簡涓涓嚱鏁癮dd_cpp錛屽嚱鏁頒腑瀹氫箟浜嗕竴涓狧JH綾誨璞″茍璋冪敤浜嗚瀵硅薄鐨刟dd鏂規硶銆傜劧鍚庡皢add_cpp鍑芥暟榪涜澶栭儴澹版槑涓篊銆?br />TestC.c鏂囦歡涓負浜嗕嬌鐢╝dd_cpp鍑芥暟錛屼篃闇瑕佽繘琛屽閮ㄥ0鏄庛傝繖鏄負浜嗛氱煡緙栬瘧鍣ㄨ鏄庤繖涓嚱鏁版槸鍦ㄥ叾浠栨枃浠朵腑瀹炵幇錛堟敞鎰忓湪C鏂囦歡涓殑extern鍚庨潰涓嶅彲鍔?#8221;C”錛夈傚綋榪欎笁涓枃浠朵竴璧風紪璇戦摼鎺ユ椂錛岀紪璇戝櫒灝卞彲浠ユ壘鍒癮dd_cpp鐨勫叿浣撳疄鐜般?/p>
]]>
榪欎笁涓嚱鏁伴兘鏄緱鍒拌璦ID錛屼絾鏄嬌鐢ㄧ殑鍦哄悎涓婂嵈鏄湁鎵涓嶅悓錛屼笅闈㈠厛緇欏嚭涓変釜鍑芥暟鐨勫師鍨嬪拰瑙i噴錛?br />GetUserDefaultLangID
Returns the language identifier for the current user locale.
LANGID GetUserDefaultLangID(void);
Parameters
This function has no parameters.
Return Values
Returns the language identifier for the current user locale.
GetSystemDefaultLangID
Returns the language identifier for the system locale.
LANGID GetSystemDefaultLangID(void);
Parameters
This function has no parameters.
Return Values
Returns the language identifier for the system locale.
GetUserDefaultUILanguage
Retrieves the user UI language for the current user. If the current user has not set a language, GetUserDefaultUILanguage returns the language identifier for the system default UI language.
LANGID GetUserDefaultUILanguage(void);
Parameters
This function has no parameters.
Return Value
Returns the language identifier for the user UI language for the current user.
瑕佺悊瑙h繖涓変釜鍑芥暟鐨勪嬌鐢ㄥ厛瑕佺湅鐪嬫帶鍒墮潰鏉?>鍖哄煙鍜岃璦閫夐」錛?br />絎竴欏典唬琛ㄦ暟瀛楄揣甯佹椂闂達紝絎簩欏墊槸緋葷粺UI鍜岃蔣浠剁晫闈紝絎笁欏甸珮綰ф槸闈瀠nicode紼嬪簭鐣岄潰璇█銆?br />涓嬮潰鏄繖涓変釜欏甸潰璁劇疆鏃訛紝涓嶅悓鐨勫嚱鏁扮殑緇撴灉錛?br /> 鍖哄煙閫夐」 璇█ 楂樼駭
GetUserDefaultLangID 鏀瑰彉 涓嶅彉 涓嶅彉
GetSystemDefaultLangID 涓嶅彉 涓嶅彉 鏀瑰彉
GetUserDefaultUILanguage 鏀瑰彉 鏀瑰彉 涓嶅彉
鐢變簺鍙錛孏etUserDefaultUILanguage浼氬拰緋葷粺UI鐨勮璦涓鑷達紝鎵浠ユ垜浠緩璁湪鍐橴NICODE紼嬪簭鐣岄潰鏃剁敤榪欎釜
鍑芥暟浼氬ソ浜涳紝鍜孫S鐨刄I涓鑷達紝涓嶄細璁╁浜鴻寰楀緢濂囨?/p>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/nanjian011/archive/2009/10/23/4716903.aspx
http://blog.sina.com.cn/s/blog_48f93b530100fsln.html
鍦?span>Windows騫沖彴涓嬬敤C++寮鍙戝簲鐢ㄧ▼搴忥紝鏈涓嶆兂瑙佸埌鐨勬儏鍐墊亹鎬曞氨鏄▼搴忓穿婧冿紝鑰岃鎯寵В鍐沖紩璧烽棶棰樼殑bug錛屾渶鍥伴毦鐨勫簲璇ュ氨鏄皟璇?span>release鐗堟湰浜嗐傚洜涓?span>release鐗堟湰鏉ュ氨灝戜簡寰堝璋冭瘯淇℃伅錛屾洿浣曞喌涓鑸兘鏄彂甯冨嚭鍘葷敱鐢ㄦ埛浣跨敤錛?span>crash鐨勭幇鍦哄緢闅句繚鐣欏拰閲嶇幇銆傛湰鏂囧皢緇欏嚭鍑犱釜瑙e喅鏂規錛屽畬鎴愬release鐗堝簲鐢ㄧ▼搴?span>crash閿欒鐨勮皟璇曘傦紙鏈枃鍙璁?span>Windows騫沖彴MSVC鐜涓嬬殑璋冭瘯錛屽浜庡叾浠栧鉤鍙板拰寮鍙戠幆澧冩病鏈夊叧娉紝璇峰ぇ瀹惰嚜宸卞熼壌鍜屽皾璇曘傦級
涓婄瘒緇欏嚭鐨勬柟妗堜竴榪樿琛ュ厖鍑犲彞銆傞氳繃“crash鍦板潃 + MAP鏂囦歡”鏉ュ畾浣嶅嚭閿欎唬鐮佷綅緗櫧鐒墮渶瑕佺粡榪囨瘮杈冨鏉傜殑鍦板潃璁$畻錛屼絾鍗存槸鏈綆鍗曞疄鐜扮殑鏂瑰紡銆傚鏋滀粎浠呮兂閫氳繃宕╂簝鍦板潃瀹氫綅鍑洪敊鐨勫嚱鏁幫紝灝辨洿鍔犳柟渚夸簡銆傛垜鍦ㄧ綉涓婃壘鍒頒竴涓В鏋?span>MAP鏂囦歡鐨勫皬宸ュ叿錛屽彲浠ラ潪甯告竻鏅扮殑鍒楀嚭姣忎釜鍑芥暟鐨勫湴鍧錛屽茍涓斿彲浠ュ皢鍒嗘瀽琛ㄦ牸瀵煎嚭涓?span>Excel鏂囦歡銆傚伐鍏蜂笅杞藉湴鍧錛?span>http://e.ys168.com/?tinyfun錛屽伐鍏風洰褰曚笅VCMapper.exe銆?/span>
鏍規嵁鍓嶉潰涓ょ瘒鍗氭枃錛屾垜浠瀹氫綅宕╂簝琛屼唬鐮侊紝蹇呴』瑕佽嚜宸辨牴鎹浉鍏充俊鎭枃浠惰繘琛岃綆椼傚鏋滈渶瑕佸鐞嗙殑閲忔瘮杈冨ぇ錛屾亹鎬曚細寰堣垂鍔涙皵銆傛湁娌℃湁鏇寸畝鍗曞揩閫熺殑鍔炴硶鍛紵
鍓嶉潰鍑犱釜鏂規閮芥槸鐩存帴瀹氫綅crash鐨勪唬鐮佷綅緗紝浣嗘槸鍦ㄦ瘮杈冨ぇ鍨嬬殑紼嬪簭涓紝鍙煡閬撹繖涓俊鎭繕鏄繙榪滀笉澶熺殑錛屾垜浠笇鏈涚煡閬撴洿澶氬叧浜庤皟鐢ㄥ嚱鏁伴『搴忓強鍙橀噺鍊肩瓑淇℃伅錛屼篃灝辨槸crash鏃惰皟鐢ㄥ爢鏍堜俊鎭?/span>
褰撴垜浠妸鑷繁鐨?span>release鐗堟湰紼嬪簭鍙戝竷鍑哄幓浠ュ悗錛屼竴鑸兘鏄湪鐢ㄦ埛鐨勬満鍣ㄤ笂榪愯銆傝繖縐嶆儏鍐典笅錛屽浜庣鍥涚鏂規錛屽洜涓洪渶瑕?span>pdb鏂囦歡鎵嶈兘澶熸紜敓鎴愬爢鏍堣皟鐢ㄧ殑鍑芥暟琛屽彿鍙婁唬鐮佽鍙鳳紝鍥犳鏂規鍥涘彧閫傜敤浜庢湰鍦?span>release鐗堢殑璋冭瘯錛屽惁鍒欏彧鑳界敓鎴愪笉瀹屾暣鐨勫爢鏍堜俊鎭傚浜庡墠涓夌鏂規錛屽叾瀹炲彧闇瑕佺敤鎴峰憡鐭ュ穿婧冨湴鍧錛岀劧鍚庡湪鏈湴鏌ユ壘crash鍦板潃灝卞彲浠ヤ簡錛屼絾鏄畾浣?span>crash鐨勮繃紼嬮潪甯鎬笉鏂逛究錛屽鏋?span>crash鐨勬儏鍐墊瘮杈冨錛屽墠涓夌鏂規閮戒笉鍚堥傘傝屼笖錛屽墠涓夌鏂規鍧囦笉鑳界敓鎴愬爢鏍堣皟鐢ㄤ俊鎭紝瀵逛簬debug鐨勪綔鐢ㄦ湁闄愩?/span>
涓婁竴綃囨垜浠凡緇忕粰鍑轟簡鏂規錛岃兘澶熼潪甯告柟渚跨殑閫氳繃dump鏂囦歡瀵?span>crash閿欒榪涜璋冭瘯鍜屽畾浣嶏紱浠庢暣涓祦紼嬩笂鐪嬭繕宸渶鍚庝竴姝ワ紝鍗蟲庢牱鎷垮埌crash鏃朵駭鐢熺殑dump鏂囦歡銆傚鏋滃彲浠ヨ鐢ㄦ埛鎶婃枃浠跺彂閫佽繃鏉ヨ嚜鐒朵笉閿欙紝浣嗗浜庣被浼煎厤璐瑰叡浜蔣浠剁瓑鍦ㄤ簰鑱旂綉涓婂彂甯冪殑紼嬪簭鍛紵鎴戜滑鐨勭敤鎴鋒槸涓嶇‘瀹氱殑錛岃屼笖鐢ㄦ埛閲忔湁鍙兘闈炲父澶э紝鍗充嬌鎴戜滑鑳芥兂鍔炴硶鑱旂郴鍒扮敤鎴鳳紝鎬諱笉鑳芥尐涓幓鏀墮泦crash淇℃伅鍚с?/span>
1 姒傝堪
1鏈嶅姟紼嬪簭閬靛驚Service Control Manager(SCM)鐨勬帴鍙h鍒欍?/span> 鍚姩鏂瑰紡鐢?/span>3縐嶏細1 緋葷粺鍚姩鏃惰嚜鍔ㄥ惎鍔紱2 閫氳繃鏈嶅姟鎺у埗闈㈡澘;3 閫氳繃浣跨敤鏈嶅姟鍑芥暟銆?/span>2鏈嶅姟鍙互鍦ㄦ病鏈夌敤鎴風櫥褰曞埌緋葷粺鐨勬儏鍐典笅榪愯銆?/span>
2 椹卞姩鏈嶅姟錛?/span>椹卞姩鏈嶅姟閬靛驚璁懼椹卞姩鍗忚錛屽畠涓庢湇鍔$▼搴忕被浼鹼紝浣嗘槸涓嶄笌SCM浜や簰銆?/span>
3 The SCM processes service control notifications in a serial fashion
4 The default security descriptor allows the LocalSystem account, and members of the Administrators and Power Users groups to stop and start services.
2 鏈嶅姟鍦?/span>Win7涓殑鏂扮壒鎬?/span>
1 鍙互娉ㄥ唽涓涓湇鍔★紝鍦ㄤ竴涓壒瀹氫簨浠跺彂鐢熸椂鍚姩鎴栬呭仠姝㈡湇鍔°?/span>
鏇存柊鐨勫嚱鏁?/span>
|
Changes the configuration parameters of a service. This function supports managed service accounts and virtual accounts. For more information, see Service Accounts Step-by-Step Guide. |
|
|
Changes the optional configuration parameters of a service. This function supports new configuration information levels for processor groups and service trigger events. |
|
|
Creates a service object and adds it to the specified service control manager database. This function supports managed service accounts and virtual accounts. For more information, see Service Accounts Step-by-Step Guide. |
|
|
An application-defined callback function used with the RegisterServiceCtrlHandlerEx function. This callback function supports new extended control codes for system time changes and service trigger events. |
|
|
Retrieves the optional configuration parameters of a service. This function supports new configuration information levels for processor groups and service trigger events. |
|
|
Updates the service control manager's status information for the calling service. This function supports new extended control codes for system time changes and service trigger events. |
鏂扮殑緇撴瀯
|
Contains system time change settings. |
|
|
Represents a service trigger event. |
|
|
Contains trigger event information for a service. |
|
|
Contains trigger-specific data for a service trigger event. |
Service Changes for Windows
涓轟簡鎻愰珮鎬ц兘銆佸彲闈犳с佸畨鍏ㄦс佸彲綆$悊鎬х瓑錛屽湪Vista涔嬪悗錛屾湇鍔℃彁渚涗簡寰堝澧炲己鐨勭壒鎬с?/span>
Session 0 Isolation
鏈嶅姟鎬繪槸榪愯鍦?/span>Session 0錛屽湪Vista涔嬪墠錛岀涓涓敤鎴蜂篃鏄繍琛屽湪Session0錛屽湪Vista涔嬪悗錛岀涓涓敤鎴瘋繍琛屽湪Session1錛岀浜屼釜鐢ㄦ埛榪愯鍦?/span>Session2錛?/span> 絳夌瓑錛岃繖鏍風敤鎴風▼搴忓拰鏈嶅姟灝卞緇堣繍琛屽湪涓嶅悓鐨?/span>Session涓娿?/span>Session 0 涓嶆敮鎸佷笌鐢ㄦ埛浜や簰鐨勮繘紼嬨傝繖灝辨剰鍛崇潃Service涓嶈兘鍚戝簲鐢ㄧ▼搴忓彂閫佹秷鎭紝搴旂敤紼嬪簭涔熶笉鑳藉儚Service鍙戦佹秷鎭傞櫎姝や箣澶栵紝Service榪樹笉鑳芥樉紺?/span>GUI錛屽瀵硅瘽妗嗭紝浣嗘槸Service鍙互浣跨敤WTSSendMessage 鍑芥暟鍦ㄥ彟涓涓?/span>Session涓樉紺哄璇濇銆?/span>
Delayed AutoStart 鍦ㄧ郴緇熷惎鍔ㄧ殑涓灝忔鏃墮棿錛?/span>shortly after錛夊唴鍚姩鏈嶅姟銆?/span>
Failure Detection and Recovery錛氬鏋滄湇鍔″け璐ワ紝SCM鍙互鎵ц澶辮觸action錛屽閲嶅惎鏈嶅姟銆?/span>
Preshutdown Notifications錛氭槸鏈嶅姟鏈夎凍澶熺殑鏃墮棿鏉ヤ紭闆呯殑鍏抽棴銆?/span>
Restricted Network Acess錛?/span>
Running with Least Privilage錛?/span>
鍏充簬鏈嶅姟
SCM緇存姢鑰呭凡瀹夎鐨勬湇鍔″拰椹卞姩鏈嶅姟鐨勬暟鎹簱錛屽茍涓旀彁渚涗簡緇熶竴鐨勫畨鍏ㄧ殑鎺у埗瀹冧滑鐨勬柟娉曘傛暟鎹簱淇℃伅鍖呮嫭姣忎釜鏈嶅姟濡備綍琚惎鍔ㄣ?/span>
涓嬮潰綾誨瀷鐨勭▼搴忎嬌鐢?/span>SCM鎻愪緵鐨勫嚱鏁幫細
鏈嶅姟紼嬪簭錛?/span>Service Program錛夛細涓涓負涓涓垨鑰呭涓湇鍔℃彁渚涘彲鎵ц浠g爜鐨勭▼搴忋傛湇鍔$▼搴忎嬌鐢ㄨ繛鎺ュ埌SCM鐨勫嚱鏁頒互鍙婂彂閫佺姸鎬佷俊鎭粰SCM鐨勫嚱鏁般?/span>
鏈嶅姟閰嶇疆紼嬪簭錛?/span>Service configuration program錛夛細涓涓煡璇㈠拰淇敼鏈嶅姟鏁版嵁搴撶殑紼嬪簭銆傛湇鍔¢厤緗▼搴忎嬌鐢ㄦ墦寮鏁版嵁搴撶殑鍑芥暟錛屽湪鏁版嵁搴撲腑瀹夎鍜屽垹闄ゆ湇鍔★紝瀵瑰畨瑁呯殑鏈嶅姟鏌ヨ鍜屼慨鏀歸厤緗弬鏁幫紝瀹夊叏鍙傛暟銆傛湇鍔¢厤緗▼搴忕鐞嗘湇鍔′互鍙婇┍鍔ㄦ湇鍔°?/span>
鏈嶅姟鎺у埗紼嬪簭錛?/span>Service Control Program錛夛細涓涓惎鍔ㄥ茍鎺у埗鏈嶅姟浠ュ強椹卞姩鏈嶅姟鐨勭▼搴忋傛湇鍔℃帶鍒剁▼搴忎嬌鐢ㄥ彂閫佽姹傚埌SCM鐨勫嚱鏁般?/span>
Service Control Manager(鏈嶅姟鎺у埗綆$悊鍣?/span>)
1 緋葷粺鍚姩鏃跺惎鍔紱瀹冩槸涓涓?/span>RPC (Remote procedure call) 鏈嶅姟鍣ㄣ傛墍浠ユ湇鍔¢厤緗拰鏈嶅姟鎺у埗紼嬪簭鍙互鍦ㄨ繙紼嬫満鍣ㄤ笂綆$悊鏈嶅姟銆?/span>
鎻愪緵鎺ュ彛鍔熻兘錛?/span>
綆$悊瀹夎鏈嶅姟鐨勬暟鎹簱錛?/span>
鍚姩鏈嶅姟錛堢郴緇熷惎鍔ㄦ椂錛屾垨鑰呴渶瑕佹椂錛?/span>
鏋氫婦瀹夎鐨勬湇鍔?/span>
涓鴻繍琛岀殑鏈嶅姟緇存姢鐘舵佷俊鎭?/span>
浼犺緭鎺у埗璇鋒眰錛?/span>control request錛夌粰姝e湪榪愯鐨勬湇鍔?/span>
閿佸畾鍜岃В閿佹湇鍔℃暟鎹簱銆?/span>
Database of installed service
鍦ㄦ敞鍐岃〃涓淮鎶ょ潃宸插畨瑁呯殑鏈嶅姟鍒楄〃銆傛敞鍐岃〃濡備笅
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
榪欎釜閿間負姣忎竴涓畨瑁呯殑鏈嶅姟鍖呭惈涓涓瓙閿紝瀛愰敭鐨勫悕瀛楀氨鏄湇鍔″悕銆?/span>
Database鍙堝彨浣?/span>ServiceActive databse鎴栬?/span>SCM database銆備綘蹇呴』浣跨敤SCM鎻愪緵鐨勫嚱鏁幫紝鑰屼笉鑳界洿鎺ヤ慨鏀?/span>databse錛屽嵆涓嶈兘鐩存帴淇敼娉ㄥ唽琛ㄣ?/span>
鑷姩鍚姩鏈嶅姟
鍦ㄧ郴緇熷惎鍔ㄧ殑鏃跺?/span>,SCM灝嗗惎鍔ㄦ墍鏈夎嚜鍚姩鐨勬湇鍔′互鍙婂畠浠緷璧栫殑鏈嶅姟銆?/span>
鍚姩欏哄簭錛?/span>
1 鎸夊姞杞藉惎鍔ㄧ粍鍒楄〃涓殑欏哄簭錛涜繖涓俊鎭繚瀛樺湪ServiceGroupOrder鍊間腑錛?/span>
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
2 GroupOrderList
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
3 姣忎釜鏈嶅姟鐨勪緷璧栧垪琛?/span>
褰撳惎鍔ㄥ畬鎴愬悗錛岀郴緇熸墽琛屽惎鍔ㄨ璇佺▼搴忥紙boot verification program錛夋牴鎹?/span>BootVerificationProgram
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control.
榛樿鎯呭喌涓嬶紝榪欎釜鍊兼槸娌℃湁璁劇疆鐨勩備綘鍙互鎻愪緵紼嬪簭鏉ユ嫻嬬郴緇燂紝璋冪敤NotifyBootConfigStatus閫氱煡SCM錛屾姤鍛?/span>boot 鐘舵併?/span>
鍦ㄦ垚鍔熼噸鍚悗錛岀郴緇熶細灝嗙粍鍐岃〃澶嶅埗涓浠藉埌涓嬮潰鐩綍涓?/span>last-known-good (LKG) configuration
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\Services
鎸夐渶鍚姩鏈嶅姟
褰撴湇鍔″惎鍔ㄤ箣鍚庯紝SCM鎵ц涓嬪垪姝ラ錛?/span>
鑾峰彇瀛樺偍鍦ㄦ暟鎹簱涓殑甯愭埛淇℃伅
鐧誨綍鍒版湇鍔″笎鎴?/span>
鍔犺澆鐢ㄦ埛閰嶇疆
鍦ㄦ殏鍋滅姸鎬佷笅鍒涘緩鏈嶅姟
緇欒繘紼嬪垎閰嶄竴涓?/span>Logon鐨?/span>token
鍏佽榪涚▼鎵ц
Service Record List
鐢變簬姣忎釜鏈嶅姟瀹炰綋鏄粠娉ㄥ唽琛ㄦ暟鎹簱涓鍙栫殑錛屽洜姝?/span>SCM涓烘瘡涓湇鍔″垱寤轟簡涓涓?/span>Service Record錛?/span>
涓涓?/span>Service Record鍖呮嫭錛?/span>
鏈嶅姟鍚?/span>
鍚姩綾誨瀷
鏈嶅姟鐘舵侊紙SERVICE_STATUS緇撴瀯錛?/span>
鎸囧悜渚濊禆鏈嶅姟鍒楄〃鐨勬寚閽?/span>
鏈嶅姟鍦ㄥ畨瑁呯殑鏃跺欑敤鎴峰悕鍜屽瘑鐮佹槸鎸囧畾濂界殑銆?/span>SCM鍦ㄦ敞鍐岃〃涓瓨鏀劇敤鎴峰悕錛屽湪Local Security Authority錛?/span>LSA錛変腑瀛樻斁瀵嗙爜銆?/span>
SCM淇濆瓨涓や喚鐢ㄦ埛瀵嗙爜銆備竴涓綋鍓嶅瘑鐮佸拰涓涓浠藉瘑鐮併傚湪鏈嶅姟絎竴嬈″畨瑁呯殑鏃跺欎嬌鐢ㄥ綋鍓嶅瘑鐮侊紝澶囦喚瀵嗙爜鏄湭鍒濆鍖栫殑銆傚綋鐢ㄥ綋鍓嶅瘑鐮佽繍琛屾湇鍔℃垚鍔熷悗錛屾墠浼氬皢褰撳墠瀵嗙爜鍐欏叆鍒板浠藉瘑鐮併?/span>SCM鍦ㄦ敹鍒版湇鍔$姸鎬侀氱煡鍚庢洿鏂版湇鍔$姸鎬併?/span>
椹卞姩鏈嶅姟鐨勭姸鎬佹槸閫氳繃鏌ヨIO緋葷粺鑾峰緱鐨勶紝鑰屼笉鏄氳繃鐘舵侀氱煡錛岃繖鐐規槸涓?/span>Service涓嶅悓鐨勩?/span>
SCM Handles
SCM鏀寔鍙ユ焺錛?/span>Handle錛夋潵璁塊棶涓嬮潰鐨勫璞°?/span>
宸插畨瑁呯殑鏈嶅姟鐨勬暟鎹簱錛氱敤SCManager object鏉ヨ〃紺?/span>
鏈嶅姟錛氱敱涓涓畨瑁呯殑鏈嶅姟浠h〃鏈嶅姟瀵硅薄銆?/span>
鏁版嵁搴撻攣
Service Programs鏈嶅姟紼嬪簭
Main鍑芥暟錛?/span>
璋冪敤StartServiceCtrlDispatcher鍑芥暟榪炴帴鍒?/span>SCM騫跺惎鍔?/span>control dispatcher綰跨▼銆?/span>Control dispatcher綰跨▼寰幆loop錛岀瓑寰呭湪dispatch table涓寚瀹氱殑鏈嶅姟鐨勮姹傘?/span>
渚嬪瓙錛?/span>
void __cdecl _tmain(int argc, TCHAR *argv[])
{
// If command-line parameter is "install", install the service.
// Otherwise, the service is probably being started by the SCM.
if( lstrcmpi( argv[1], TEXT("install")) == 0 )
{
SvcInstall();
return;
}
// TO_DO: Add any additional services for the process to this table.
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ SVCNAME, (LPSERVICE_MAIN_FUNCTION) SvcMain },
{ NULL, NULL }
};
// This call returns when the service has stopped.
// The process should simply terminate when the call returns.
if (!StartServiceCtrlDispatcher( DispatchTable ))
{
SvcReportEvent(TEXT("StartServiceCtrlDispatcher"));
}
}
ServiceMain鍑芥暟錛?/span>
棣栧厛璋冪敤RegisterServiceCtrlHandler鍑芥暟鏉ユ敞鍐?/span>SvcCtrHandler鍑芥暟浣滀負鏈嶅姟鐨勫鐞嗗嚱鏁幫紝鐒跺悗寮濮嬪垵濮嬪寲銆?/span>
VOID WINAPI SvcMain( DWORD dwArgc, LPTSTR *lpszArgv )
{
// Register the handler function for the service
gSvcStatusHandle = RegisterServiceCtrlHandler(
SVCNAME,
SvcCtrlHandler);
if( !gSvcStatusHandle )
{
SvcReportEvent(TEXT("RegisterServiceCtrlHandler"));
return;
}
// These SERVICE_STATUS members remain as set here
gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
gSvcStatus.dwServiceSpecificExitCode = 0;
// Report initial status to the SCM
ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 3000 );
// Perform service-specific initialization and work.
SvcInit( dwArgc, lpszArgv );
}
//
// Purpose:
// The service code
//
// Parameters:
// dwArgc - Number of arguments in the lpszArgv array
// lpszArgv - Array of strings. The first string is the name of
// the service and subsequent strings are passed by the process
// that called the StartService function to start the service.
//
// Return value:
// None
//
VOID SvcInit( DWORD dwArgc, LPTSTR *lpszArgv)
{
// TO_DO: Declare and set any required variables.
// Be sure to periodically call ReportSvcStatus() with
// SERVICE_START_PENDING. If initialization fails, call
// ReportSvcStatus with SERVICE_STOPPED.
// Create an event. The control handler function, SvcCtrlHandler,
// signals this event when it receives the stop control code.
ghSvcStopEvent = CreateEvent(
NULL, // default security attributes
TRUE, // manual reset event
FALSE, // not signaled
NULL); // no name
if ( ghSvcStopEvent == NULL)
{
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
return;
}
// Report running status when initialization is complete.
ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );
// TO_DO: Perform work until service stops.
while(1)
{
// Check whether to stop the service.
WaitForSingleObject(ghSvcStopEvent, INFINITE);
ReportSvcStatus( SERVICE_STOPPED, NO_ERROR, 0 );
return;
}
}
//
// Purpose:
// Sets the current service status and reports it to the SCM.
//
// Parameters:
// dwCurrentState - The current state (see SERVICE_STATUS)
// dwWin32ExitCode - The system error code
// dwWaitHint - Estimated time for pending operation,
// in milliseconds
//
// Return value:
// None
//
VOID ReportSvcStatus( DWORD dwCurrentState,
DWORD dwWin32ExitCode,
DWORD dwWaitHint)
{
static DWORD dwCheckPoint = 1;
// Fill in the SERVICE_STATUS structure.
gSvcStatus.dwCurrentState = dwCurrentState;
gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
gSvcStatus.dwWaitHint = dwWaitHint;
if (dwCurrentState == SERVICE_START_PENDING)
gSvcStatus.dwControlsAccepted = 0;
else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
if ( (dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED) )
gSvcStatus.dwCheckPoint = 0;
else gSvcStatus.dwCheckPoint = dwCheckPoint++;
// Report the status of the service to the SCM.
SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
}
Control Handler鍑芥暟錛?/span>
璇ュ嚱鏁版槸鐢?/span>dispatcher thread璋冪敤鐨勶紝瀹冨鐞嗗湪OpCode鍙傛暟涓紶榪涙潵鐨勬帶鍒剁爜錛岀劧鍚庤皟鐢?/span>ReportSvcStatus鍑芥暟鏉ユ洿鏂版湇鍔$姸鎬併傚綋Handler鏀跺埌鎺у埗鐮佹椂錛屽彧鏈夊綋鏀跺埌鐨勬帶鍒剁爜寮曡搗鏈嶅姟鐘舵佸彉鍖栨椂鎵嶆姤鍛婃湇鍔$姸鎬併?/span>
VOID WINAPI SvcCtrlHandler( DWORD dwCtrl )
{
// Handle the requested control code.
switch(dwCtrl)
{
case SERVICE_CONTROL_STOP:
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
// Signal the service to stop.
SetEvent(ghSvcStopEvent);
ReportSvcStatus(gSvcStatus.dwCurrentState, NO_ERROR, 0);
return;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
}
Service Configuration Program Tasks鏈嶅姟閰嶇疆紼嬪簭鐨勪換鍔?/span>
瀹夎鏈嶅姟
鍒犻櫎鏈嶅姟
鏀瑰彉鏈嶅姟閰嶇疆
鏌ヨ鏈嶅姟閰嶇疆
Service Control Program Tasks鏈嶅姟鎺у埗紼嬪簭浠誨姟
鍚姩鏈嶅姟
鍋滄鏈嶅姟
鏀瑰彉涓涓湇鍔$殑DACL
Service Functions
The following functions are used or implemented by services.
|
Function |
Description |
|
An application-defined callback function used with the RegisterServiceCtrlHandler function. |
|
|
An application-defined callback function used with the RegisterServiceCtrlHandlerEx function. |
|
|
Registers a function to handle service control requests. |
|
|
Registers a function to handle extended service control requests. |
|
|
An application-defined function that serves as the starting point for a service. |
|
|
Registers a service type with the service control manager and the Server service. |
|
|
Updates the service control manager's status information for the calling service. |
|
|
Connects the main thread of a service process to the service control manager. |
The following functions are used by programs that control or configure services.
|
Function |
Description |
|
Changes the configuration parameters of a service. |
|
|
Changes the optional configuration parameters of a service. |
|
|
Closes the specified handle to a service control manager object or a service object. |
|
|
Sends a control code to a service. |
|
|
Sends a control code to a service. |
|
|
Creates a service object and adds it to the specified service control manager database. |
|
|
Marks the specified service for deletion from the service control manager database. |
|
|
Retrieves the name and status of each service that depends on the specified service. |
|
|
Enumerates services in the specified service control manager database based on the specified information level. |
|
|
Retrieves the display name of the specified service. |
|
|
Retrieves the service name of the specified service. |
|
|
Reports the boot status to the service control manager. |
|
|
Enables an application to receive notification when the specified service is created or deleted or when its status changes. |
|
|
Establishes a connection to the service control manager on the specified computer and opens the specified service control manager database. |
|
|
Opens an existing service. |
|
|
Retrieves the configuration parameters of the specified service. |
|
|
Retrieves the optional configuration parameters of the specified service. |
|
|
Retrieves a copy of the security descriptor associated with a service object. |
|
|
Retrieves the current status of the specified service based on the specified information level. |
|
|
Sets the security descriptor of a service object. |
|
|
Starts a service. |
Service Structures
The following structures are used with services:
鐗?/strong> 鏈?/strong> 鎺?/strong> 鍒?/strong>
鐗堟湰鍙?/strong> 鏃ユ湡 淇敼鑰?/strong> 璇存槑 澶囨敞 0.1 2010.07.13 phoenix 0.2 2011.01.12 phoenix
鐩?褰?/p>
褰撳紑鍙戜漢鍛樺紑濮嬭繘琛岀紪鐮佸伐浣滀互鍙婄紪鐮佸伐浣滅殑榪囩▼涓紝閮介渶瑕佹牴鎹伐紼嬬殑闇瑕侀厤緗悇縐嶅伐浣滆礬寰勶紝濡傚紩鍏ョ涓夋柟搴撱佽緭鍑虹敓鎴愮殑澶存枃浠跺拰搴撴枃浠剁瓑銆備互鍓嶉儴鍒嗗紑鍙戜漢鍛樺宸ョ▼璺緞鐨勫畾涔夋瘮杈冮殢鎰忥紝鐩稿綋涓閮ㄥ垎浣跨敤鐨勬槸緇濆璺緞銆傚鏋滃彧鏄崟涓紑鍙戜漢鍛樺畬鎴愪竴涓崟涓鐨勫姛鑳斤紝榪欑鍋氭硶鐪嬭搗鏉ユ病鏈変粈涔堟槑鏄劇殑緙虹偣銆備絾鏄紝濡傛灉鏄暟涓紑鍙戜漢鍛樻潵鍚堜綔鍏卞悓瀹屾垚涓涓姛鑳藉拰緇撴瀯閮藉緢澶嶆潅鐨勫伐紼嬫椂錛岃繖縐嶅仛娉曠殑寮婄灝卞嚫鏄懼嚭鏉ャ備竴涓潪甯告槑鏄劇殑闂灝辨槸錛氬紑鍙戜漢鍛楢灝嗕粬鐨勫伐紼嬩氦緇欏紑鍙戜漢鍛楤緙栬瘧鏃訛紝濡傚伐紼嬪畾涔変嬌鐢ㄤ簡緇濆璺緞錛岄櫎闈炲紑鍙戜漢鍛楤鐨勮綆楁満涓嶢鐨勮綆楁満鍏鋒湁瀹屽叏鐩稿悓鐨勬枃浠剁粍緇囩粨鏋勶紝鍚﹀垯涓嬈℃х紪璇戦氳繃鏄笉鍙兘銆傚彟澶栵紝褰撳紑鍙戜漢鍛樺湪涓闀夸覆鐨?#8220;Can’t find …”鎴栬?#8220;XXX undefined”鐨勯敊璇笌璀﹀憡涓劍澶寸儌棰濇椂錛屼篃璁稿彧鏄洜涓轟竴涓笉璧風溂鐨勫湴鏂逛嬌鐢ㄤ簡緇濆璺緞錛屾垨鑰呮槸澶у皬鍐欑殑宸紓銆?/p>
鍥犳錛岃鑼冨紑鍙戜漢鍛樼殑宸ョ▼閰嶇疆鏄緢鏈夊繀瑕佺殑銆傞氳繃瑙勮寖鐨勫伐紼嬮厤緗紝鎵鏈夊紑鍙戜漢鍛樹箣闂寸殑宸ョ▼鏄棤緙濊鎺ョ殑錛屽嵆浠諱綍涓涓紑鍙戜漢鍛樼殑宸ョ▼鎷垮埌鍏朵粬浜虹殑宸ョ▼鏃訛紝鏃犻』淇敼浠諱綍涓涓厤緗究鍙互涓嬈℃х殑緙栬瘧鎴愬姛銆傝繖鏍風殑瑙勮寖鎿嶄綔鏃犲紓鍙互澶уぇ鍑忓皯鍥㈤槦鎴愬憳閫氳繃浠g爜浜ゆ祦鏃剁殑涓嶅繀瑕佹垚鏈傚彟澶栵紝瑙勮寖鐨勫伐紼嬮厤緗篃渚夸簬SubVersion鐗堟湰鎺у埗緋葷粺鐨勫紩鍏ワ紝閫氳繃寮曞叆SubVersion鐗堟湰鎺у埗緋葷粺錛屽彲浠ュ崗璋冩暣涓爺鍙戝洟闃熺殑宸ョ▼榪涘害錛屾帶鍒朵駭鍝佺殑閲岀▼紕戝彂甯冦傝繖涓鍒囷紝閮戒粠瑙勮寖鐨勫伐紼嬮厤緗紑濮嬨?/p>
1. 銆奜penSource SubVersion瑙勮寖銆?/p>
2. 銆奦isual Studio 2005緙栫▼鎸囧崡銆?/p>
MyDevelopeFolder
鈹溾攢Bin
鈹?鈹溾攢Debug
鈹?鈹溾攢Program
鈹?鈹溾攢Release
鈹?鈹溾攢UnicodeDebug
鈹?鈹溾攢UnicodeProgram
鈹?鈹斺攢UnicodeRelease
鈹溾攢MySDK
鈹?鈹溾攢Include
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹斺攢Lib
鈹?鈹溾攢Debug
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹溾攢Program
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹溾攢Release
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹溾攢UnicodeDebug
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹溾攢UnicodeProgram
鈹?鈹?鈹溾攢BCG
鈹?鈹?鈹斺攢Boost
鈹?鈹斺攢UnicodeRelease
鈹?鈹溾攢BCG
鈹?鈹斺攢Boost
鈹溾攢Project
鈹?鈹溾攢LibMyExample
鈹?鈹?鈹斺攢Document
鈹?鈹斺攢MyExampleApp
鈹?鈹斺攢Document
鈹溾攢Solution
鈹斺攢Temp
鈹溾攢Compile
鈹斺攢Link
1. MyDevelopeFolder鏄紑鍙戝伐紼嬬殑鏍圭洰褰?/p>
2. Bin鐩綍瀛樻斁鎵鏈夊姩鎬侀摼鎺ュ簱鍜屽彲鎵ц紼嬪簭錛屽寘鎷嚜宸辯殑浜у嚭鍜岀涓夋柟搴擄紝鎸夌紪璇戦厤緗悕縐板寘鎷搴旂殑瀛愮洰褰曪紝濡侱ebug銆丷elease銆傚彟澶栵紝紼嬪簭榪愯榪囩▼涓渶瑕佸閮ㄧ殑鏁版嵁鏂囦歡鍜屽惎鍔ㄦ椂闇瑕佺殑閰嶇疆鏂囦歡絳夌瓑閮藉彲鏀句簬璇ョ洰褰?/p>
3. MySDK瀛樻斁浜у搧欏圭洰渚濊禆銆佷駭鍑?/strong>鐨?h鏂囦歡鍜?lib鏂囦歡銆傚叾涓璍ib鐩綍涓嬫牴鎹厤緗悕縐板拰絎笁鏂瑰簱鍚嶇О瀵筶ib鏂囦歡榪涜綆$悊銆傚鏌愰」鐩嬌鐢˙CG浣滀負鐣岄潰搴擄紝鍒橞CG鐨勫ご鏂囦歡鏀劇疆浜?#8220;Include\BCG”涓嬶紝涓嶅悓鐗堟湰鐨勫簱鏂囦歡緗簬“Lib\閰嶇疆鍚峔BCG”涓嬶紱欏圭洰杈撳嚭鐨刲ib鏂囦歡鐩存帴浣嶄簬“Lib\閰嶇疆鍚?#8221;涓嬨傝繖鏍蜂駭鍝佷緷璧栫殑涓嶅悓寮鍙戝簱鎵浣跨敤澶存枃浠朵笌搴撴枃浠跺拰杈撳嚭鐨勫ご鏂囦歡涓庡簱鏂囦歡鐩鎬簰涔嬮棿鏄嫭绔嬨佸郊姝や笉騫叉秹鐨勩?/p>
4. Project鏄伐紼嬬洰褰曪紝鐢ㄤ簬瀛樻斁浠g爜錛屾寜妯″潡鍚嶇粍緇囨綰х洰褰曘傚姛鑳藉簱宸ョ▼涓鑸殑浠?#8220;Lib”寮澶達紝浠ヤ究涓庡叾瀹冨姩鎬佸簱鍖哄埆銆傛瘡涓伐紼嬫ā鍧楃洰褰曞簲鍖呭惈“Document”瀛愮洰褰曪紝璇ョ洰褰曚笅鎸夐渶瑕佸鍔?#8220;DBM”銆?#8220;DOC”銆?#8220;UML”涓変釜瀛愮洰褰曘?#8220;DBM”鐢ㄤ簬瀛樻斁涓庤妯″潡鐩稿叧鐨勬暟鎹簱璁捐鏂囨。錛岄氬父鏄疨owerDesigner鏂囨。錛?#8220;DOC”鐢ㄤ簬瀛樻斁涓庤妯″潡鐩稿叧鐨勪竴鑸ц鏄庢枃妗o紱“UML”鐢ㄤ簬瀛樻斁涓庤妯″潡鐩稿叧鐨刄ML璁捐鏂囨。錛岄氬父鏄疪ational Rose鏂囨。銆?/p>
5. Solution鏄В鍐蟲柟妗堢洰褰曪紝鐢ㄤ簬瀛樻斁浜у搧鐨勫畬鏁磋В鍐蟲柟妗堛傞氬父浣跨敤瑙e喅鏂規鍙互鐢熸垚璇ヤ駭鍝佺殑鎵鏈夌増鏈?/p>
6. Temp鏄敤浜庣紪璇戠敓鎴愮殑涓棿鐩綍錛屼富瑕佸瓨鏀劇紪璇戣繃紼嬩腑鐢熸垚鐨勫悇縐嶄腑闂存枃浠躲?/p>
鏍規嵁璋冭瘯淇℃伅涓庡瓧絎﹂泦鐨勪笉鍚岋紝涓鑸殑宸ョ▼閰嶇疆鏈夊叚綾伙紝濡備笅琛ㄦ墍紺?
鍚嶇О 瀛楃闆?/p>
鏄惁鍖呭惈璋冭瘯淇℃伅 鏄惁鍖呭惈浠g爜浼樺寲 Debug ANSI YES NO Release ANSI YES YES Program ANSI NO YES UnicodeDebug UNICODE YES NO UnicodeRelease UNICODE YES YES UnicodeProgram UNICODE NO YES3.宸ョ▼閰嶇疆
杈撳嚭鐩綍錛?..\..\Temp\Link\$(ProjectName)\$(ConfigurationName)
涓棿鐩綍錛?.\..\Temp\Compile\$(ProjectName)\$(ConfigurationName)
濡傛灉闇瑕佸惎鍔ㄦ湰妯″潡榪涜璋冭瘯錛屽垯“鍛戒護”涓猴細..\..\Bin\$(ConfigurationName)\$(TargetFileName)
1) “闄勫姞鍖呭惈鐩綍”錛?.\..\MineSDK\Include 錛屽鏈夊叾瀹冪洰褰曡鐢?#8220;;”闂撮殧錛屾敞鎰忎嬌鐢ㄧ浉瀵硅礬寰勶紝涓ョ浣跨敤緇濆璺緞銆?/strong>
2) 鍔ㄦ佸簱浣跨敤瀵煎嚭瀹忓鍑?瀵煎叆鏃訛紝搴斿湪“棰勫鐞嗗櫒”涓畾涔夊鍑哄畯錛屼笉寰楀湪浠g爜鏂囦歡涓畾涔夈傚鍑哄畯鐨勪竴鑸牸寮忎負“LIB_XXXXX”銆?/p>
3) 涓鑸儏鍐典笅涓嶆帹鑽愪嬌鐢ㄩ緙栬瘧澶淬?/p>
1) “杈撳嚭鏂囦歡”錛?/p>
a) 鑻ヤ負Debug鐗堟椂錛?(OutDir)\$(ProjectName)D.dll錛?/p>
b) 鑻ヤ負Release鐗堟椂錛?(OutDir)\$(ProjectName).dll銆?/p>
2) “闄勫姞搴撶洰褰?#8221;錛?.\..\Bin\$(ConfigurationName);..\..\MySDK\Lib錛屽鏈夊叾瀹冪洰褰曡鐢?#8220;;”闂撮殧錛屾敞鎰忎嬌鐢ㄧ浉瀵硅礬寰勶紝涓ユ牸紱佹浣跨敤鏈湴緇濆璺緞銆?/p>
3) “妯″潡瀹氫箟鏂囦歡”錛氫竴鑸笉浣跨敤妯″潡瀹氫箟.def鏂囦歡錛屾湰欏瑰彲閫夋嫨“浠庨粯璁ら厤緗?#8230;”銆?/p>
涓鑸渶瑕侀厤緗殑鏄?#8220;鐢熸垚鍚庝簨浠?#8221;銆備換浣曚竴涓伐紼嬫ā鍧楃殑鐢熸垚鍚庝簨浠墮兘搴斿寘鎷互涓嬪唴瀹癸細
1) copy $(TargetPath) ..\..\Bin\$(ConfigurationName)
2) 鑻ユ湁瀵煎嚭鐨凩ib搴撴枃浠訛紝闇瑕佸鍔狅細copy $(TargetDir)$(TargetName).lib ..\..\MySDK\Lib
3) 鑻ユ湁瀵煎嚭鐨勫ご鏂囦歡錛岄渶瑕佸鍔狅細 copy myhead.h ..\..\MySDK\Include
鍏蜂綋鏂囦歡鍚嶄笌璺緞瑙嗘儏鍐佃屽畾錛屼絾鏄弗紱佷嬌鐢ㄧ粷瀵硅礬寰勩?/p>
|
ConfigurationName |
閰嶇疆鍚嶅瓧錛岄氬父鏄疍ebug鎴栬匯elease |
|
IntDir |
緙栬瘧鍣ㄤ嬌鐢ㄧ殑涓棿鐩綍錛屼駭鍑簅bj鏂囦歡 |
|
OutDir |
閾炬帴鍣ㄤ嬌鐢ㄧ殑杈撳嚭鐩綍 |
|
ProjectDir |
欏圭洰鐩綍 |
|
ProjectName |
欏圭洰鍚嶅瓧 |
|
SolutionDir |
瑙e喅鏂規鐩綍 |
|
TargetDir |
鐩爣杈撳嚭鏂囦歡鎵鍦ㄧ殑鐩綍 |
|
TargetExt |
鐩爣杈撳嚭鐨勬墿灞曞悕 |
|
TargetFileName |
鐩爣杈撳嚭鏂囦歡鍚嶏紝鍖呮嫭鎵╁睍鍚?/p> |
|
TargetName |
鐩爣杈撳嚭鍚嶏紝涓嶅寘鎷墿灞曞悕 |
|
TargetPath |
鐩爣杈撳嚭鏂囦歡鐨勫叏璺緞鍚?/p> |
posted on 2011-04-03 18:58 瑗塊棬鏈夋倲 闃呰(352) 璇勮(4) 緙栬緫 鏀惰棌 寮曠敤
緗戜笂鍏充簬榪欎釜闂璁ㄨ杈冨錛屼絾涔熶笉澶栦箮鍑犵鏂規硶銆傛葷粨涓涓嬶紝濡傞檮涓傞『渚夸簡瑙d竴涓猆AC銆?/span>
UAC錛屽叏縐癠ser Account Control錛堢敤鎴峰笎鎴鋒帶鍒訛級
System Safe Monitor錛堜富鏈哄叆渚甸槻寰$郴緇燂級
UAC鏄浣曞伐浣滅殑[3]
鎴戜滑鍙互綆鍗曠殑鎶奤AC褰撲綔鏉冮檺涓存椂閲嶅垎閰嶇殑宸ュ叿銆傚湪榛樿鎯呭喌涓嬶紝鎵鏈夌殑闈炵郴緇熸牳蹇冭繘紼嬮兘鍙嫢鏈夋爣鍑嗘潈闄愶紝榪欎竴鏉冮檺涓嶈兘瀵圭郴緇熷叧閿尯鍩熻繘琛屼慨鏀廣傚浜庝竴涓▼搴忥紝濡傛灉瀹冨綋涓惈鏈夋彁鏉冪敵璇鳳紝鍒欏湪榪愯鏃朵細寮瑰嚭UAC紿楀彛瑕佹眰鎻愭潈銆傚鏋滅敤鎴峰厑璁革紝鍒欑▼搴忔殏鏃舵х殑鑾峰緱浜嗘渶楂樻潈闄愶紝鍙互瀵圭郴緇熷叧閿尯鍩熻繘琛屾洿鏀癸紱濡傛灉鐢ㄦ埛鎷掔粷錛屽垯紼嬪簭琚嫆緇濇墽琛屻傝屽鏋滅▼搴忎腑娌℃湁鎻愭潈鐢寵錛屽垯緋葷粺浼氳紼嬪簭榪愯浜庢爣鍑嗘潈闄愪笅銆傚悓鏃訛紝瀵逛簬鎵鏈夌▼搴忥紝閮藉彲浠ョ敤“浠ョ鐞嗗憳韜喚榪愯”鐨勬柟寮忔墜鍔ㄦ彁鏉冦傝屽嵆渚跨梾姣掓劅鏌撲簡緋葷粺錛屽畠涔熷浜嶶AC鐨勭洃瑙嗕箣涓嬶紝榪欎嬌寰楃梾姣掔殑鍙嶆竻闄よ涓轟細鍙楀埌寰堝ぇ闃葷銆傛鏄嚟鍊熻繖涓鏈哄埗錛孶AC鎴愪負浜嗕竴閬撻噸瑕佺殑緋葷粺闃茬伀澧欍?/span>
鍦?Windows7錛圢T6.x緋葷粺錛変腑錛岀郴緇熷彇娑堜簡瀵圭Щ鍔ㄨ澶嘇utorun.inf鐨勬敮鎸?/span>銆?/span>
鐢ㄦ埛鐣岄潰鐗規潈闅旂[5]
鍦ㄦ棭鏈熺殑Windows鎿嶄綔緋葷粺涓紝鍦ㄥ悓涓鐢ㄦ埛涓嬭繍琛岀殑鎵鏈夎繘紼嬫湁鐫鐩稿悓鐨勫畨鍏ㄧ瓑綰э紝鎷ユ湁鐩稿悓鐨勬潈闄愩備緥濡傦紝涓涓繘紼嬪彲浠ヨ嚜鐢卞湴鍙戦佷竴涓猈indows娑堟伅鍒板彟澶栦竴涓繘紼嬬殑紿楀彛銆備粠Windows Vista寮濮嬶紝褰撶劧涔熷寘鎷琖indows 7錛屽浜庢煇浜沇indows娑堟伅錛岃繖涓鏂瑰紡鍐嶄篃琛屼笉閫氫簡銆傝繘紼?鎴栬呭叾浠栫殑瀵硅薄)寮濮嬫嫢鏈変竴涓柊鐨勫睘鎬р斺旂壒鏉冪瓑綰?Privilege Level)銆備竴涓壒鏉冪瓑綰ц緝浣庣殑榪涚▼涓嶅啀鍙互鍚戜竴涓壒鏉冪瓑綰ц緝楂樼殑榪涚▼鍙戦佹秷鎭紝铏界劧浠栦滑鍦ㄧ浉鍚岀殑鐢ㄦ埛鏉冮檺涓嬭繍琛屻傝繖灝辨槸鎵璋撶殑鐢ㄦ埛鐣岄潰鐗規潈闅旂 (User Interface Privilege Isolation錛孶IPI)銆?/span>
UIPI鐨勫紩鍏ワ紝鏈澶х殑鐩殑鏄槻姝㈡伓鎰忎唬鐮佸彂閫佹秷鎭粰閭d簺鎷ユ湁杈冮珮鏉冮檺鐨勭獥鍙d互瀵瑰叾榪涜鏀誨嚮錛屼粠鑰岃幏鍙栬緝楂樼殑鏉冮檺絳夌瓑銆?/span>
UIPI鐨勮繍琛屾満鍒?/span>
鍦╓indows 7涓紝褰揢AC(User Account Control)鍚敤鐨勬椂鍊欙紝UIPI鐨勮繍琛屽彲浠ュ緱鍒版渶鏄庢樉鐨勪綋鐜般傚湪UAC涓紝褰撲竴涓鐞嗗憳鐢ㄦ埛鐧誨綍緋葷粺鍚庯紝鎿嶄綔緋葷粺浼氬垱寤轟袱涓護鐗屽璞?Token Object)錛氱涓涓槸綆$悊鍛樹護鐗岋紝鎷ユ湁澶у鏁扮壒鏉?綾諱技浜嶹indows Vista涔嬪墠鐨凷ystem涓殑鐢ㄦ埛)錛岃岀浜屼釜鏄竴涓粡榪囪繃婊ゅ悗鐨勭畝鍖栫増鏈紝鍙嫢鏈夋櫘閫氱敤鎴風殑鏉冮檺銆?/span>
榛樿鎯呭喌涓嬶紝浠ユ櫘閫氱敤鎴鋒潈闄愬惎鍔ㄧ殑榪涚▼鎷ユ湁鏅氱壒鏉冪瓑綰?UIPI鐨勭瓑綰у垝鍒嗕負浣庣瓑綰?low)錛屾櫘閫?normal)錛岄珮絳夌駭(high)錛岀郴緇?(system))銆傚悓鏍風殑錛屼互綆$悊鍛樻潈闄愯繍琛岀殑榪涚▼錛屼緥濡傦紝鐢ㄦ埛鍙抽敭鍗曞嚮閫夋嫨“浠ョ鐞嗗憳韜喚榪愯”鎴栬呮槸閫氳繃娣誨姞“runas”鍙傛暟璋冪敤 ShellExecute榪愯鐨勮繘紼嬶紝榪欐牱鐨勮繘紼嬪氨鐩稿簲鍦版嫢鏈変竴涓緝楂?high)鐨勭壒鏉冪瓑綰с?/span>
榪欏皢瀵艱嚧緋葷粺浼氳繍琛屼袱縐嶄笉鍚岀被鍨嬶紝涓嶅悓鐗規潈絳夌駭鐨勮繘紼?褰撶劧錛屼粠鎶鏈笂璁茶繖涓や釜榪涚▼閮芥槸鍦ㄥ悓涓鐢ㄦ埛涓?銆傛垜浠彲浠ヤ嬌鐢╓indows Sysinternals宸ュ叿闆嗕腑鐨勮繘紼嬫祻瑙堝櫒(Process Explorer)鏌ョ湅鍚勪釜榪涚▼鐨勭壒鏉冪瓑綰с俒6]
鎵浠ワ紝褰撲綘鍙戠幇浣犵殑榪涚▼涔嬮棿Windows娑堟伅閫氫俊鍙戠敓闂鏃訛紝涓嶅Θ浣跨敤榪涚▼嫻忚鍣ㄦ煡鐪嬩竴涓嬩袱涓繘紼嬩箣闂存槸鍚︽湁鍚堥傜殑鐗規潈絳夌駭銆?/span>
UIPI鎵甯︽潵鐨勯檺鍒?/span>
姝e鎴戜滑鍓嶆枃鎵璇達紝絳夌駭鐨勫垝鍒嗭紝鏄負浜嗛槻姝互涓嬬姱涓娿傛墍浠ワ紝鏈変簡鐢ㄦ埛鐣岄潰鐗規潈闅旂錛屼竴涓繍琛屽湪杈冧綆鐗規潈絳夌駭鐨勫簲鐢ㄧ▼搴忕殑琛屼負灝卞彈鍒頒簡璇稿闄愬埗錛屽畠涓嶅彲浠ワ細
鈻?/span>楠岃瘉鐢辮緝楂樼壒鏉冪瓑綰ц繘紼嬪垱寤虹殑紿楀彛鍙ユ焺
鈻?/span>閫氳繃璋冪敤SendMessage鍜孭ostMessage鍚戠敱杈冮珮鐗規潈絳夌駭榪涚▼鍒涘緩鐨勭獥鍙?/span>鈻?/span>鍙戦乄indows娑堟伅
鈻?/span>浣跨敤綰跨▼閽╁瓙澶勭悊杈冮珮鐗規潈絳夌駭榪涚▼
鈻?/span>浣跨敤鏅氶挬瀛?SetWindowsHookEx)鐩戣杈冮珮鐗規潈絳夌駭榪涚▼
鈻?/span>鍚戜竴涓緝楂樼壒鏉冪瓑綰ц繘紼嬫墽琛孌LL娉ㄥ叆
浣嗘槸錛屼竴浜涚壒孌奧indows娑堟伅鏄璁哥殑銆傚洜涓鴻繖浜涙秷鎭榪涚▼鐨勫畨鍏ㄦф病鏈夊お澶у獎鍝嶃傝繖浜沇indows娑堟伅鍖呮嫭錛?/span>
0x000 - WM_NULL
0x003 - WM_MOVE
0x005 - WM_SIZE
0x00D - WM_GETTEXT
0x00E - WM_GETTEXTLENGTH
0x033 - WM_GETHOTKEY
0x07F - WM_GETICON
0x305 - WM_RENDERFORMAT
0x308 - WM_DRAWCLIPBOARD
0x30D - WM_CHANGECBCHAIN
0x31A - WM_THEMECHANGED
0x313, 0x31B (WM_???)
淇UIPI闂
鍩轟簬Windows Vista涔嬪墠鐨勬搷浣滅郴緇熻涓烘墍璁捐鐨勫簲鐢ㄧ▼搴忥紝鍙兘甯屾湜Windows娑堟伅鑳藉鍦ㄨ繘紼嬩箣闂磋嚜鐢辯殑浼犻掞紝浠ュ畬鎴愪竴浜涚壒孌婄殑宸ヤ綔銆傚綋榪欎簺搴旂敤紼嬪簭鍦?Windows 7涓婅繍琛屾椂錛屽洜涓篣IPI鏈哄埗錛岃繖縐嶆秷鎭紶閫掕闃繪柇浜嗭紝搴旂敤紼嬪簭灝變細閬囧埌鍏煎鎬ч棶棰樸備負浜嗚В鍐寵繖涓棶棰橈紝Windows Vista寮曞叆浜嗕竴涓柊鐨凙PI鍑芥暟ChangeWindowMessageFilter[7]銆傚埄鐢ㄨ繖涓嚱鏁幫紝鎴戜滑鍙互娣誨姞鎴栬呭垹闄よ兘澶熼氳繃鐗規潈絳夌駭闅旂鐨?Windows娑堟伅銆傝繖灝卞儚鎷ユ湁杈冮珮鐗規潈絳夌駭鐨勮繘紼嬶紝璁劇疆浜嗕竴涓繃婊ゅ櫒錛屽厑璁擱氳繃鐨刉indows娑堟伅閮借娣誨姞鍒拌繖涓繃婊ゅ櫒鐨勭櫧鍚嶅崟錛屽彧鏈夊湪榪欎釜鐧藉悕鍗曚笂鐨勬秷鎭墠鍏佽浼犻掕繘鏉ャ?/span>
濡傛灉鎴戜滑鎯沖璁鎬竴涓秷鎭彲浠ュ彂閫佺粰杈冮珮鐗規潈絳夌駭鐨勮繘紼嬶紝鎴戜滑鍙互鍦ㄨ緝楂樼壒鏉冪瓑綰х殑榪涚▼涓皟鐢–hangeWindowMessageFilter鍑芥暟錛屼互 MSGFLT_ADD浣滀負鍙傛暟灝嗘秷鎭坊鍔犺繘娑堟伅榪囨護鍣ㄧ殑鐧藉悕鍗曘傚悓鏍風殑錛屾垜浠篃鍙互浠SGFLT_REMOVE浣滀負鍙傛暟灝嗚繖涓秷鎭粠鐧藉悕鍗曚腑鍒犻櫎銆?/span>
涓涓ず渚?/span>
瀵逛簬緋葷粺娑堟伅鐨勫鐞嗭紝鎺ュ彈娑堟伅鐨勮繘紼嬮渶瑕佸皢璇ユ秷鎭姞鍏ュ埌鐧藉悕鍗曚腑錛屽彲浠ラ氳繃涓嬮潰鐨勪唬鐮佸疄鐜幫細
闇瑕佸湪楂樻潈闄愮▼搴忓紑濮嬬殑鍦版柟鍔犲叆浠ヤ笅浠g爜,鎸囧畾浠涔堟秷鎭彲浠ユ帴鍙?/span>

浠g爜
1 typedef BOOL (WINAPI *_ChangeWindowMessageFilter)( UINT , DWORD);
2
3 BOOL CVistaMsgRecvApp::AllowMeesageForVista(UINT uMessageID, BOOL bAllow)//娉ㄥ唽Vista鍏ㄥ眬娑堟伅
4 {
5 BOOL bResult = FALSE;
6 HMODULE hUserMod = NULL;
7 //vista and later
8 hUserMod = LoadLibrary( L"user32.dll" );
9 if( NULL == hUserMod )
10 {
11 return FALSE;
12 }
13 _ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
14 if( NULL == pChangeWindowMessageFilter )
15 {
16 AfxMessageBox(_T("create windowmessage filter failed"));
17 return FALSE;
18 }
19 bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
20 if( NULL != hUserMod )
21 {
22 FreeLibrary( hUserMod );
23 }
24 return bResult;
25 }
姝ゆ椂錛屼綆絳夌駭鐨勮繘紼嬪氨鍙互鍍忛珮絳夌駭鐨勮繘紼嬪彂閫佹秷鎭簡銆?/span> 闄?Win7涓嬪浣曡搴旂敤紼嬪簭浠ョ鐞嗗憳韜喚榪涜瀹夎鎵ц 1銆佹硶涓錛?/span> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc" 鎴戞劅瑙夎繖縐嶆柟娉曚笉闈犺氨銆?/span> 2銆佹硶浜岋細 閫氳繃manifest鏂囦歡浣縑C搴旂敤紼嬪簭鑾峰緱綆$悊鍛樻潈闄?/span> 榪欑鏂規硶榪樹笉閿橻1]銆?/span> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> 3銆佹硶涓夛細 璧峰悕涓簊etup錛寃in7浼氳嚜宸辨彁鍗囨潈闄愶紝澧炲姞manifest鏂囦歡銆傝繕鏈変竴縐嶆柟娉曟槸鏀規敞鍐岃〃銆侶KEY_CURRENT_USER\Software \Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 娣誨姞涓涓瓧絎︿覆鍊?鍚嶇О灝辨槸浣犵殑紼嬪簭鐨勮礬寰勫拰鍚嶅瓧錛屽間負RUNASADMIN銆?/span> 涔熷彲浠ュ仛鎴愭湇鍔°?/span> 4銆佸叾瀹冩柟娉曪細 榪樻湁鐨勭綉鍙嬭錛氭湁涓紑婧愮殑欏圭洰鍙仛RunAs錛屽氨鏄敤鏉ヤ互鎸囧畾鐢ㄦ埛鏉ヨ繍琛岀▼搴忕殑欏圭洰錛屽彲浠ュ弬鑰?/span> 鍙傝冪綉鍧鍜屾洿澶氶槄璇?/span> [1] http://hi.baidu.com/crowreturns/blog/item/f5e7cefd7546a284b801a07e.html [2] http://www.cnblogs.com/sun8134/archive/2009/10/30/1593025.html [3] 360 璁哄潧 [4] http://topic.csdn.net/u/20100203/14/d98d8310-4971-47d1-94b1-9cdfbf159b4f.html [5] http://blog.csdn.net/jinhill/archive/2010/07/21/5752870.aspx [6] Sysinternals Utilities Index http://technet.microsoft.com/en-us/sysinternals/bb545027.aspx [7] ChangeWindowMessageFilter http://msdn.microsoft.com/en-us/library/ms632675%28VS.85%29.aspx [ Using the ChangeWindowMessageFilter function is not recommended, as it has process-wide scope. Instead, use the ChangeWindowMessageFilterEx function to control access to specific windows as needed. ChangeWindowMessageFilter may not be supported in future versions of Windows.] 錛?錛絟ttp://it.chinawin.net/softwaredev/article-b6f9.html
1#define WM_MYNEWMESSAGE (WM_USER + 999)<BR>UINT uMsgBall=::RegisterWindowMessage (WM_MYNEWMESSAGE )<BR>if(!uMsgBall)<BR>return FALSE;<BR>
灝界浠ュ墠鎺ヨЕ榪囦竴涓婫DI+錛屼絾鍐沖績浠庣幇鍦ㄥ紑濮嬬郴緇熷涔燝DI+錛屾墍鐢ㄧ殑鏁欐潗涓恒婄簿閫欸DI緙栫▼銆嬨傚湪VS 2010浠ヤ笅鐗堟湰鐨刅S 緙栬瘧鍣ㄤ嬌鐢℅DI+閮介渶瑕佸GDI+鐜榪涜鍒濆鍖栨搷浣滐紙VS 2010涓殑MFC 10渚濊禆GDI+錛屾晠涓嶇敤鍒濆鍖栵級銆?
VS 2003銆乂S 2005鍜孷S 2008鐨凣DI+鐜鍒濆鍖栨搷浣滄楠や竴鏍楓?
鍦ㄥ簲鐢ㄧ▼搴忕被娣誨姞涓涓繚鎶ゆ潈闄愮殑鏁版嵁鎴愬憳錛?
view plaincopy to clipboardprint?
ULONG_PTR m_gdiplusToken;
ULONG_PTR m_gdiplusToken;
鍦ㄥ簲鐢ㄧ▼搴忕被鐨勫疄鐜版枃浠跺寘鍚玤di+鐨勫ご鏂囦歡錛?
view plaincopy to clipboardprint?
#include <GdiPlus.h>
#include <GdiPlus.h>
鍦ㄥ伐紼嬮檮鍔犲簱鍔犱笂錛欸diPlus.lib
鐒跺悗鍦ㄥ簲鐢ㄧ▼搴忕被鐨処nitInstance鍔犱笂涓嬮潰鍒濆鍖栦唬鐮侊細
view plaincopy to clipboardprint?
BOOL C***App::InitInstance()
{
Gdiplus::GdiplusStartupInput StartupInput;
GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);
}
BOOL C***App::InitInstance()
{
Gdiplus::GdiplusStartupInput StartupInput;
GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);
}
涓婇潰浠g爜鐨勪綔鐢ㄦ槸鍒濆鍖朑DI+璧勬簮銆?
鍦ㄥ簲鐢ㄧ▼搴忕被鐨処nitInstance鍔犱笂涓嬮潰浠g爜錛?
view plaincopy to clipboardprint?
int C***App::ExitInstance()
{
// TODO: 鍦ㄦ娣誨姞涓撶敤浠g爜鍜?鎴栬皟鐢ㄥ熀綾?nbsp;
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return __super::ExitInstance();
}
int C***App::ExitInstance()
{
// TODO: 鍦ㄦ娣誨姞涓撶敤浠g爜鍜?鎴栬皟鐢ㄥ熀綾?br>
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return __super::ExitInstance();
}
涓婇潰浠g爜鐨勪綔鐢ㄦ槸閿姣丟DI+璧勬簮銆?
VC 6.0涓嬌鐢℅DI+搴擄紝璇峰弬鑰冭繖綃囨枃绔狅細鍦╒C6.0涓嬌鐢℅DI+鐨勪袱縐嶅姙娉?
鐜板湪嫻嬭瘯涓涓嬫垜浠垵濮嬪寲GDI+鐜鏄惁鎴愬姛銆傛垜浠嬌鐢℅DI+鐨勭被鎺ュ彛鍦ㄨ鍥懼鎴峰尯緇樺埗涓涓瓧絎︿覆錛屽叿浣撲唬鐮佸涓嬶細
view plaincopy to clipboardprint?
CDC *pDC = pView->GetDC();
Gdiplus::Graphics graphics(pDC->m_hDC);
Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255));
Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255));
Gdiplus::FontFamily fontfm(L"瀹嬩綋");
Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel);
CRect rt;
pView->GetClientRect(&rt);
Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);
graphics.DrawString(L"GDI+紼嬪簭紺烘剰",-1,&font,pointF,&brush);
graphics.ReleaseHDC(pDC->m_hDC);
pView->ReleaseDC(pDC);
CDC *pDC = pView->GetDC();
Gdiplus::Graphics graphics(pDC->m_hDC);
Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255));
Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255));
Gdiplus::FontFamily fontfm(L"瀹嬩綋");
Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel);
CRect rt;
pView->GetClientRect(&rt);
Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);
graphics.DrawString(L"GDI+紼嬪簭紺烘剰",-1,&font,pointF,&brush);
graphics.ReleaseHDC(pDC->m_hDC);
pView->ReleaseDC(pDC);
鏁堟灉鍥懼涓嬶細
浣跨敤GDI+涓浜涙敞鎰忎簨欏癸細
1.鍦―LL涓嬌鐢℅DI+搴擄紝鍙渶瑕佸寘鍚獹diPlus.h鍜孏diPlus.lib錛屽垵濮嬪寲GDI+鐜鐨勫伐浣滃彧闇瑕佸湪涓昏皟鐢ㄧ▼搴忓仛錛屽惁鍒欏湪DLL鍒濆鍖栦唬鐮佷腑鍒濆鍖朑DI+鐜瀹規槗鍙戠敓DLL閲嶅叆鐨勯敊璇紙浠ュ墠鎴戠姱榪囪繖鏍風殑閿欒錛夈?
2.GDI+鎺ュ彛鍙傛暟浣跨敤鐨勬槸unicode瀛楃闆嗭紝鍥犱負璋冪敤浠諱綍GDI+綾繪帴鍙f椂鍏跺瓧絎︿覆鍙傛暟閮藉繀欏葷‘淇濇槸unicode瀛楃銆傚湪澶氬瓧鑺傚瓧絎﹂泦鐜涓嬪紑鍙戝父閲忓瓧絎︿覆鍙互閫氳繃L瀹忚漿鎹?鍙橀噺澶氬瓧鑺傚瓧絎﹁漿unicode瀛楃鍙互浣跨敤Windows API鍑芥暟MultiByteToWideChar鎴朅TL鐨凙2W瀹忋?
3. GDI+鐨勫璞″拰GDI鍙ユ焺涓鏍鳳紝鍚屾牱浼氬崰鐢ㄨ祫婧愶紝涓嬈′嬌鐢ㄨ繃澶氱殑GDI+鐨勫璞$敋鑷充細鍙戠敓紼嬪簭宕╂簝鐨勭幇璞°傚洜姝ゅ繀欏婚殢鏃跺皢涓嶅繀瑕佺殑GDI+鐨勫璞″崰鐢ㄧ殑璧勬簮閲婃斁鎺夛紝濡備笂渚嬬殑錛歡raphics.ReleaseHDC(pDC->m_hDC)銆?
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/clever101/archive/2010/12/08/6063670.aspx
浣滆咃細鏈遍噾鐏?br>鏉ユ簮錛?a >http://blog.csdn.net/clever101/
鎴戝彂鐜頒嬌鐢℅DI+鏉ュ埗浣滅敾鍥懼伐鍏風殑璋冭壊鏉挎瀬涓烘柟渚匡紙榪欎釜宸ヤ綔濡傛灉璁〨DI鏉ュ仛涓嶇煡瑕佸啓澶氬皯浠g爜錛夈備笅闈㈡垜浠涔犱竴涓婫DI+鐨勭嚎鎬ф笎鍙樼敾鍒鳳細LinearGradientBrush綾葷殑鐢ㄦ硶錛屽叿浣撲唬鐮佸涓嬶細
view plaincopy to clipboardprint?
CDC *pDC = pView->GetDC();
// 瀹氫箟涓涓敾鍥懼璞?nbsp;
Gdiplus::Graphics graphics(pDC->m_hDC);
// 鑾峰彇瑙嗗浘瀹㈡埛鍖哄ぇ灝?nbsp;
CRect rt;
pView->GetClientRect(&rt);
// 瀹氫箟涓涓嚎鎬ф笎鍙樼敾鍒鳳紝鎸夌孩榛勮摑緇跨殑欏哄簭鍥涚棰滆壊娓愬彉
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,0,255));
Color colors[] = {
Color(255, 255, 0, 0), // red
Color(255, 255, 255, 0), //yellow
Color(255, 0, 0, 255), // blue
Color(255, 0, 255, 0)}; // green
REAL positions[] = {
0.0f,
0.33f,
0.66f,
1.0f};
linGrBrush.SetInterpolationColors(colors, positions,4);
// 濉厖鎸囧畾鍖哄煙鐭╁艦
graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/2);
CDC *pDC = pView->GetDC();
// 瀹氫箟涓涓敾鍥懼璞?br> Gdiplus::Graphics graphics(pDC->m_hDC);
// 鑾峰彇瑙嗗浘瀹㈡埛鍖哄ぇ灝?br> CRect rt;
pView->GetClientRect(&rt);
// 瀹氫箟涓涓嚎鎬ф笎鍙樼敾鍒鳳紝鎸夌孩榛勮摑緇跨殑欏哄簭鍥涚棰滆壊娓愬彉
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,0,255));
Color colors[] = {
Color(255, 255, 0, 0), // red
Color(255, 255, 255, 0), //yellow
Color(255, 0, 0, 255), // blue
Color(255, 0, 255, 0)}; // green
REAL positions[] = {
0.0f,
0.33f,
0.66f,
1.0f};
linGrBrush.SetInterpolationColors(colors, positions,4);
// 濉厖鎸囧畾鍖哄煙鐭╁艦
graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/2);
鏁堟灉濡備笅錛?
榪欎釜綰挎ф笎鍙樼敾鍒峰緢綆鍗曪紝灝辨槸鎸夊瀭鐩存柟鍚戯紙鍗硑杞存柟鍚戯級娓愬彉鐨勩傛垜鎰熷叴瓚g殑鏄敾鍒風殑涓や釜鍙傛暟Point(100,0),Point(100,rt.Height()/2)錛屼功涓婁粙緇嶇殑璧風偣鐨勯鑹插拰緇堢偣棰滆壊鐨勪綅緗拰瑕佸~鍏呯殑鐭╁艦涔嬮棿鐨勫叧緋繪槸鎬庢牱鐨勶紵鎴戜滑鐪嬪埌涓婇潰鐨勭敾鍒風殑璧風偣鍜岀粓鐐圭殑楂樺害鍜岃濉厖鐨勭煩褰㈢殑楂樺害鏄竴鏍風殑錛岄兘鏄痳t.Height()/2銆傛垜浠妸鐢誨埛鐨勯珮搴︾緝灝忎負鍘熸潵鐨勪竴鑸紝鐪嬬湅鏈変粈涔堟晥鏋滐紝鍗沖畾涔変負錛?
view plaincopy to clipboardprint?
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/4),Color(255,255,0,0),Color(255,0,0,255));
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/4),Color(255,255,0,0),Color(255,0,0,255));
鏁堟灉鍥懼涓嬶細
鎴戜滑鍙戠幇涓婂浘絳変簬榪炵畫鐢ㄤ袱涓敾鍒峰~鍏呰繖涓煩褰€傚亣濡傚~鍏呯殑鐩爣鐭╁艦鐨勯珮搴﹀皬浜庣敾鍒風殑楂樺害錛屽張浼氭槸鎬庢牱鐨勬晥鏋滃憿錛熶唬鐮佹敼涓猴細
view plaincopy to clipboardprint?
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,255,0));
Color colors[] = {
Color(255, 255, 0, 0), // red
Color(255, 255, 255, 0), //yellow
Color(255, 0, 0, 255), // blue
Color(255, 0, 255, 0)}; // green
REAL positions[] = {
0.0f,
0.33f,
0.66f,
1.0f};
linGrBrush.SetInterpolationColors(colors, positions,4);
// 濉厖鎸囧畾鍖哄煙鐭╁艦
graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/4);
LinearGradientBrush linGrBrush(Point(100,0),Point(100,rt.Height()/2),Color(255,255,0,0),Color(255,0,255,0));
Color colors[] = {
Color(255, 255, 0, 0), // red
Color(255, 255, 255, 0), //yellow
Color(255, 0, 0, 255), // blue
Color(255, 0, 255, 0)}; // green
REAL positions[] = {
0.0f,
0.33f,
0.66f,
1.0f};
linGrBrush.SetInterpolationColors(colors, positions,4);
// 濉厖鎸囧畾鍖哄煙鐭╁艦
graphics.FillRectangle(&linGrBrush,rt.Width()/2,0,80,rt.Height()/4);
鏁堟灉鍥懼涓嬶細
鎴戜滑鐪嬪埌榪欐椂鐭╁艦鍖哄煙鐨勫~鍏呭彧浣跨敤浜嗙敾鍒風殑涓閮ㄥ垎銆傝繖鏃舵垨璁告垜浠彲浠ュ緱鍑轟竴涓畝鍗曠殑緇撹錛氱敤鐢誨埛濉厖澶氳竟褰㈠尯鍩燂紝鏈夌偣綾諱技浜庨摵鍦扮爾錛屽湴鐮栧ソ姣旂敾鍒鳳紝絀哄湴濂芥瘮瑕佸~鍏呯殑鍖哄煙鍖哄煙銆?
鎬濊冮錛?
綰挎ф笎鍙樼敾鍒風殑璧風偣鍜岀粓鐐圭殑鍧愭爣鍊煎拰瑕佸~鍏呯殑鐭╁艦涔嬮棿鏄粈涔堝叧緋伙紵
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/clever101/archive/2010/12/08/6063697.aspx
鎺т歡閫氱煡鏍煎紡
鎺т歡閫氱煡緇忓巻浜嗕竴涓紨鍙樿繃紼嬶紝鍥犺?span>SendMessage( )鐨勫彉閲?span>Message銆?span>wParam鍜?span>lParam鏈変笁縐嶆牸寮忋?span>
絎竴鎺т歡閫氱煡鏍煎紡
絎竴鎺т歡閫氱煡鏍煎紡鍙槸紿楀彛娑堟伅鐨勫瓙闆嗐傚畠鐨勭壒寰佹牸寮忓涓嬶細WM_XXXX銆傚畠涓昏鏉ヨ嚜涓嬮潰鐨?span>3縐嶆秷鎭被鍨嬶細
(1)琛ㄧず涓涓帶浠剁獥鍙h涔堝凡緇忚鍒涘緩鎴栭攢姣侊紝瑕佷箞宸茬粡琚紶鏍囧崟鍑葷殑娑堟伅錛?span>WM_PARENTNOTIFY錛?span>
(2)鍙戦佸埌鐖剁獥鍙o紝鐢ㄦ潵緇樺埗鑷韓紿楀彛鐨勬秷鎭紝渚嬪錛?span> WM_CTLCOLOR銆?span>WM_DRAWITEM銆?span>WM_MEASUREITEM銆?span>WM_DELETEITEM銆?span>WM_CHARTOITEM銆?span>WM_VKTOITEM銆?span>WM_COMMAND鍜?span>WM_COMPAREITEM
(3)鏈夋粴鍔ㄨ皟鎺т歡鍙戦侊紝閫氱煡鐖剁獥鍙f粴鍔ㄧ獥鍙g殑娑堟伅錛?span>WM_VSCROLL鍜?span>WM_HSCROLL
絎簩鎺т歡閫氱煡鏍煎紡
絎簩鎺т歡閫氱煡鏍煎紡涓庡懡浠ゆ秷鎭叡浜紝瀹冪殑鐗瑰緛鏍煎紡濡備笅錛?span>WM_COMMAND銆?span>
鍦?span>WM_COMMAND涓紝lParam鐢ㄦ潵鍖哄垎鏄懡浠ゆ秷鎭繕鏄帶浠墮氱煡娑堟伅錛氬鏋?span>lParam涓?span>NULL錛屽垯榪欐槸涓懡浠ゆ秷鎭紝鍚﹀垯lParam閲岄潰鏀劇殑蹇呯劧灝辨槸鎺т歡鐨勫彞鏌勶紝鏄竴涓帶浠墮氱煡娑堟伅銆?span>瀵逛簬wParam鍒欐槸浣庝綅鏀劇殑鏄帶浠?span>ID錛岄珮浣嶆斁鐨勬槸鐩稿簲鐨勬秷鎭簨浠躲?span>
絎笁鎺т歡閫氱煡鏍煎紡
榪欎釜鎵嶇湡姝f秹鍙婂埌鎴戜滑瑕佽鐨勫唴瀹癸紝鍚屾椂浠栦篃鏄渶涓虹伒媧葷殑涓縐嶆牸寮忋傚畠鐨勭壒寰佹牸寮忓涓嬶細WM_NOTIFY銆?span>
鍦?span>WM_NOTIFY涓紝lParam涓斁鐨勬槸涓涓О涓?a name=baidusnap0>NMHDR緇撴瀯鐨勬寚閽堛傚湪wParam涓斁鐨勫垯鏄帶浠剁殑ID銆?/span>
NMHDR緇撴瀯鐨勭敱鏉?/span>
NMHDR緇撴瀯鏄緢鍊煎緱涓鎻愮殑錛岃緇撴瀯鍖呮嫭鏈夊叧鍒朵綔璇ラ氱煡鐨勬帶浠剁殑浠諱綍鍐呭錛岃屼笉鍙楃┖闂村拰綾誨瀷鐨勯檺鍒訛紝浠栫殑鏉ュ巻涔熸槸寰堟湁鎰忔濈殑銆?span>
鍦ㄦ渶鍒濈殑windows3.x涓紝鏍規湰灝變笉瀛樺湪浠涔?span>WM_NOTIFY錛屾帶浠墮氱煡瀹冧滑鐖剁獥鍙o紝濡傞紶鏍囩偣鍑?span>,鎺т歡鑳屾櫙緇樺埗浜嬩歡錛岄氳繃鍙戦佷竴涓秷鎭埌鐖剁獥鍙c傜畝鍗曠殑閫氱煡浠呭彂閫佷竴涓?span>WM_COMMAND娑堟伅錛屽寘鍚竴涓氱煡鐮佸拰涓涓湪wParam涓殑鎺т歡ID鍙婁竴涓湪lPraram涓殑鎺т歡鍙ユ焺銆傝繖鏍蜂竴鏉ワ紝wParam鍜?span>lParam灝遍兘琚~鍏呬簡錛屾病鏈夐澶栫殑絀洪棿鏉ヤ紶閫掍竴浜涘叾瀹冪殑娑堟伅錛屼緥濡傞紶鏍囨寜涓嬬殑浣嶇疆鍜屾椂闂淬?span>
涓轟簡鍏嬫湇榪欎釜鍥伴毦錛?span>windows3.x灝辨彁鍑轟簡涓涓瘮杈冧綆綰х殑瑙e喅絳栫暐錛岄偅灝辨槸緇欎竴浜涙秷鎭坊鍔犱竴浜涢檮鍔犳秷鎭紝鏈涓烘槑鏄劇殑灝辨槸鎺т歡鑷敾鐢ㄥ埌鐨?span>DRAWITEMSTRUCT銆備笉鐭ラ亾澶у瀵硅繖涓粨鏋勭啛鎮変笉錛屼笉榪囷紝濡傛灉浣犳槸鑰佹墜錛屼綘搴旇闈炲父娓呮榪欎釜緇撴瀯錛岃繖涓粨鏋勫寘鍚簡9涓唴瀹癸紝鍑犱箮浣犻渶瑕佹帶鍒剁殑淇℃伅閮界粰浣犳彁渚涗簡銆備負浠涔堣瀹冩瘮杈冧綆綰у憿錛熷洜涓轟笉鍚岀殑娑堟伅闄勫姞鐨勫唴瀹逛笉鍚岋紝緇撴灉灝辨槸涓鐩樻暎娌欙紝闈炲父娣蜂貢銆?span>
鍦?span>win32涓紝MS鍙堟彁鍑轟簡涓涓洿濂界殑瑙e喅鏂規錛氬紩榪?strong>NMHDR緇撴瀯銆傝繖涓粨鏋勭殑寮曡繘灝辨槸娑堟伅緇熶竴璧鋒潵錛屽埄鐢ㄥ畠鍙互浼犻掑鏉傜殑淇℃伅銆傝繖涓粨鏋勭殑甯冨眬濡備笅錛?span>
NMHDR
{
HWnd hWndFrom ; 鐩稿綋浜庡師WM_COMMAND浼犻掓柟寮忕殑lParam
UINT idFrom ; 鐩稿綋浜庡師WM_COMMAND浼犻掓柟寮忕殑wParam錛?span>low-order錛?span>
UINT code ; 鐩稿綋浜庡師WM_COMMAND浼犻掓柟寮忕殑Notify Code(wParam"s high-order)
}錛?span>
瀵逛簬榪欎釜緇撴瀯鐨勫簲鐢ㄤ簬WM_NOTIFY淇℃伅緇撴瀯錛岀粨鏋?span>WM_NOTIFY灝卞彉鎴愪簡錛?span>
A銆佹棤闄勫姞淇℃伅銆傜粨鏋勫彉寰楀緢綆鍗曪紝灝辨槸涓涓?strong>NMHDR緇撴瀯銆?span>
B銆佹湁闄勫姞淇℃伅銆傚畾涔変竴涓ぇ鐨勭粨鏋勶紝瀹冪殑絎竴涓厓绱犲氨鏄?strong>NMHDR緇撴瀯錛屽畠鐨勫悗闈㈡斁緗檮鍔犱俊鎭?span>
WM_NOTIFY緇撴瀯鐨勫ソ澶?/span>
闄や簡涓婇潰鎴戜滑鎵璇寸殑濂藉澶栵紝WN_NOTIFY榪樻湁鑷繁鐨勭嫭鐗圭殑濂藉錛?span>
鐢變簬鍦ㄥぇ緇撴瀯涓紝絎竴涓垚鍛樹負NMHDR,榪欐牱涓鏉ワ紝鎴戜滑灝卞彲浠ュ埄鐢ㄦ寚鍚?strong>NMHDR鐨勬寚閽堟潵浼犻掔粨鏋勫湴鍧錛屾牴鎹寚閽堢殑鐗規э紝鏃犺娑堟伅鏈夋病鏈夐檮鍔犱俊鎭紝榪欎釜鎸囬拡閮介傜敤錛屼篃鑳藉寰堟柟渚跨殑榪涜寮哄埗杞崲銆?/span>
鍒嗘瀽ON_NOTIFY
銆 綾誨悜瀵煎彲浠ュ垱寤?span>ON_NOTIFY娑堟伅鏄犲皠鍏ュ彛騫舵彁渚涗竴涓鐞嗗嚱鏁扮殑妗嗘灦錛屾潵澶勭悊 WM_NOTIFY綾誨瀷鐨勬秷鎭?span>ON_NOTIFY娑堟伅鏄犲皠瀹忔湁濡備笅璇硶.
銆銆銆ON_NOTIFY(wNotifyCode,id,memberFxn)
銆銆鍏朵腑錛?span>wNotifyCode:瑕佸鐞嗙殑閫氱煡娑堟伅閫氱煡鐮併傛瘮濡備笂闈㈡垜浠彁鍒扮殑LVN_KEYDOWN錛?span>Id:鎺т歡鏍囪瘑ID錛?span>MemberFxn:澶勭悊姝ゆ秷鎭殑鎴愬憳鍑芥暟銆?span>
銆銆姝ゆ垚鍛樺嚱鏁版湁濡備笅鐨勫師鍨嬪0鏄?span>:
銆銆銆afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result);
銆銆姣斿:鍋囪浣犳兂鎴愬憳鍑芥暟OnKeydownList1澶勭悊ClistCtrl(鏍囪瘑ID=IDC_LIST1錛夌殑 LVN_KEYDOWN娑堟伅,浣犲彲浠ヤ嬌鐢ㄧ被鍚戝娣誨姞濡備笅鐨勬秷鎭槧灝?span>:
銆銆銆ON_NOTIFY( LVN_KEYDOWN, IDC_LIST1, OnKeydownList1 )
銆銆鍦ㄤ笂闈㈢殑渚嬪瓙涓?span>,綾誨悜瀵兼彁渚涘涓嬪嚱鏁?span>:
銆銆銆void CMessageReflectionDlg::OnKeydownList1(NMHDR* pNMHDR, LRESULT* pResult)
銆銆銆銆{
銆銆銆銆銆LV_KEYDOWN* pLVKey= (LV_KEYDOWN*)pNMHDR;
銆銆銆銆銆*pResult = 0;
銆銆銆銆 }
銆銆榪欐椂綾誨悜瀵兼彁渚涗簡涓涓傚綋綾誨瀷鐨勬寚閽堬紝浣犳棦鍙互閫氳繃pNMHDR錛屼篃鍙互閫氳繃 pLVKey鏉ヨ闂繖涓氱煡緇撴瀯銆?/span>
ON_NOTIFY_RANGE
銆銆鏈夋椂鎴戜滑鍙兘闇瑕佷負涓緇勬帶浠跺鐞嗙浉鍚岀殑WM_NOTIFY娑堟伅銆傝繖鏃墮渶瑕佷嬌鐢?span>ON_NOTIFY_RANGE鑰屼笉鏄?span>ON_NOTIFY銆備笉榪囷紝寰堜笉騫哥殑鏄紝VC6鐨?span>ClassWizard騫朵笉鏀寔榪欎釜娑堟伅錛屾墍浠ユ垜浠繀欏繪墜宸ユ坊鍔犮傛柟娉曞拰涓鑸殑鎵嬪伐娣誨姞鐨勬秷鎭竴鏍鳳紝涓嶈繃闇瑕佹敞鎰忕殑鏄細
(1)褰撲綘浣跨敤 ON_NOTIFY_RANGE鏃?span>,浣犻渶瑕佹寚瀹氭帶浠剁殑ID鑼冨洿.鍏舵秷鎭槧灝勫叆鍙e強鍑芥暟鍘熷瀷濡備笅:
銆銆銆 ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )
銆銆銆銆鍏朵腑錛?span>wNotifyCode:娑堟伅閫氱煡鐮?span>.姣斿:LVN_KEYDOWN銆?span>id: 絎竴鎺т歡鐨勬爣璇?span>ID銆?span>
銆銆銆銆銆idLast:鏈鍚庝竴涓帶浠剁殑鏍囪瘑ID銆傦紙鏍囪瘑鍊間竴瀹氳榪炵畫錛?span>memberFxn: 娑堟伅澶勭悊鍑芥暟銆?span>
銆銆(2)鎴愬憳鍑芥暟蹇呴』鏈夊涓嬪師鍨嬬敵鏄庯細afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );
緇撴潫璇細
WM_NOTIFY鏄竴涓緢鍊煎緱鎬濊冪殑緇撴瀯錛屽彟澶栦粬鍜?span>Reflect Message鑱旂郴闈炲父绱у瘑錛屾垜浠帴涓嬫潵灝辮璁ㄨ涓涓嬪弽灝勬秷鎭?/span>