锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鏈変簡freetype瀹炵幇搴曞眰瀛椾綋娓叉煋錛屾垜鍙渶瑕佸鐞嗕竴浜涘竷灞鏂規(guī)硶鍗沖彲錛屽叾涓瀹炵幇鐨勬湁浠ヤ笅鍑犵偣錛?br />
1銆佽嫳銆佷腑瀛椾綋
寰堝涓枃瀛椾綋涓殑鑻辨枃瀛椾綋閮芥瘮杈冮毦鐪嬶紝鎵浠ュ湪X鐨勫瓧浣撻厤緗腑璁劇疆浜嗕竴涓瓧浣撻『搴忋傛垜涔熷彲浠ュ瀛︼紝浼犻掍竴涓瓧浣撳垪琛紝鎷垮埌涓涓瓧絎︽椂錛屾寜欏哄簭浠庡瓧浣撳垪琛ㄤ腑鏌ヨ錛屾煡璇笉鍒版椂灝辨煡涓嬩竴涓瓧浣擄紝榪欐牱灝卞彲浠ュ疄鐜拌嫳銆佷腑浣跨敤涓嶅悓瀛椾綋浜嗐?br />
2銆佸垎琛?br />孌佃惤鍒嗚瑕佽冭檻鍒頒腑銆佽嫳鏂囦笉鍚岀殑鍒嗗壊鏂瑰紡錛岃繕鏈夋爣鐐圭鍙鳳紝鏌愬紩璧鋒爣鐐圭鍙蜂笉鑳藉湪琛屽熬錛堟瘮濡傗?lt;絳夛級錛屾煇浜涙爣鐐逛笉鑳藉湪琛岄錛堟瘮濡傗?gt;錛夛紝鏌愪簺鏍囩偣涓嶈兘鍒嗗壊錛堟瘮濡傜牬鎶樺彿錛夛紝鎵浠ュ疄闄呬笂瑕佹湁涓涓垎鍓茬畻娉曪紝鎶婃钀藉垎鎴愪竴涓釜鐨勬爣璁幫紝姹夊瓧鐩存帴鍒嗗壊錛岃嫳鏂囨寜絀烘牸鍒嗗壊錛屼笉鑳藉湪琛岄鐨勬爣鐐瑰氨鍒嗗埌鍓嶉潰鍗曡瘝閲岋紝涓嶈兘鍦ㄨ灝劇殑灝卞垎鍦ㄥ悗闈㈢殑鍗曡瘝閲屻?br />
3銆佸榻?br />瀵歸綈鏂瑰紡鏈夊乏銆佷腑銆佸彸銆佷袱绔?Full Justification)榪欏嚑縐嶆柟寮忥紝鐩墠澶ч儴鍒嗗紑婧愭覆鏌撳簱閮戒笉鏀寔涓ょ瀵歸綈錛岃繖涔熸槸鎴戣鑷繁瀹炵幇鐨勪富瑕佸師鍥犮傚乏銆佷腑銆佸彸鍙璁$畻鍑轟竴琛岀殑鎵鏈夊瓧絎﹀搴︼紝鍐嶈綆楀嚭宸﹁竟璺濆嵆鍙備袱绔榻愬垯闇瑕佽綆楁瘡涓崟璇嶇殑闂磋窛銆?br />
4銆佹棣栫緝榪?br />
鍘熸潵璁炬兂鍦ㄥ垎孌靛悗鐩存帴鍔犱笂鍏ㄨ絀烘牸錛屼笉鎯寵繖涓┖鏍煎湪杞垚UNICODE緙栫爜鏃訛紝瀹冪殑緙栫爜鏄痋u0000錛屼笉鑳借幏鍙栧埌鍏ㄨ絀烘牸鐨勫搴︺備簬鏄妸瀹冭鎴愬瓧浣撻珮搴︼紝鐪嬩簡涓涓嬫晥鏋滆繕濂姐?br />
]]>
涓銆乮magemagick:
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/
鍙互緇樺埗鏂囧瓧錛屼笉榪囦腑鏂囧ソ鍍忎笉鑳借嚜鍔ㄦ柇琛屻?br />
浜屻乿ips
http://vips.sourceforge.net
浣跨敤pango緇樺埗鏂囧瓧錛屼腑鏂囧彲浠ユ柇琛岋紝緙哄皯2绔榻愬姛鑳姐傝嚜宸變慨鏀逛唬鐮佸鍔犱簡璋冩暣琛岃窛鍔熻兘錛屽仛鎴恟uby鎵╁睍搴擄紝amd64涓婁嬌鐢ㄥけ璐ワ紝鍘熷洜寰呮煡銆?br />
涓夈乫reetype
http://vips.sourceforge.net
涓嶄緷璧栧叾瀹冨浘褰?紿楀彛搴擄紝鍏跺畠涓嶇啛鎮(zhèn)夛紝寰呮煡銆?br />
鍥涖丟raphite
璺ㄥ鉤鍙扮殑瀛椾綋娓叉煋搴撱傚緟鏌ャ?br />
鎼滃宸叉湁鏁版湀錛岀洰鍓嶇湅鍒扮殑鍑犱釜搴撻兘涓嶅お鐞嗘兂錛宮ac osx涓婂彲鑳芥瘮杈冧笓涓氾紝涓嶈繃闆嗘垚杈冨洶闅俱?br />
鑻規(guī)灉緗戠珯涓婄殑姣旇緝瀹屾暣鐨勫瓧浣撶粯鍒跺拰甯冨眬鏂歸潰鐨勮祫鏂欙細(xì)
http://developer.apple.com/documentation/Carbon/Conceptual/ATSUI_Concepts/index.html
鍏朵腑甯冨眬鏂歸潰鐨勪笓涓氱煡璇嗭細(xì)
http://developer.apple.com/documentation/Carbon/Conceptual/ATSUI_Concepts/atsui_chap3/chapter_3_section_3.html#//apple_ref/doc/uid/TP30000029-TPXREF157
鍏跺畠璧勬枡錛?br />
]]>
鎴戦亣鍒扮殑涓涓棶棰樻槸錛屽綋浣跨敤Ajax鏇存柊欏甸潰灞閮ㄥ唴瀹規(guī)椂錛宻ession鍐呭宸茬粡榪囨湡錛岃繖鏃墮渶瑕佹暣涓〉闈㈣煩杞埌鐧誨綍欏甸潰銆?br />
鐩存帴璋冪敤redirect_to浼?xì)鋴慑眬閮ㄥ唴瀹規(guī)樉紺烘垚鐧誨綍欏甸潰錛屽畠鏄湪HTTP澶撮噷鍐欏叆閲嶅畾鍚戝弬鏁版潵瀹炵幇鐨勩傚湪鎴戣繖閲岀殑鐗規(guī)畩鎯呭喌涓嬶紝姝g‘鐨勫仛娉曟槸璁╁畠鎵ц涓涓寘鍚湪<script>鏍囪涓殑鑴氭湰錛屽湪鑴氭湰涓洿鏀圭獥鍙ocation鍊兼潵璺寵漿銆?br />
涓嶈繃RoR涓嬌鐢ˋjax鏃訛紝浼?xì)鏍规?update鍙傛暟鏉ュ喅瀹氭槸浣跨敤Updater榪樻槸Request銆傚鏋滀嬌鐢║pdater鏂瑰紡錛屽垯搴旇繑鍥炰竴孌電函鑴氭湰錛涘鏋滄槸Request鏂瑰紡錛屽簲榪斿洖涓孌靛寘鎷湪<script>鏍囪涓殑鑴氭湰錛涘鏋滄槸鏅氭柟寮忥紝灝卞簲璇ヤ嬌鐢ㄥ師鏈夌殑redirect_to鍑芥暟浜嗐傚洜涓烘湇鍔$鏃犳硶鍖哄垎浣跨敤鐨勬槸鍝鏂瑰紡鏉ヨ姹傦紝鎵浠ョ畝鍗曠殑鍋氭硶鏄瘡涓姹傞兘闄勫姞涓涓弬鏁扮敤鏉ュ尯鍒嗭紝涓嶅姞鍙傛暟鍒欐槸鏅氳姹傛柟寮忋?br />
涓轟簡杈懼埌榪欎釜鐩殑錛屾垜淇敼浜唒rototype_helper涓殑remote_function鍑芥暟銆傝繖涓嚱鏁版牴鎹紶閫掕繘鏉ョ殑鍙傛暟鏉ュ喅瀹氫嬌鐢≧equest鎴栨槸Updater錛屾垜灝卞湪榪欓噷涓嬫墜錛?br />
聽聽聽聽聽聽聽聽javascript_options聽=聽options_for_ajax(options)
聽聽聽聽聽聽聽聽update聽=聽''
聽聽聽聽聽聽聽聽if聽options[:update]聽and聽options[:update].is_a?Hash
聽聽聽聽聽聽聽聽聽聽update聽聽=聽[]
聽聽聽聽聽聽聽聽聽聽update聽<<聽"success:'#{options[:update][:success]}'"聽if聽options[:update][:success]
聽聽聽聽聽聽聽聽聽聽update聽<<聽"failure:'#{options[:update][:failure]}'"聽if聽options[:update][:failure]
聽聽聽聽聽聽聽聽聽聽update聽聽=聽'{'聽+聽update.join(',')聽+聽'}'
聽聽聽聽聽聽聽聽elsif聽options[:update]
聽聽聽聽聽聽聽聽聽聽update聽<<聽"'#{options[:update]}'"
聽聽聽聽聽聽聽聽end
聽聽聽聽聽聽聽聽function聽=聽update.empty?聽?聽
聽聽聽聽聽聽聽聽聽聽"new聽Ajax.Request("聽:
聽聽聽聽聽聽聽聽聽聽"new聽Ajax.Updater(#{update},聽"
聽聽聽聽
聽聽聽聽聽聽聽聽url_options聽=聽options[:url]
聽聽聽聽聽聽聽聽ajax_options聽=聽options[:update]聽?聽{:ajax聽=>聽'update'}聽:聽{:ajax聽=>聽'request'}
聽聽聽聽聽聽聽聽url_options聽=聽url_options.merge(ajax_options)
聽聽聽聽聽聽聽聽url_options聽=聽url_options.merge(:escape聽=>聽false)聽if聽url_options.is_a?聽Hash
聽聽聽聽聽聽聽聽function聽<<聽"'#{url_for(url_options)}'"
聽聽聽聽聽聽聽聽function聽<<聽",聽#{javascript_options})"
聽聽聽聽聽聽聽聽function聽=聽"#{options[:before]};聽#{function}"聽if聽options[:before]
聽聽聽聽聽聽聽聽function聽=聽"#{function};聽#{options[:after]}"聽聽if聽options[:after]
聽聽聽聽聽聽聽聽function聽=聽"if聽(#{options[:condition]})聽{聽#{function};聽}"聽if聽options[:condition]
聽聽聽聽聽聽聽聽function聽=聽"if聽(confirm('#{escape_javascript(options[:confirm])}'))聽{聽#{function};聽}"聽if聽options[:confirm]
聽聽聽聽聽聽聽聽return聽function
聽聽聽聽聽聽end
鏈夌孩鑹茬殑2琛屾槸鎴戞坊鍔犵殑錛岀敱浜庤繖涓紪杈戝櫒鐨勫師鍥狅紝娌℃湁鏄劇ず鎴愭暣琛岀孩鑹層傝繖2琛岀殑浣滅敤鏄垽鏂槸鍚︽湁:update鍙傛暟錛岀敤瀹冩潵鍐沖畾鏄坊鍔燼jax=update榪樻槸ajax=request銆?br />
鐜板湪鍙互瀹炵幇涓涓畝鍗曠殑auto_redirect_to浜嗭細(xì)
聽聽聽聽case聽method
聽聽聽聽when聽'request'
聽聽聽聽聽聽request_redirect_to(url)
聽聽聽聽when聽'update'
聽聽聽聽聽聽update_redirect_to(url)
聽聽聽聽else
聽聽聽聽聽聽redirect_to(url)
聽聽聽聽end
聽聽end
聽聽
聽聽def聽request_redirect_to(url)
聽聽聽聽render聽:update聽do聽|page|
聽聽聽聽聽聽page.redirect_to(url)
聽聽聽聽end
聽聽end
聽聽
聽聽def聽update_redirect_to(url)
聽聽聽聽render聽:inline聽=>聽<<-EOS
聽聽聽聽聽聽<script聽language="javascript">
聽聽聽聽聽聽<%=
聽聽聽聽聽聽聽聽render聽:update聽do聽|page|
聽聽聽聽聽聽聽聽聽聽page.redirect_to("#{url_for(url)}")
聽聽聽聽聽聽聽聽end
聽聽聽聽聽聽%>
聽聽聽聽聽聽</script>
聽聽聽聽EOS
聽聽end
浣跨敤helper鏂瑰紡浣垮畠鑳藉琚玦nclude鍒癆pplicationController涓氨琛屼簡銆?br />
涓轟簡涓嶅拰鍙傛暟緇戝緱澶錛岃繖閲屾妸method浣滀負(fù)鍙傛暟鐢辮皟鐢ㄨ呬紶鍏ャ?br />
浣跨敤鏂規(guī)硶錛屼互Login Engine涓轟緥錛屽畠鍦╝ccess_denied涓鐞嗚煩杞傚湪ApplicationController涓噸鍐欒繖涓嚱鏁幫細(xì)
聽聽聽聽聽聽auto_redirect_to(params[:ajax],聽:controller聽=>聽"/user",聽:action聽=>聽"login")
聽聽聽聽聽聽false
聽聽聽聽end聽聽
鐜板湪鍙互嫻嬭瘯浜嗐傝姹傚彲浠ユ槸鏅氱殑錛堣秴閾炬帴錛夛紝Updater鏂瑰紡錛堣姹傚埌涓涓狣IV閲岋級錛孯equest鏂瑰紡錛岀幇鍦ㄩ兘鑳藉璺寵漿鍒版紜〉闈€?br />
ajax鍙傛暟閫氳繃hack搴撲唬鐮佹潵瀹炵幇錛屽浜庝嬌鐢ㄨ呮潵璇村熀鏈笂鏄忔槑鐨勩?br />
]]>
using聽System.Web;
using聽System.Web.Services;
using聽System.Web.Services.Protocols;
[WebService(Namespace聽=聽"http://tempuri.org/")]
[WebServiceBinding(ConformsTo聽=聽WsiProfiles.BasicProfile1_1)]
public聽class聽Service聽:聽System.Web.Services.WebService
{
聽聽聽聽[WebMethod]
聽聽聽聽public聽string聽HelloWorld(string聽name)聽{
聽聽聽聽聽聽聽聽return聽"Hello,聽"聽+聽name;
聽聽聽聽}
聽聽聽聽
}
鍦≧oR欏圭洰閲岋紝娣誨姞app/apis/test_api.rb錛?br />
聽聽api_method聽:HelloWorld,聽:expects聽=>聽[{:name聽=>聽:string}],聽:returns聽=>聽[:string]
end
榪欐槸RoR閲岄潰閫氱敤鐨剋ebservice鍏冧俊鎭弿榪般?br />
娣誨姞app/controllers/test_controller.rb:
聽聽web_client_api聽:test,聽:soap,聽"http://localhost/test/Service.asmx",聽
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽:namespace聽=>聽"http://tempuri.org/",
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽:soap_action_base聽=>聽"http://tempuri.org",
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽:driver_options=>{:default_encodingstyle聽=>聽SOAP::EncodingStyle::ASPDotNetHandler::Namespace聽}
聽聽def聽hello
聽聽聽聽render_text聽test.HelloWorld("Li聽Jie")
聽聽end
end
:soap_action_base閫夐」鏄竴涓慨琛ワ紝涓嶅姞榪欎釜閫夐」浼?xì)漶旂敓SOAPAction澶撮敊璇?br />
榪愯鏈嶅姟鍣紝鍦ㄦ祻瑙堝櫒涓闂?test/hello錛屽彂鐜板悕瀛椾負(fù)絀恒傜粡榪囬暱鏃墮棿璋冭瘯錛屽彂鐜?Net鍦ㄨВ鏋怱OAP娑堟伅浣撴椂錛屼笉鑳藉鐞嗚繖縐嶅懡鍚嶇┖闂達細(xì)
聽聽聽聽聽聽聽聽soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
聽聽聽聽聽聽<name聽xsi:type="xsd:string">Li Jie</name>
聽聽聽聽</n1:HelloWorld>
鎶妌1鍘繪帀灝辮浜嗐備笉榪囪繖閮ㄥ垎瀹炵幇鍦╮ubylib/soap/rpc/proxy.rb閲岄潰錛屽疄鍦ㄤ笉鏂逛究淇敼銆備負(fù)浜嗚榪欎釜嫻嬭瘯閫氳繃錛屾殏鏃跺仛浜嗙偣灝忎慨鏀癸細(xì)
聽聽聽聽req_env聽=聽::SOAP::SOAPEnvelope.new(req_header,聽req_body)
聽聽聽聽unless聽reqopt[:envelopenamespace].nil?
聽聽聽聽聽聽set_envelopenamespace(req_env,聽reqopt[:envelopenamespace])
聽聽聽聽end
聽聽聽聽reqopt[:external_content]聽=聽nil
聽聽聽聽conn_data聽=聽marshal(req_env,聽reqopt)
聽聽聽聽if聽ext聽=聽reqopt[:external_content]
聽聽聽聽聽聽mime聽=聽MIMEMessage.new
聽聽聽聽聽聽ext.each聽do聽|k,聽v|
聽聽聽聽聽聽聽聽聽聽mime.add_attachment(v.data)
聽聽聽聽聽聽end
聽聽聽聽聽聽mime.add_part(conn_data.send_string聽+聽"\r\n")
聽聽聽聽聽聽mime.close
聽聽聽聽聽聽conn_data.send_string聽=聽mime.content_str
聽聽聽聽聽聽conn_data.send_contenttype聽=聽mime.headers['content-type'].str
聽聽聽聽end
聽聽聽聽conn_data.send_string.gsub!(/:n1/,聽'')
聽聽聽聽conn_data.send_string.gsub!(/n1:/,聽'')
聽聽聽聽conn_data聽=聽@streamhandler.send(@endpoint_url,聽conn_data,
聽聽聽聽聽聽reqopt[:soapaction])
聽聽聽聽if聽conn_data.receive_string.empty?
聽聽聽聽聽聽return聽nil
聽聽聽聽end
聽聽聽聽unmarshal(conn_data,聽resopt)
聽聽end
鍔犵矖鐨?琛屾槸鎴戞坊鍔犵殑浠g爜錛屽媺寮哄彲浠ヨ瀹冨伐浣滐紝涓嶈繃鏄劇劧涓嶆槸姝g‘鐨勬柟娉曘?br />
涓嶇煡閬撴槸涓嶆槸.Net搴撻噷闈㈢殑BUG銆?img src ="http://m.shnenglu.com/cpunion/aggbug/7138.html" width = "1" height = "1" />
]]>
婕旂ず欏甸潰鐩存帴鍦ㄦ祻瑙堝櫒涓鐪嬨?br />
婕旂ず涓嬭澆
]]>
鏈変簺鏃跺欐垜浠茍涓嶉渶瑕佽姹傛湇鍔″櫒錛屽彧鎯沖湪嫻忚鍣ㄤ笂鎵ц鏌愪簺鑴氭湰鏇存柊錛屼絾鍙堟兂浣跨敤RJS銆傛墍浠ヤ負(fù)RoR澧炲姞浜嗚繖欏瑰姛鑳姐?br />
浣跨敤鏂規(guī)硶錛?br />
<%=聽
render聽:update聽do聽|page|
聽聽page.define_action聽'test_action'聽do
聽聽聽聽page.call_script聽<<-EOS
聽聽聽聽聽聽alert(params.comment.title);
聽聽聽聽聽聽alert(params.comment.body);
聽聽聽聽EOS
聽聽聽聽page.replace_html聽'errors',聽'ERROR'
聽聽end
聽聽page.define_action聽'link_action'聽do
聽聽聽聽page.replace_html聽'errors',聽'ERROR'
聽聽end
end
%>
</script>
<div聽id="errors"></div>
<%=聽form_local_tag聽:html聽=>聽{:action聽=>聽'test_action'}聽%>
聽聽<input聽name="comment[title]"聽/><br聽/>
聽聽<input聽name="comment[body]"聽/><br聽/>
聽聽<%=聽submit_tag聽'Create'聽%>
<%=聽end_form_tag聽%>
<%=聽link_to_local聽'Test',聽:action聽=>聽'link_action()'聽%>
涓婇潰婕旂ず浜唂orm_local_tag鍜宭ink_to_local鐨勪嬌鐢紝鎵撳紑榪欎釜欏甸潰浠ュ悗錛屽彲浠ュ叧鎺夋湇鍔″櫒嫻嬭瘯錛屼細(xì)鍙戠幇瀹冧笉璇鋒眰鏈嶅姟鍣ㄤ篃鑳芥墽琛岀浉搴旇剼鏈?br />
define_action瀹氫箟涓涓剼鏈嚱鏁幫紝call_script鐢ㄦ潵瀹炵幇javascript鍜孯JS浠g爜鐨勬販鍚堛傚綋浣跨敤form_local_tag鏃訛紝action鏂規(guī)硶鐨勫弬鏁板凡緇忚澶勭悊榪囷紝鎵浠ュ彲浠ョ洿鎺ュ湪action涓嬌鐢╬arams.comment.title銆?br />
褰撶劧鐜板湪榪樹笉瀹屽杽錛屾瘮濡傝繕鍙兘浣跨敤杞崲瀹岀殑欏甸潰妯℃澘錛屼竴浜涘姩鎬侀〉闈㈠皢鐪嬩笉鍑烘晥鏋溿傝鍋氬埌榪欑偣錛岄渶瑕佺敤javascript瀹炵幇涓鏁村鐨凙ctionView杈呭姪鏂規(guī)硶銆?br />
涓嬮潰鎻愪緵涓涓拡瀵箁ails 1.1.2鐨勪竴涓ˉ涓佹枃浠訛細(xì)
琛ヤ竵鏂囦歡涓嬭澆
]]>
聽聽class聽CheckGroupError聽<聽ActionControllerError聽#:nodoc:
聽聽聽聽attr_reader聽:group_name
聽聽聽聽def聽initialize(group_name)
聽聽聽聽聽聽@group_name聽=聽group_name
聽聽聽聽end
聽聽end
聽聽
聽聽class聽CheckRoleError聽<聽ActionControllerError聽#:nodoc:
聽聽聽聽attr_reader聽:role_name
聽聽聽聽def聽initialize(role_name)
聽聽聽聽聽聽@role_name聽=聽role_name
聽聽聽聽end
聽聽end
聽聽
聽聽class聽Base聽#:nodoc:
聽聽聽聽def聽roles
聽聽聽聽聽聽[]
聽聽聽聽end
聽聽聽聽
聽聽聽聽def聽groups
聽聽聽聽聽聽[]
聽聽聽聽end
聽聽聽聽
聽聽聽聽def聽check_roles(*role_args)
聽聽聽聽聽聽role_args.each聽do聽|role|
聽聽聽聽聽聽聽聽check_role(role)
聽聽聽聽聽聽end
聽聽聽聽end
聽聽聽聽
聽聽聽聽def聽check_groups(*group_args)
聽聽聽聽聽聽group_args.each聽do聽|group|
聽聽聽聽聽聽聽聽check_group(group)
聽聽聽聽聽聽end
聽聽聽聽end
聽聽聽聽
聽聽聽聽def聽check_group(group)
聽聽聽聽聽聽raise聽CheckGroupError.new(group.to_s)聽unless聽groups().include?(group.to_s)
聽聽聽聽end
聽聽聽聽
聽聽聽聽def聽check_role(role)
聽聽聽聽聽聽raise聽CheckRoleError.new(role.to_s)聽聽聽unless聽roles().include?(role.to_s)聽聽聽聽聽聽
聽聽聽聽end
聽聽end
聽聽
end
鍙渶瑕佸湪ApplicationController涓疄鐜皉oles鍜実roups榪?涓柟娉曪紝瀵規(guī)暟鎹簱妯″紡娌℃湁浠諱綍闄愬埗錛屽彧瑕佽兘淇濊瘉榪?涓柟娉曡兘澶熷緱鍒板綋鍓嶇敤鎴風(fēng)殑瑙掕壊鍜岀粍鍗沖彲銆?br />
鏈?涓猚heck鏂規(guī)硶鍙敤錛屽彲浠繪剰浣跨敤涓涓垨澶氫釜銆?br />
綆鍗曟ā鎷熸祴璇曚竴涓嬶細(xì)
聽聽def聽roles
聽聽聽聽%w(add聽show)
聽聽end
聽聽def聽groups
聽聽聽聽%w(users)
聽聽end
end
聽聽def聽test1
聽聽聽聽check_role聽:add
聽聽聽聽render_text聽"OK"
聽聽end
聽聽def聽test2
聽聽聽聽check_role聽:add
聽聽聽聽check_group聽:users
聽聽聽聽render_text聽"OK"
聽聽end
聽聽def聽test3
聽聽聽聽check_groups聽:admin,聽:users
聽聽聽聽render_text聽"OK"
聽聽end
聽聽def聽test4
聽聽聽聽check_roles聽:add,聽:remove
聽聽聽聽render_text聽"OK"
聽聽end
end
鍏朵腑錛宼est1銆乼est2閮戒細(xì)鎴愬姛錛岃宼est3鍜宼est4鍒欎細(xì)澶辮觸鏄劇ず寮傚父錛屽彧闇瑕佸鐞唕escue_action鎶婂畠淇敼涓鴻嚜宸辯殑鏄劇ず欏甸潰鍗沖彲銆?img src ="http://m.shnenglu.com/cpunion/aggbug/6790.html" width = "1" height = "1" />
]]>
涓嶈繃褰撴椂娌℃湁鍘昏冭檻鍔ㄦ佸姞杞紻LL鐨勬儏鍐點?BR>
浠婂ぉ鍦?A href="mailto:cpp@codingnow.com">cpp@codingnow.com涓篃鏈変漢闂埌榪欎釜闂錛屽氨鎶婂畠緇欏仛瀹屼簡銆?BR>
褰撶劧鍙槸綆鍗曞湴鍋氬埌浜嗏滀粠鍏ㄥ眬綾誨瀷搴撲腑錛屾牴鎹被鍚嶅垱寤哄疄渚嬶紝鏀寔鍔ㄦ丏LL鍔犺澆鈥濓紝璇村緱鏇存槑鐧界偣錛?BR>
鍦ㄥ簲鐢ㄧ▼搴廇pp1涓紝鍚戝叏灞綾誨瀷搴撲腑娉ㄥ唽涓涓被鍨?Test"錛屽湪鍙︿竴涓殣寮忛摼鎺ョ殑DLL涓紙鍗矨pp1涓鍚姩灝卞姞杞界殑DLL錛夛紝鍚戝叏灞綾誨瀷搴撲腑娉ㄥ唽鍙﹀鍑犱釜綾誨瀷銆傝繖鏃跺彲浠ュ湪App1涓氳繃綾誨瀷鐨勫悕瀛楃敓鎴愬疄渚嬨?BR>
鍦ㄥ彟涓涓樉寮忓姞杞界殑DLL涓紙鍗寵皟鐢↙oadLibrary鍔犺澆錛夛紝鍚戝叏灞綾誨瀷搴撲腑娉ㄥ唽鍏跺畠鍑犱釜綾誨瀷銆傝繖鏃墮氳繃LoadLibrary鍔犺澆榪欎釜DLL錛屽氨鍙互鐢熸垚榪欏嚑涓被鍨嬬殑瀹炰緥浜嗐?BR>
榪欏湴鏂逛笉鑳戒笂浼犳枃浠訛紝灝辨妸浠g爜璐翠竴鐐瑰惂錛?BR>
typelib.h鏂囦歡錛?BR>
#define __TYPE_LIB_H__
typedef void*(*CREATE_FUNC)();
typedef void(*RELEASE_FUNC)(void*);
void regtype (const char* name, CREATE_FUNC cfunc, RELEASE_FUNC rfunc);
void* createObject (const char* name);
void releaseObject (const char* name, void* p);
struct ITestInterface
{
virtual ~ITestInterface () {}
virtual void print () const = 0;
};
template <class T>
void* create ()
{
return new T;
}
template <class T>
void release (void* p)
{
delete (T*)p;
}
#endif // __TYPE_LIB_H__
typelib.cpp鏂囦歡錛?BR>
#include <string>
#include <map>
using namespace std;
namespace TypeRegistry
{
static map < string, pair<CREATE_FUNC, RELEASE_FUNC> > types_info;
template <class T>
void regType (const string& name)
{
types_info.insert (make_pair(name, make_pair(create<T>, release<T>)));
}
}
void regtype (const char* name, CREATE_FUNC cfunc, RELEASE_FUNC rfunc)
{
TypeRegistry::types_info.insert (make_pair(name, make_pair(cfunc, rfunc)));
}
void* createObject (const char* name)
{
map < string, pair<CREATE_FUNC, RELEASE_FUNC> >::const_iterator iter;
iter = TypeRegistry::types_info.find (name);
if (iter != TypeRegistry::types_info.end ())
return (*iter->second.first)();
return NULL;
}
void releaseObject (const char* name, void* p)
{
map < string, pair<CREATE_FUNC, RELEASE_FUNC> >::const_iterator iter;
iter = TypeRegistry::types_info.find (name);
if (iter != TypeRegistry::types_info.end ())
(*iter->second.second)(p);
}
鎶婂畠緙栬瘧鎴愰潤鎬乴ib鎴朌LL錛屽氨鍙互浣跨敤浜嗐?BR>
鍦ㄩ偅2涓負(fù)鎴戜滑鎻愪緵綾誨瀷鐨凞LL涓紝DllMain鍑芥暟涓姞鍏ヤ笅闈㈢殑浠g爜錛?BR>
regtype("FirstTest", create<FirstTest>, release<FirstTest>);
regtype("FirstTest", create<SecondTest>, release<SecondTest>);
灝卞彲浠ュ悜鍏ㄥ眬綾誨瀷搴撲腑娉ㄥ唽綾誨瀷銆傛敞鎰忓湪綾誨瀷搴撲腑鏄病鏈変繚瀛樼被淇℃伅鐨勶紝鎵浠ユ渶濂芥槸浣跨敤鍗曟牴綾誨簱鏉ュ仛銆?BR>
涓嬮潰鏄竴鐐規(guī)祴璇曚唬鐮侊細(xì)
{
// 紼嬪簭鍚姩鏃舵敞鍐岀被鍨嬨?BR> // 瀹為檯涓婂惎鍔ㄦ椂灝卞姞杞戒簡鍙︿竴涓姩鎬侀摼鎺ュ簱錛岄偅閲岄潰鏈?涓被鍨嬶紝鎵浠ョ幇鍦ㄦ湁4涓被鍨?/SPAN>
regtype ("MyTest", create<MyTest>, release<MyTest>);
while (1)
{
string class_name;
cin >> class_name;
if (class_name == "q")
break;
// 褰撹緭鍏oad鏃訛紝鎶婂彟涓涓姩鎬侀摼鎺ュ簱鍔犺澆榪涙潵錛岄偅涓摼鎺ュ簱涓湁2涓被鍨嬶紝鐜板湪鍏辨湁6涓被鍨嬪彲鐢ㄣ?/SPAN>
if (class_name == "load")
{
LoadLibrary("typelibdll_test.dll");
continue;
}
ITestInterface* test = (ITestInterface*)createObject (class_name.c_str());
if (!test)
{
cout << "This type not found" << endl;
continue;
}
test->print ();
releaseObject (class_name.c_str(), test);
}
return 0;
}
榪樻湁涓涓病鑰冭檻鐨勫湴鏂癸紝灝辨槸娌℃湁緇欏畠鍔犻攣錛屽洜涓烘湁鍙兘鍦ㄤ竴涓嚎紼嬩腑鍔犺澆涓涓狣LL銆?BR>
涓嶈繃鎴戣繕鏈変簺鎬鐤戣繖涓滆タ鏄惁鐪熺殑鏈夌敤錛?img src ="http://m.shnenglu.com/cpunion/aggbug/435.html" width = "1" height = "1" />
]]>
鍓?綃囦貢涓冨叓緋熷湴璁蹭簡涓浜涳紝鏈変竴涓仐鐣欓棶棰橈紝鍑芥暟鍘熷瀷鐨勬帹瀵箋?BR>
綆瑕佹弿榪板涓嬶細(xì)
瑕佷駭鐢熻繖3縐嶅嚱鏁板艦寮忋傚弬鏁扮被鍨嬪浣曡漿鎹紝鏄互鍚庣殑璇濋錛屾湰綃囦富瑕佽В鍐沖紓姝ヨ皟鐢ㄧ殑鍑芥暟鍘熷艦鎺ㄥ闂銆傛湰綃囦篃涓嶈璁篗ethod鐨勬ā鏉垮弬鏁幫紙鍗抽偅涓嚱鏁扮被鍨嬶級榪斿洖綾誨瀷涓嶄負(fù)void鐨勬儏鍐點?BR>
絎竴縐嶅艦寮忥紝鍚屾璋冪敤錛屾瘮杈冨ソ澶勭悊錛屽弬鏁頒釜鏁板拰妯℃澘鍙傛暟鐨勬暟閲忕浉鍚屻?BR>
鍚?縐嶅艦寮忥紝濡備綍璁╃紪璇戝櫒鏍規(guī)嵁in/out鏉ユ帹瀵煎嚭鍑芥暟鍘熷瀷錛?BR>
鎴戜滑闇瑕佺紪璇戝櫒鍋氳繖鏍風(fēng)殑澶勭悊錛宎sync_call鐨勫弬鏁扮被鍨嬩腑錛宨n綾誨瀷鐨勫弬鏁板皢淇濈暀錛宱ut綾誨瀷鐨勫弬鏁頒笉闇瑕侊紝inout綾誨瀷涔熼渶瑕佷繚鐣欍?BR>
瑕佺敤鍒扮殑Loki澶存枃浠訛細(xì)
棣栧厛鐪嬬湅in/inout/out鐨勫0鏄庛備負(fù)浜嗙畝鍖栵紝榪欓噷鍘繪帀浜嗚窡綾誨瀷鎺ㄥ鏃犲叧鐨勯儴鍒嗐?/P>
鏍規(guī)嵁涓婇潰Method鐨勫畾涔夛紝Method < void(in
涔熷氨鏄錛屽彧瑕佹垜浠兘浣跨敤闈欐佹帹瀵兼柟寮忥紝鑾峰緱A,B,C,D榪欏洓涓弬鏁頒腑鎵鏈夌殑in綾誨瀷錛屾妸瀹冧氦緇橞ase浣滀負(fù)妯℃澘鍙傛暟灝辨垚浜嗐?/P>
榪欓噷闇瑕佷竴涓緟鍔╃殑妯℃澘綾伙紝鐢ㄦ潵鍦ㄧ紪璇戞椂甯姪鎺ㄥ錛?BR> 榪欎釜緋誨垪鐨勫悕瀛楀彨鈥滀負(fù)C++瀹炵幇涓涓狪DL鈥濓紝瀹為檯涓婂簲璇ュ彨鈥滀負(fù)C++瀹炵幇涓涓猂emoting鈥濆彲鑳芥洿濂戒竴浜涳紝璇存槸IDL錛屼富瑕佹槸鎯抽氳繃瀹忥紝浣跨敤綆鍗曠殑綾誨瀷瀹氫箟杈懼埌鑷姩鐢熸垚璋冪敤浠g爜鐨勭洰鐨勩?/P>
涓銆侀鍏堟潵鐪嬬湅璋冪敤涔?fàn)鎯?/STRONG> 浠庤皟鐢ㄤ範(fàn)鎯叆鎵嬶紝涓昏鏄洜涓虹湅鍒扮洰鍓嶆湁寰堝搴?宸ュ叿鍖呭湪璋冪敤涓婇兘鏈夊緢澶氫笉渚夸箣澶勩傚亣濡傝兘鍦ㄤ竴寮濮嬪氨浠庤繖鐐瑰嚭鍙戯紝灝辮兘鎶婅皟鐢ㄦ帴鍙h璁″緱鏇村ソ涓浜涖?/P>
鍏堟潵鐪嬬湅鏈嶅姟绔浣曞紑鏀句竴涓湇鍔°?/P>
2銆伮犳湇鍔¢獙璇佹柟寮忥細(xì) 鐪嬭搗鏉ユ尯澶氱殑錛屽叾瀹炲緢闅炬帴瑙﹀埌榪欎簺錛屽彧闇瑕佷嬌鐢ㄥ畯鏉ュ畾涔変竴涓湇鍔★紝灝卞彲浠ラ氳繃妯℃澘鐨勭被鍨嬫帹瀵鹼紝鑷姩鐢熸垚榪欎簺澶嶆潅鐨勫畾涔夈?/P>涓夈佽皟鐢ㄨ繃紼嬨?BR> 聽 鍥涖佸紓姝ヨ皟鐢?寮傛鍒嗘淳(AMI/AMD)銆?BR> AMI鍜孉MD瀵逛簬闈欐佸畾涔夌殑鏈嶅姟鏄湁褰卞搷鐨勶紝姣斿涓嬮潰涓涓湇鍔★細(xì) 浜斻佸叾瀹冦?BR>
娉ㄦ剰錛岃繖閲屾槸浠ethod < void(in
class InOutTypeTraits
{
Loki::CompileTimeError <false> Not_Supported_Type;
};
template <class T>
struct InOutTypeTraits < in<T> >
{
enum {isin=1, isout=0};
};
template <class T>
struct InOutTypeTraits < out<T> >
{
enum {isin=0, isout=1};
};
template <class T>
struct InOutTypeTraits < inout<T> >
{
enum {isin=1, isout=1};
};
template <>
struct InOutTypeTraits < NullType >
{
enum {isin=0, isout=0};
};
閫氳繃鍙︿竴涓ā鏉跨被InList鏉ュ府鎴戜滑浜х敓鎵鏈夌殑in綾誨瀷錛屽畠鐨勭粨鏋滄槸涓涓猅ypelist銆備負(fù)浜嗘柟渚夸互鍚庝嬌鐢紝鎴戞妸out綾誨瀷浜х敓鍣ㄤ篃鍋氫簡涓涓狾utList銆?BR>
struct If
{
typedef _IF Result;
};
template <class _IF, class _ELSE>
struct If <0, _IF, _ELSE>
{
typedef _ELSE Result;
};
template <class A = NullType, class B = NullType, class C = NullType, class D = NullType,
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct InList
{
typedef typename If <
InOutTypeTraits <A>::isin,
typename Typelist < A, typename InList<B,C,D,E,F,G>::Result >,
typename InList<B,C,D,E,F,G,H>::Result
>::Result Result;
};
template <class A>
struct InList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
typedef typename If <
InOutTypeTraits <A>::isin,
typename MakeTypelist <A>::Result,
typename MakeTypelist <>::Result
>::Result Result;
};
template <class A = NullType, class B = NullType, class C = NullType, class D = NullType,
class E = NullType, class F = NullType, class G = NullType, class H = NullType
>
struct OutList
{
typedef typename If <
InOutTypeTraits<A>::isout,
typename Typelist < A, typename OutList<B,C,D,E,F,G>::Result >,
typename OutList<B,C,D,E,F,G,H>::Result
>::Result Result;
};
template <class A>
struct OutList <A, NullType, NullType, NullType, NullType, NullType, NullType, NullType>
{
typedef typename MakeTypelist <A>::Result Result;
};
瀹冪殑鍘熺悊鏄紝鏍規(guī)嵁If妯℃澘綾繪潵鍒ゆ柇涓涓被鍨嬫槸涓嶆槸in綾誨瀷錛屾槸鐨勮瘽灝辨妸瀹冨姞鍏ュ埌Typelist涓紝涓嶆槸灝辨帓闄ゅ畠銆?BR>
InList
鐜板湪Base妯℃澘綾誨皢鎺ュ彈涓涓ā鏉垮弬鏁幫紝瀹冩槸涓涓猅ypelist綾誨瀷錛岃繖涓笉璇︾粏璁蹭簡錛屾妸瀹冪殑瀹氫箟鍐欏嚭鏉ワ細(xì)
struct Base
{
Loki::CompileTimeError <false> Only_Use_Partial_Specialisation_Version;
};
template <class T>
struct Base <T, 0>
{
typedef void(*FUNC_TYPE)();
template <class FUNC_TYPE>
void async_call (FUNC_TYPE func)
{
}
void async_call ()
{
}
};
template <class T>
struct Base <T, 1>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
FUNC_TYPE func)
{
}
void async_call (typename TypeAt <T, 0>::Result::OriginalType v0)
{
}
};
template <class T>
struct Base <T, 2>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1)
{
}
};
template <class T>
struct Base <T, 3>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType,
typename TypeAt <T, 2>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2)
{
}
};
template <class T>
struct Base <T, 4>
{
typedef void(*FUNC_TYPE)(
typename TypeAt <T, 0>::Result::OriginalType,
typename TypeAt <T, 1>::Result::OriginalType,
typename TypeAt <T, 2>::Result::OriginalType,
typename TypeAt <T, 3>::Result::OriginalType);
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
typename TypeAt <T, 3>::Result::OriginalType v3,
FUNC_TYPE func)
{
}
void async_call (
typename TypeAt <T, 0>::Result::OriginalType v0,
typename TypeAt <T, 1>::Result::OriginalType v1,
typename TypeAt <T, 2>::Result::OriginalType v2,
typename TypeAt <T, 3>::Result::OriginalType v3)
{
}
};
榪欓儴鍒嗘湁鐐瑰錛屽叾瀹炶繕鏄瘮杈冩竻鏅扮殑銆傛敞鎰忚繖涓狟ase鐨勭増鏈凡緇忎笉鏄笂闈㈡墍璁茬殑閭d釜浜嗐?BR>
鍑芥暟鍘熷艦鎺ㄥ闂灝辮瀹屼簡銆備笂闈㈢殑浠g爜涓嶄竴瀹氳繕鑳界紪璇戯紝鏄ㄥぉ鏄兘緙栬瘧鐨勶紝琚垜淇敼浜嗕竴浜涳紝涓轟簡瑙i噴錛屽張鏀規(guī)垚鏄ㄥぉ閭f牱瀛愩?img src ="http://m.shnenglu.com/cpunion/aggbug/349.html" width = "1" height = "1" />
]]>
欏圭洰鍛藉悕涓篴ncients錛屽瓧闈㈡剰鎬濇槸鈥滆繙鍙ょ殑錛屾棫鐨勨濓紝瀹為檯涓婅繖涓富棰樹篃綆楁槸鏃х殑浜嗐傚師鏈墦綆楀懡鍚嶄負(fù)C++ Remoting錛屼笉榪囨兂浜嗕竴涓嬶紝榪樻槸鎹釜鍚嶅瓧錛屽厤寰楄浜轟竴鐪嬪氨鎯蟲嬁鍘昏窡java, c#鐨剅emoting姣旇緝銆?BR>
鍙栬繖涓悕瀛椾富瑕佹槸鍥犱負(fù)鍠滄鐪嬨婃槦闄呬箣闂ㄣ嬪墽闆嗭紝閲岄潰鏈鍠滄鐨勪竴涓鏃忓氨鏄痑ncients銆?BR>
asgard鏄彟涓涓鏃忥紝鍦╝ncients榪欎釜鍚嶅瓧琚漢鍗犵敤浜嗙殑鎯呭喌涓嬶紝鍙ソ閫夊畠浜嗐傚畠鐨勫瓧闈㈡剰鎬濇槸鈥滀粰瀹濓紝涔熸槸涓嶉敊鐨勫悕瀛楋紝鍛靛懙銆俛sgard榪欎釜縐嶆棌鐨勭鎶闈炲父鍙戣揪錛屾湁鍏堣繘鐨勪簹絀洪棿鏃呰鎶鏈紝鍏堣繘鐨勫厜浼犻佹妧鏈紝韜綋涔熸瘮杈冪鍚堜竴浜涙姤閬撲腑澶栨槦浜虹殑鏍峰瓙銆?BR>
鏆傛椂榪樻病鎵懼埌鍚堥傜殑絀洪棿鏉ユ斁榪欎釜欏圭洰錛屽氨浠ュ帇緙╁寘鐨勫艦寮忓湪榪欎釜blog涓婂仛鍚с?BR>
鎵撶畻鍏堝疄鐜板姩鎬侀儴鍒嗭紝鎴戠粰瀹冨懡鍚嶄負(fù)reflection錛屾ā浠縥ava鐨勶紝褰撶劧涔熶笉浼?xì)鍋氬畠閭d箞瀹屾暣銆傝繖閮ㄥ垎蹇呴』鍏堝仛錛岃繖鏍鋒柟渚跨敤鏉ユ祴璇曢潤鎬佺粨鏋勩?BR>
鐒跺悗鏄潤鎬佺粨鏋勯儴鍒嗭紝鍓嶉潰宸茬粡鍐欎簡2綃囦貢涓冨叓緋熺殑鎻忚堪錛屽墿浣欓棶棰橈紙鍑芥暟鍘熷艦鎺ㄥ闂錛夊熀鏈凡緇忚В鍐充簡銆?BR>
鏁翠釜妗嗘灦鍦⊿ervice浠ヤ笅閮芥槸鐜鏃犲叧鐨勶紝榪欓噷鐨勭幆澧冩寚鐨勬槸鍗忚銆侀氳絳夌幆澧冦備篃灝辨槸璇達紝瀹氫箟涓涓猄ervice錛屽茍涓嶅湪涓寮濮嬪氨鎸囧畾瀹冩墍浣跨敤鐨勯氳鍗忚銆傚畾涔夊畬鎴愪互鍚庯紝鎶婂畠鎸囧畾緇欎竴涓崗璁紝灝卞彲浠ュ疄鐜板崗璁粦瀹氾紝鐢氳嚦鍦ㄨ繍琛屾椂鍒誨姩鎬佸垏鎹㈠埌鍙︿竴涓崗璁傚綋鐒惰繖鍙兘鏄笉鍚堢悊鐨勶紝涓嶈繃鎴戣涓哄鏋滄敮鎸佽繖縐嶅仛娉曪紝鏈韓灝辨槸鐏墊椿鎬х殑涓縐嶄綋鐜般?BR>
鍓嶉潰榪樻湁浜涘湴鏂癸紝鍜屽疄闄呮儏鍐墊湁浜涘樊鍒殑錛岄渶瑕佽ˉ鍏呭畬鍠勩傜畝瑕佹弿榪板涓嬶細(xì)
浣跨敤瀹忔潵瀹氫箟Service錛屽墠闈㈠彧瀹氫箟浜嗘柟娉曠殑鍘熷瀷銆佸悕縐般佹湇鍔$緇戝畾鐨勫嚱鏁幫紝鍏跺疄榪樺樊涓涓噸瑕佺殑涓滆タ錛屽氨鏄弬鏁扮殑鍚嶅瓧銆?BR>濡傛灉浣跨敤鑷繁鐨勫崗璁紝鎴栬呮槸欏哄簭瀛樺偍鐨勫崗璁紝姣斿BENCODE錛屾潵浣滀負(fù)榪滅▼璋冪敤鍗忚錛岄偅涔堝弬鏁扮殑鍚嶅瓧鏄笉閲嶈鐨勶紝鍙鎸夐『搴忔妸鍙傛暟搴忓垪鍖栥佸弽搴忓垪鍖栧氨鍙互浜嗐?BR>浣嗗湪浣跨敤SOAP浣滀負(fù)榪滅▼璋冪敤鍗忚鏃訛紝灝卞緱鑰冭檻涓哄弬鏁板姞涓婂悕瀛椾簡錛孲OAP鏄粠XML鍏冪礌涓紝鎸夊弬鏁板悕縐版潵鎻愬彇鍙傛暟鍊肩殑錛岃櫧鐒舵垜浠彲浠ヤ負(fù)鍙傛暟鐢熸垚涓涓悕瀛楋紝浣嗚繖涓悕瀛椾笉鑳芥弿榪板弬鏁版墍琛ㄨ揪鐨勬剰鎬濄?BR>鎵浠ラ渶瑕佽冭檻涓哄弬鏁板彇涓婂悕瀛椼?BR>
鏆傛椂灝辮ˉ鍏呰繖涓鐐癸紝鍏跺畠鏂歸潰鏈夌瓑榪涗竴姝ョ爺絀躲?img src ="http://m.shnenglu.com/cpunion/aggbug/327.html" width = "1" height = "1" />
]]>
{
聽聽聽聽//聽鍙戝竷涓篠OAP鏈嶅姟錛屽厛鐢熸垚涓涓湇鍔″鍣ㄣ?BR>聽聽聽聽//聽鏈嶅姟灝嗗彂甯冨湪localhost鐨?911涓婏紝localhost鐢ㄦ潵緇戝畾loopback緗戝崱銆?/SPAN>
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽TestService聽test_service;聽
聽聽聽聽soap_service.addService聽聽(鈥渢est_service鈥?聽&test_service);
聽聽聽聽TestService聽service1;
聽聽聽聽soap_service.addService聽(鈥淗elloService鈥?聽&service1);
聽聽聽聽try{
聽聽聽聽聽聽聽聽soap_service.run聽();
聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽{
聽聽聽聽}聽catch聽(SignalException&聽e)
聽聽聽聽{
聽聽聽聽}
聽聽聽聽return聽0;
}
鎴戝笇鏈涘氨鏄繖涔堢畝鍗曪紝瀹㈡埛绔皟鐢ㄦ湁澶氱鏂瑰紡錛?BR>1銆伮犱嬌鐢ㄦ湇鍔$殑IDL瀹氫箟錛岀洿鎺ヨ皟鐢細(xì)
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽try{
聽聽聽聽聽聽聽聽TestService聽test_service聽(鈥渢est_service鈥?聽&soap_service);
聽聽聽聽聽聽聽聽test_service.method1聽(/*
*/);
聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽{
聽聽聽聽}
聽聽聽聽return聽0;
}
榪欑鏂瑰紡姣旇緝綆鍗曪紝璋冪敤鏃朵細(xì)媯鏌ユ槸鍚﹀凡緇忚繛鎺ワ紝鐒跺悗鍙戦佽皟鐢ㄨ姹傦紝騫跺鐞嗚皟鐢ㄧ粨鏋溿?/P>
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽TestService聽test_service;
聽聽聽聽soap_service.getService聽(鈥渢est_service鈥?聽&test_service);
聽聽聽聽if聽(test_service)
聽聽聽聽{
聽聽聽聽聽聽聽聽try{
聽聽聽聽聽聽聽聽聽聽聽聽test_service.method1聽(/*
*/);
聽聽聽聽聽聽聽聽}聽catch聽(SocketException&聽e)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽return聽0;
}
3銆伮犳湇鍔″彂鐜版柟寮忥細(xì)
{
聽聽聽聽SOAPProxy聽soap_service聽(7911,聽鈥渓ocalhost鈥?;
聽聽聽聽vector聽<string>聽services_name聽=聽soap_service.getServiceNames聽();
聽聽聽聽//聽
聽聽聽聽IService*聽test_service聽=聽soap_service.getService聽(鈥渢est_service鈥?;
聽聽聽聽if聽(test_service)
聽聽聽聽{
聽聽聽聽聽聽聽聽vector聽<string>聽methods聽=聽test_service->getMethodNames聽();
聽聽聽聽聽聽聽聽IMethod*聽method聽=聽test_service->getMethod聽(鈥渕ethod1鈥?;
聽聽聽聽聽聽聽聽vector聽<Type*>聽types聽=聽method->getParameterType聽s()
聽聽聽聽聽聽聽聽method->addArg聽(3);
聽聽聽聽聽聽聽聽method->addArg聽(4);
聽聽聽聽聽聽聽聽//聽
聽聽聽聽聽聽聽聽method->invoke聽();
聽聽聽聽聽聽聽聽//聽
聽聽聽聽}
聽聽聽聽return聽0;
}
浜屻佸熀鏈渶姹傘?BR>
綆鍗曞垎鏋愪竴涓嬶紝涓婇潰涓鍏辨秹鍙婁簡鍝簺綾誨瀷錛?BR>IProxy:
榪欐槸鎵鏈塒roxy綾葷殑鍩虹被(鍜屾帴鍙?錛屽畠鍙互瀹圭撼澶氫釜鏈嶅姟瀵硅薄錛屾彁渚涙湇鍔$粦瀹氥佹湇鍔℃煡璇€佹湇鍔″彂鐜般佹湇鍔¢獙璇併?BR>IService:
鎵鏈塖ervice綾葷殑鍩虹被錛屽彲浠ュ綰沖涓柟娉?Method)錛屾彁渚涙柟娉曟煡璇€佹湇鍔¢獙璇併?BR>IMethod:
鎵鏈塎ethod妯℃澘綾葷殑鍩虹被錛屽綰沖涓弬鏁幫紝鍖呮嫭榪斿洖鍊鹼紝鍙氳繃鏌ヨ鍙傛暟綾誨瀷鑾峰緱鏂規(guī)硶鐨勭被鍨嬪畾涔夈?BR>IParameter:
鎵鏈夊弬鏁扮殑鍩虹被錛屽寘鍚竴涓弬鏁扮被鍨嬫弿榪板拰涓涓弬鏁板箋?BR>IType:
鎵鏈夌被鍨嬬殑鍩虹被錛岄瀹氫箟浜嗕竴浜涘熀鏈被鍨嬶紝鍙嚜瀹氫箟綾誨瀷銆?/P>
浠ヤ笅鍙畝鍗曞垎鏋愪竴涓嬪悓姝ヨ皟鐢紝寮傛璋冪敤灝嗘槸浠ュ悗鐨勬墿鍏呰瘽棰樸?BR>鏍規(guī)嵁絎簩鑺傜殑3縐嶄笉鍚岃皟鐢ㄨ繃紼嬶紝綆瑕佹弿榪板涓嬶細(xì)
榪欑鏂瑰紡鐪嬭搗鏉ュ浜嗕竴浜涙搷浣滐紝涓嶈繃楠岃瘉鐨勫ソ澶勬槸鑳藉鍑忓皯璋冪敤鏃剁殑寮傚父銆?
浣跨敤榪欑鏂瑰紡錛岃皟鐢ㄧ涓嶉渶瑕佹湇鍔$殑綾誨瀷瀹氫箟銆?
鍚屾璋冪敤鏃訛紝璋冪敤绔嚎紼嬮渶瑕佺瓑寰呰皟鐢ㄧ粨鏋滐紝鏈嶅姟绔嚎紼嬩篃瑕佺瓑寰呰皟鐢ㄧ粨鏉熻繑鍥烇紝鎵嶅鐞嗕笅涓涓皟鐢ㄣ?BR>涓轟簡鍦ㄦ湇鍔¤皟鐢ㄦ湡闂磋綰跨▼鑳藉仛鏇村鐨勪簨錛?BR>璋冪敤绔妸璋冪敤浜ょ粰綰跨▼姹犲畬鎴愶紝騫跺湪璋冪敤瀹屾垚鍚庨噰鐢ㄦ煇縐嶆満鍒墮氱煡綰跨▼澶勭悊緇撴灉錛屾垨鑰呯洿鎺ョ敱綰跨▼姹犱腑鐨勮皟鐢ㄧ嚎紼嬭皟鐢ㄧ粨鏋滃鐞嗗嚱鏁般傝繖縐嶆柟寮忕О涓篈MI(寮傛鏂規(guī)硶璋冪敤)銆?BR>鏈嶅姟绔富綰跨▼鍒欐妸鎺ユ敹鍒扮殑娑堟伅瑙f瀽鍚庯紝鏀懼叆澶勭悊闃熷垪錛岀敱綰跨▼姹犲幓澶勭悊璋冪敤榪囩▼銆傚綋璋冪敤瀹屾垚鍚庯紝緇撴灉鏀懼叆緇撴灉闃熷垪錛岀敱涓葷嚎紼嬪鐞嗘垚娑堟伅錛屽彂閫佸洖璋冪敤绔傝繖縐嶆柟寮忕О涓篈MD(寮傛鏂規(guī)硶鍒嗘淳)銆?BR>璋冪敤绔拰鏈嶅姟绔緷鏃ф槸浣跨敤閫氳鍗忚鏉ユ矡閫氾紝鍙屾柟閮戒笉鐭ラ亾瀵規(guī)柟鏄惁閲囩敤浜嗗紓姝ユ柟寮忋?/P>
{
聽聽聽聽Method聽<void(in<int>,聽out<int>)>聽method1;
}
鍦ㄥ悓姝ヨ皟鐢ㄦ椂錛屽畠鐨勮皟鐢ㄦ柟寮忥細(xì)
int聽a;
service.method1聽(3,聽a);聽//聽鎴栬吢爏ervice.method1聽(3,聽&a)錛屾墦綆楀吋瀹硅繖2縐嶆柟寮忋?/SPAN>
寮傛璋冪敤鏃訛紝璋冪敤鏂瑰紡錛?/P>
TestService聽test_service;
test_service.method1.async_call(3,聽method1_result);聽//聽璋冪敤瀹屾垚鍚庯紝璁╄皟鐢ㄧ嚎紼嬪幓璋冪敤method1_result閫氱煡璋冪敤緇撴灉銆?BR>//聽鎴栬呭儚涓嬮潰
IMethod*聽result聽=聽test_service.method1.async_call聽(3);
while聽(!result->done())聽聽//聽榪樻湁寰堝濂藉姙娉曪紝榪欓噷鍙槸涓轟簡綆鍗曘?/SPAN>
{
聽聽聽聽sleep聽(1);
}
cout聽<<聽result->getArg(1)->toInt();聽
姝e涓婇潰婕旂ず鐨勪竴鏍鳳紝寮傛璋冪敤鐨勭粨鏋滄湁2縐嶆柟寮忓幓澶勭悊銆?BR>涓鏄敱綰跨▼姹犺皟鐢ㄥ畬浠ュ悗錛屾帴鐫璋冪敤涓涓嚱鏁頒互閫氱煡緇撴灉銆傚畠涓嶉渶瑕佽疆璇紝涓嶈繃娑夊強鍒頒簡綰跨▼闂錛屽鍔犱簡涓浜涘鏉傛с?BR>鍙︿竴縐嶆柟寮忚皟鐢ㄧ粨鏉熷悗錛屽師璋冪敤綰跨▼鍦ㄦ煇涓傚綋鐨勨滄椂鏈衡濆幓鏌ヨ璋冪敤緇撴灉銆傝繖涓椂鏈哄彲浠ユ槸瀹氭椂鏌ヨ錛屼篃鍙互鏄綰跨▼娑堟伅閫氱煡鑰屽幓澶勭悊銆?/P>
榪欎竴綃囧姞涓婂墠涓綃囷紝搴旇鏄彁鍒頒簡鍏ㄩ儴鐨勮鐐廣?BR>鐩墠鍓╀笅鐨勫敮涓涓涓毦鐐癸紝鍙兘鏄湪澶勭悊寮傛璋冪敤鏃訛紝Method鐨勫畾涔夈?BR>姝e涓婇潰婕旂ず鐨勶紝涓涓柟娉曞湪鍚屾璋冪敤鍜屽紓姝ヨ皟鐢ㄦ椂錛屽氨鏈?縐嶈皟鐢ㄦ柟寮忥細(xì)
test_service.method1.async_call(3,聽method1_result);
IMethod*聽result聽=聽test_service.method1.async_call聽(3);
鐗瑰埆鍦幫紝瀹冨浣曟牴鎹甶n鍜屼釜鏁板拰out鐨勪釜鏁幫紝浜х敓閭?涓弬鏁頒釜鏁板尮閰嶇殑寮傛璋冪敤鍑芥暟錛?BR>鍐嶆潵鍥為【涓涓媘ethod1鐨勫畾涔夛細(xì)
鏄劇劧鏈変竴瀹氱殑澶嶆潅鎬э紝涓嶈繃鎴戣涓鴻繕鏄彲浠ュ鐞嗘帀鐨勩傛嬁3涓弬鏁扮殑鍋忕壒鍖栫増鏈潵璇存槑錛?/P>
class聽Method聽<Out<Ret>(A,B,C)>聽:聽public聽MethodBase聽<Out<Ret>,A,B,C>
{
};
template聽<class聽Ret=NullType,聽class聽A=NullType,聽class聽B=NullType,聽class聽C=NullType,聽class聽D=NullType,聽IN_COUNT=InCount<聽A,B,C,D>::value聽>
class聽MethodBase
{
};
閫氳繃瀵筂ethodBase綾葷殑IN錛緾OUNT鍙傛暟瀹氫箟鍋忕壒鍖栵紝鍗沖彲瀹氫箟鍑鴻繖浜涗笉鍚岀殑鐗堟湰銆?BR>
褰撶劧浠呬粎鏄煡閬撲簡IN鍙傛暟鐨勪釜鏁幫紝榪樻病鏈夋彁鍙栧嚭IN鍙傛暟鐨勭被鍨嬶紝鎵浠ヨ繕涓嶈兘鐢熸垚鍑芥暟鐨勫師鍨嬶紝鎴栬闇瑕佹妸typelist鍔犺繘鏉ヤ簡錛坙oki涓殑閭d釜錛夈?BR>
榪欐槸鍚庨潰瑕佽冭檻鐨勫唴瀹癸紝浠婂ぉ鍏堟兂鍒拌繖銆?/P>
榪欐鏃墮棿鑰冭檻瀹炵幇涓涓函C錛嬶紜鐨勫垎甯冨紡鏈嶅姟鍖呰搴擄紝綆瑕佹弿榪板涓嬶細(xì)
鏈夊涓嬬被鍜屽嚱鏁幫細(xì)
鎯蟲妸瀹冧滑浣滀負(fù)鏈嶅姟鍙戝竷鍑哄幓錛屼互SOAP鎴栧叾瀹冩柟寮忋傚彂甯冧負(fù)涓涓猅estService錛屽茍璁╁畠鎼哄甫澶氫竴浜涗俊鎭?
C錛嬶紜鏈夎澶氬伐鍏楓佸簱鏉ュ仛鍒拌繖鐐癸紝浣嗘槸錛岄兘闇瑕佺敓鎴愪竴鍫嗕唬鐮侊紝寰堟槸涓嶇埥銆?BR>
鍏跺畠璇█錛屾瘮濡俻ython, java, c#絳夛紝閮藉彲浠ラ氳繃鑷渷鏈哄埗錛屾姏寮IDL鍦ㄨ璦鍐呭疄鐜般?BR>
C錛嬶紜騫墮潪涓嶈兘鍋氳繖涓紝瀹冨彧鏄己灝戣凍澶熺殑綾誨瀷淇℃伅銆傛瘮濡備笂闈㈢殑渚嬪瓙錛屽鏋滆鍙戝竷涓烘湇鍔★紝閭d箞鑷沖皯搴旇鎶婂畠鐨勫弬鏁般佽繑鍥炲兼悶寰楁槑紜簺錛屽惁鍒欒涔堜細(xì)閫犳垚涓嶅繀瑕佺殑鍙傛暟浼犻掞紝瑕佷箞浼?xì)漶旂敓閿欒锛堟妸OUT鍙傛暟鍙栧煎彲涓嶆槸瀹夊叏鐨勶級銆?BR>
姣斿涓婇潰鍑虹幇鐨刬nt, int&, int*錛屽湪浣滀負(fù)in鍙傛暟鏃訛紝鎴戜滑鏄兂浼犻掑畠鐨勫鹼紝綾誨瀷涓篿nt銆傝宨nt*鍜宻tring*浣滀負(fù)out鍙傛暟鏃訛紝鎴戜滑鎯寵瀹冧紶閫掓寚閽堟垨寮曠敤錛屽綋璋冪敤榪斿洖鏃訛紝鎴戜滑緇欏畠璧嬪箋?BR>
C錛嬶紜璇█鐨勭被鍨嬫瀬涓轟赴瀵岋紝鍗存病鏈夋弿榪頒竴涓弬鏁板埌搴曟槸in榪樻槸out銆俲ava涔熸病鏈夛紝浣嗗畠鍙互姝e父搴忓垪鍖栦竴涓猲ull鍊鹼紝鍦–錛嬶紜涓紝榪欏彲鑳藉瓨鍦ㄤ竴浜涢夯鐑︺?BR>
鍐嶈冭檻涓涓媍har*綾誨瀷錛屽亣濡傚畠鏄痠n鍙傛暟錛岄偅涔堝畠鏄浼犻掍竴涓瓧絎﹁繕鏄竴涓瓧絎︿覆錛烠錛嬶紜璇█娌℃湁瀵瑰畠榪涜鎻忚堪銆?BR>
鎵浠ヨ瀹炵幇涓涓垎甯冨紡鏈嶅姟鍖呰錛堟垨浠g悊錛夊簱錛屽繀欏昏鍙戝竷鑰呮彁渚涜繖浜涗俊鎭?BR>
鎴戜滑鐭ラ亾錛岃鏌ヨ涓涓繙紼嬫湇鍔★紝蹇呴』鏌ヨ鐩稿簲涓繪満绔彛錛岃幏鍙栨湇鍔′俊鎭傛渶綆鍗曠殑鏈嶅姟淇℃伅鍖呮嫭錛氭湇鍔″垪琛紝姣忎釜鏈嶅姟涓殑鏂規(guī)硶鍒楄〃錛屾柟娉曠殑綾誨瀷錛堝寘鎷弬鏁板拰榪斿洖鍊肩被鍨嬶紝in/out淇℃伅絳夛級銆?BR>
瀹為檯涓婏紝鎴戜滑鏄涓篊錛嬶紜澧炲姞涓浜涚畝鍗曠殑鑷渷鑳藉姏銆備笂闈㈤偅涓湇鍔″彂甯冩帴鍙o紝瀹為檯涓婄榪欎釜瑕佹眰榪樻湁寰堣繙錛屽啀鏉ョ湅涓涓嬶細(xì)
鍙互鎯寵錛屽畠鏄病鏈変竴鐐硅嚜鐪佽兘鍔涚殑錛屾垜浠浣曞悜瀹冩煡璇紝瀹冪殑鍚嶅瓧錛熷畠鐨勬柟娉曞垪琛紵鏂規(guī)硶鐨勭被鍨嬶紵瀹冨浣曚笌Test綾葷殑鎴愬憳鍑芥暟浠ュ強test_func鍑芥暟鍏寵仈錛?/P>
浜屻佹柟鍚戙?BR>
瑕佽涓婇潰閭d釜鏈嶅姟鍏鋒湁鑷渷鑳藉姏錛岃鍋氱殑鎵╁厖鍏跺疄騫朵笉澶氥傝冭檻涓嬮潰鐨勪唬鐮侊細(xì)
榪欏嚑涓狹ethod鍙互鐢ㄨ嚜宸卞啓鐨勫鎵樼被鏉ュ仛銆?BR>
1銆佸亣濡傛垜浠湪TestService鐨勬瀯閫犲嚱鏁伴噷緇欏畠鍒嗛厤涓涓淭estService鈥濆悕瀛楋紝騫朵笖Service綾誨疄鐜頒簡鏌ヨ鍚嶅瓧鐨勬帴鍙o紝閭d箞瀹冨氨鐭ラ亾瀹冭嚜宸辯殑鍚嶅瓧浜嗐?BR>
2銆佸亣濡傚湪TestService鐨勬瀯閫犲嚱鏁伴噷涓哄悇涓狹ethod鍒嗛厤鍚嶅瓧錛屽茍涓旀敞鍐屽埌TestService錛岄偅涔堝畠?yōu)p兘澶熸煡璇㈡柟娉曞垪琛ㄣ?BR>
3銆佹柟娉曠殑綾誨瀷錛熼氳繃妯℃澘鏂瑰紡錛屾妸鍚勪釜鍙傛暟綾誨瀷鏀墮泦璧鋒潵錛岀粰涓瓧絎︿覆鍚嶇О灝卞彲浠ヤ簡銆?BR>
浣跨敤瀹忔潵瀹炵幇錛屽ぇ姒傚彲浠ュ啓鎴愯繖鏍鳳細(xì)
閫氳繃涓婇潰榪欏嚑涓畯錛屾垜浠兘澶熺敓鎴怲estService澹版槑銆?BR>
涓嶈繃錛屾湁鍑犱釜闂錛岀綏鍒楀涓嬶紝騫朵竴涓瑙e喅瀹冿細(xì)
1銆佸浣曟妸鍑芥暟鎸囬拡浼犵粰瀹冿紵濡備綍鎶婃柟娉曞悕縐頒紶緇欏畠錛?BR>榪欎釜鍙槸C錛嬶紜璇█涓烘垜浠鍔犱簡涓浜涢夯鐑︼紝鎴戜滑鏃犳硶鍦ㄥ畾涔夋垚鍛樼殑鍦版柟璋冪敤瀹冪殑鏋勯犲嚱鏁幫紝涓嶈繃榪欏茍涓嶄細(xì)閫犳垚澶氬ぇ闅滅銆?BR>涓婇潰鐨凪ETHOD瀹忓鏋滃彧鏄敓鎴愮被鐨勫0鏄庯紝閭d箞鍑芥暟鎸囬拡鍙互鐪佺暐銆傛垜鎶婂畠鍔犱笂鐨勫師鍥犳槸錛屽畠鍙互琚垜鐢–trl+C, Ctrl+V榪欑涓栫晫涓婃渶鍏堣繘鐨勬妧鏈師鏍鋒嫹璐濅笅鏉ワ紝騫朵笖閫氳繃綆鍗曚慨鏀圭殑鏂規(guī)硶瀹炵幇榪欑涓栫晫涓婃渶鍏堣繘鐨勯噸鐢ㄣ?BR>
涓婇潰鐨勪唬鐮佺粡榪囦慨鏀癸紝緇撴灉灝辨垚榪欐牱錛?/P>
鐪嬩笂鍘誨搴斿緱闈炲父鏁撮綈錛屼慨鏀硅搗鏉ヤ篃姣旇緝綆鍗曘備笂闈㈤偅閮ㄥ垎琚墿鍏呬負(fù)濡備笅浠g爜錛?/P>
鍩烘湰涓婇渶瑕佺殑涓滆タ閮藉湪榪欓噷浜嗐?BR>
2銆佸鎴風(fēng)鐨勯棶棰樸?BR>
涓婇潰榪欑鏄犲皠錛岀洿鎺ユ嬁鍒板鎴風(fēng)浼?xì)鏈夐棶棰樺Q孴est綾誨拰test_func鍑芥暟鎴戜滑騫朵笉鎵撶畻浜ょ粰瀹㈡埛绔紝鎵浠ヤ嬌鐢ㄥ嚱鏁版寚閽堜細(xì)鍑虹幇閾炬帴閿欒銆?BR>
瀹為檯涓婂鎴風(fēng)涓嶉渶瑕佽繖涓紝鎴戜滑鎯沖姙娉曟妸瀹冩嬁鎺夊氨琛屼簡銆傚鎴風(fēng)瀹為檯闇瑕佺敓鎴愮殑浠g爜濡備笅錛?BR>
榪樻槸涓婇潰鎻愬埌鐨勶紝C++緇欐垜浠甫鏉ョ殑楹葷儲銆傝繖嬈¢渶瑕佸彟涓緇勫畯鏉ュ畬鎴愬畠錛?/P>
METHOD*鍜孧ETHOD_DEFINE*瀹忕殑鍙傛暟閮芥湁涓浜涘浣欑殑淇℃伅錛屾病鏈夊幓鎺夋槸鍥犱負(fù)鏀懼湪涓璧峰鏄撶湅鍒板啓閿欑殑鍦版柟銆傦紙榪欎釜鎶宸ф潵婧愪簬鍓嶅嚑澶╃湅鐨勪竴綃嘊LOG錛屽緢鎶ユ瓑娌℃湁璁頒笅鍦板潃錛?BR>
3銆佷嬌鐢ㄧ殑闂銆?BR>
濡備綍鎵嶈兘姣旇緝鏂逛究鍦頒嬌鐢紵鎴戣冭檻浜嗕笅闈㈣繖縐嶆柟寮忥細(xì)

Method::operator ()鐨勫悇涓弬鏁伴兘灝嗗彲浠ユ帴鍙楃浉瀹圭殑綾誨瀷錛屽儚涓婇潰涓鏍鳳紝鍥犱負(fù)鍦═estService涓垜浠凡緇忓畾涔変簡瀹冭浼犺緭鐨勫肩殑綾誨瀷銆?BR>
a.NONE鏄粈涔堬紵鍏跺疄鏄負(fù)寮傛璋冪敤鑰冭檻鐨勩傚亣濡傛寚瀹氭煇涓狾UT鍙傛暟涓篘ONE錛屽垯榪欎釜鍙傛暟鐨勫煎茍涓嶇湡姝g殑OUT錛岃屾槸淇濆瓨鍦∕ethod涓傚疄闄呬笂Method涓繚瀛樻瘡涓弬鏁扮殑鍊箋?BR>
b.Method涓嶴ervice濡備綍鍙戠敓鍏崇郴錛?BR>浠嶵estService鐨勫畾涔変腑鎴戜滑鐭ラ亾錛孧ethod鍚慡ervice娉ㄥ唽鑷繁浠ュ疄鐜拌嚜鐪侊紝浣嗗畠鍚屾椂涔熶細(xì)淇濆瓨Service鐨勬寚鍚戙?BR>鎴戜滑鐨凱roxy瀹為檯涓婃槸涓涓戶鎵挎ā鏉匡紝涓婇潰騫舵病鏈夋妸瀹冩寚鍑烘潵銆傚畠鐨勫畾涔夋槸錛?/P>

鎵浠ユ垜浠殑TestService鍏跺疄涔熸槸妯℃澘綾伙紝瀹冨皢浣跨敤XProxy涓畾涔夌殑搴忓垪鍖栫被銆俋Proxy灝嗗疄鐜癝ervice鍩虹被涓簭鍒楀寲铏氬嚱鏁頒互鍙婅皟鐢ㄨ櫄鍑芥暟銆?BR>
褰撲竴涓狹ethod璋冪敤鏃訛紝瀹冧細(xì)璋冪敤Service鐨勫簭鍒楀寲錛岀敱浜庤閲嶅啓浜嗭紝鎵浠ヨ皟鐢ㄧ殑鏄疿Proxy涓殑搴忓垪鍖栨柟娉曘傝繖涓柟娉曚細(xì)鎶婅繖涓狹ethod鐨勫悇in/inout鍙傛暟搴忓垪鍖栵紝鐒跺悗鎵ц榪滅▼璋冪敤錛屽啀鎶婅皟鐢ㄧ粨鏋滃弽搴忓垪鍖栫粰inout/out鍙傛暟銆?BR>
4銆佸叾瀹冩兂娉曘?BR>
鍦ㄨ冭檻涓婇潰鐨勫畾涔夋柟寮忔椂錛屾垜涔熻冭檻浜嗗叾瀹冩柟寮忥紝涓昏鏄繑鍥炲煎鐞嗙殑鏂規(guī)硶錛岀畝榪板涓嬨?BR>
鍓嶉潰鎴戜滑鍋囪浜嗕竴孌靛皢琚紑鏀句負(fù)榪滅▼鏈嶅姟鐨勪唬鐮侊細(xì)
鍦ㄥ墠闈㈢殑鍋氭硶涓紝鎴戜滑鐨勬湇鍔℃弿榪版槸鏀懼湪閭d竴緇勫畯閲岄潰錛屽ソ澶勬槸涓嶇敤鏀硅繖孌典唬鐮侊紝鍧忓灝辨槸浠g爜瀹氫箟鐨勫湴鏂瑰拰鎻忚堪涓嶅湪涓璧鳳紝鍗忚皟鍙兘浼?xì)鏈変竴浜涗笉渚褲?BR>
鎴戜篃鑰冭檻浜嗗彟涓縐嶅仛娉曪細(xì)
瀵逛簬瀹炵幇浠g爜錛屽彧闇瑕佷慨鏀硅繑鍥炲間負(fù)void鐨勫嚱鏁幫紝鎶妑eturn;淇敼涓簉eturn VOID;錛屽茍涓斾負(fù)娌℃湁鍐欐璇彞鐨勫垎鏀姞涓婃鍙ャ?BR>
VOID鏄竴涓壒孌婄被鍨嬬殑闈欐佸彉閲忥紝涓撲負(fù)void榪斿洖鍊肩殑鍑芥暟璁懼畾銆?BR>
榪欑鍋氭硶淇敼浜嗗師鏈夌殑浠g爜錛屼笉榪囧湪瀹氫箟鏈嶅姟鏃跺彲浠ヨ妭鐪佷竴浜涘伐浣滐細(xì)
瀹冩墍闇瑕佺殑鍑芥暟綾誨瀷錛屽皢鐢卞嚱鏁版寚閽堟帹瀵箋?BR>
鍦℅錛嬶紜緙栬瘧鍣ㄤ笅錛屽彲浠ヤ嬌鐢╰ypeof鏉ヨ幏寰楀嚱鏁版寚閽堢殑綾誨瀷鑰屼笉闇瑕佺湡寰楄幏寰楀嚱鏁版寚閽堝鹼紝涓嶈繃鐩墠浠呬粎鍦℅錛嬶紜涓嬪彲鐢ㄣ傦紙欏轟究璇翠竴涓嬶紝typeof宸茬粡鍒楀叆c++0x錛?BR>
鏈緇堟垜鏀懼純浜嗚繖涓兂娉曪紝姣曠珶瀹冭淇敼鐜版湁鐨勪唬鐮侊紝鏌愪簺鎯呭喌涓嬭繖鏄笉鍙兘鐨勶紝鑰屼笖typeof鐩墠涔熶笉鑳借法緙栬瘧鍣ㄣ?BR>
涓夈佸疄鐜般?BR>
鑰佸疄璇存垜鐜板湪榪樻病鏈変竴浠藉畬鏁寸殑鎴栧崐瀹屾暣鐨勫疄鐜幫紝澶ч儴鍒嗘兂娉曡繕鍦ㄥご鑴戜腑錛屾祴璇曚唬鐮佸掓槸鍐欎簡涓嶅皯錛屼富瑕佹槸鐢ㄦ潵嫻嬭瘯涓婅堪鎯蟲硶鑳藉惁瀹炵幇錛屾垜鎯沖ぇ閮ㄥ垎鎯呭喌閮藉凡緇忔祴璇曚簡錛屽彧闇瑕佹湁鏃墮棿鏉ユ妸瀹冨疄鐜板嚭鏉ャ?BR>
榪欐槸鎴戣繎鏈熻鍋氱殑浜嬩箣涓錛屼簤鍙栨湀鍐呮妸瀹冨仛瀹岀艦銆?/P>