锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美伦理91i,最新69国产成人精品视频免费,国内一区二区在线视频观看http://m.shnenglu.com/yishanhante/category/3741.htmlzh-cnWed, 21 May 2008 21:24:54 GMTWed, 21 May 2008 21:24:54 GMT60COM Objects and Interfaceshttp://m.shnenglu.com/yishanhante/articles/19716.htmljayjayTue, 13 Mar 2007 05:57:00 GMThttp://m.shnenglu.com/yishanhante/articles/19716.htmlhttp://m.shnenglu.com/yishanhante/comments/19716.htmlhttp://m.shnenglu.com/yishanhante/articles/19716.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/19716.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/19716.html 涓涓璞″疄鐜頒竴涓帴鍙o紝浠栫殑鎰忔濆氨鏄瀵硅薄浣跨敤浠g爜瀹炵幇浜嗘帴鍙g殑姣忎釜鏂規(guī)硶

騫朵笖涓鴻繖浜涘嚱鏁伴氬悜 com 搴撴彁渚涗簡 com 鐨勪簩榪涘埗鎸囬拡銆傜劧鍚?/span> com 浣胯繖浜涘嚱鏁拌繍琛屽湪

璇鋒眰浜嗕竴涓寚鍚戣鎺ュ彛鐨勪換浣曞鎴風銆?/font>

Interfaces and Interface Implementations

COM 鍦ㄦ帴鍙g殑瀹氫箟鍜屽疄鐜頒笂鏈夋牴鏈殑宸埆銆備竴涓帴鍙e疄闄呬笂鏄敱涓緇勫畾涔変簡鐢ㄦ硶鐨勭浉

鑱旂郴鐨勫嚱鏁板師鍨嬬粍鎴愶紝鍙槸浠栦笉鑳藉琚疄鐜般傝繖浜涘嚱鏁板師鍨嬪氨鐩稿綋浜?/span> C++ 涓惈鏈夌函铏氭嫙鍑芥暟鐨勫熀綾匯備竴涓帴鍙e畾涔夊埗瀹氫簡鎺ュ彛鐨勬垚鍛樺嚱鏁般佽皟鐢ㄦ柟娉曘佽繑鍥炵被鍨嬨佷粬浠殑鍙傛暟鐨勬暟閲忓拰綾誨瀷錛岃繖浜涘嚱鏁拌騫蹭粈涔堛備絾鏄繖閲屽茍娌℃湁涓庢帴鍙e疄鐜扮浉鍏崇殑涓滆タ銆備竴涓帴鍙g殑瀹炵幇灝辨槸紼嬪簭鍛樺湪涓涓熷彛瀹氫箟涓婃彁渚涚殑鎵ц鐩稿叧鍔ㄤ綔鐨勪唬鐮併?/span>

聽聽聽聽 涓涓帴鍙g殑瀹炵幇灝辨槸紼嬪簭鍛樺湪涓涓熷彛瀹氫箟涓婃彁渚涚殑鎵ц鐩稿叧鍔ㄤ綔鐨勪唬鐮併傚鎴瘋皟鐢ㄥ畬鍏ㄦ槸鍐沖畾浜庢帴鍙g殑瀹氫箟銆?/span>

Interface Pointers and Interfaces

鎺ュ彛瀹炵幇鐨勪竴涓疄渚嬶紝瀹為檯涓婂氨鏄竴涓寚鍚戜竴緇勬柟娉曠殑鎸囬拡錛屽嵆鏄寚鎸囧悜涓涓帴鍙g殑鍑?/font> 鏁拌〃錛岃鍑芥暟琛ㄥ紩鐢ㄤ簡璇ユ帴鍙f墍鏈夋柟娉曠殑瀹炵幇銆?/font>

聽聽聽聽 姣忎釜鎺ュ彛錛屾槸涓涓浐瀹氱殑涓緇勬柟娉曠殑闆嗗悎錛屽湪榪愯鏃墮氳繃 globally unique interface identifier (IID) 鏉ュ畾浣嶃傝繖閲岋紝 IID 鏄?/span> com 鏀寔鐨?/span> globally unique identifier (GUID) 鐨勭壒孌婄殑瀹炰緥銆傝繖鏍峰仛灝變笉浼氫駭鐢熷崟涓緋葷粺涓婄浉鍚屽悕瀛椼佹帴鍙g殑澶氫釜鐗堟湰鐨?/span> COM 涔嬮棿鐨勫啿紿佷簡銆?/span>

  • 涓涓?span lang="EN-US">COM鎺ュ彛涓嶤++綾繪槸涓嶄竴鏍風殑錛?/span>
  • 涓涓?span lang="EN-US">COM鎺ュ彛涓嶆槸涓涓璞♀斺斾粬鍙槸綆鍗曠殑鍏寵仈涓緇勫嚱鏁幫紝鏄鎴峰拰紼嬪簭涔嬮棿閫氫俊鐨勪簩榪涘埗鏍囧噯銆傚彧瑕佷粬鎻愪緵浜嗘寚鍚戝熷彛鏂規(guī)硶鐨勬寚閽堬紝榪欎釜瀵硅薄灝卞彲浠ョ敤浠諱綍璇█鏉ュ疄鐜頒粬銆傦紱
  • COM鎺ュ彛鍗佸己綾誨瀷鐨勨斺旀瘡涓帴鍙f湁浠栬嚜宸辯殑鍊熷彛鏍囪瘑絎︼紱

聽聽聽聽聽聽聽聽 COM鎺ュ彛鐨勪笉鍙樻р斺斾綘涓嶈兘澶熺敤鑰佺増鏈殑鎺ュ彛鏍囪瘑絎﹀畾涔夋柊鐨勭増鏈紝鎺ュ彛鐨処ID瀹氫箟鐨勬帴鍙e悎鍚屾槸鏄庣‘鐨勩佸敮涓鐨?/span> 銆?/span>

IUnknown and Interface Inheritance

聽聽聽聽 緇ф壙鍦?/span> COM 閲屽茍涓嶆剰鍛崇潃浠g爜鐨勯噸鐢ㄣ傚洜涓烘帴鍙f病鏈夊疄鐜板叧鑱旓紝鍊熷彛緇ф壙騫舵剰鍛崇潃浠g爜緇ф壙銆備粬鐨勬剰鎬濅粎浠呮槸錛屼竴涓帴鍙e悓涓涓悎鍚屽叧鑱旓紝灝卞儚 C++ 鐨勭函铏氭嫙鍩虹被鐨勫垱寤哄拰淇敼鏍鳳紝鍙互娣誨姞鏂規(guī)硶鎴栬呮洿榪涗竴姝ョ殑鍔犲己鏂規(guī)硶鐨勪嬌鐢ㄣ傚湪 COM 閲屾病鏈夐夋嫨鎬х戶鎵褲傚鏋滀竴涓帴鍙g敱鍙︿竴涓帴鍙g戶鎵跨殑璇濓紝浠栧氨鍖呭惈浜嗗彟涓涓帴鍙e畾涔夌殑鎵鏈夌殑鏂規(guī)硶銆?/span>

Using and Implementing IUnknown

聽聽聽 COM 涓哄疄鐜板拰浣跨敤瀵硅薄鍜屽璞$殑鍐呴儴閫氫俊鎻愪緵浜嗕竴涓赴瀵岀殑鏍囧噯闆嗗悎銆傚IUnknown鎺ュ彛鐨勫疄鐜板拰浣跨敤鐨勭粏鑺傦紝璇峰弬瑙佷笅闈富棰橈細QueryInterface: Navigating in an Object 銆偮?o:p>

聽聽聽

Rules for Implementing QueryInterface

綆$悊瀹炵幇涓涓?span lang="EN-US">COM瀵硅薄鐨?/span> IUnknown::QueryInterface 鏂規(guī)硶鐨勪笁涓富瑕佽鍒欙細

聽聽聽 1錛庡璞″繀欏昏鏈変竴涓爣璇嗙錛?/font>

聽聽聽 2錛庝竴涓璞″疄渚嬬殑鎺ュ彛闆嗗悎蹇呴』鏄潤鎬佺殑錛?b style="mso-bidi-font-weight: normal">static錛夛紱

聽聽聽 3錛庡湪瀵硅薄涓粠浠諱綍涓涓叾浠栫殑鎺ュ彛鏌ヨ姝ゆ帴鍙i兘搴旇鎴愬姛銆?/span>

閫氳繃寮曠敤璁℃暟鏉ョ鐞嗗璞$殑鐢熷懡鍛ㄦ湡

聽聽聽聽 浣跨敤 AddRef 錛堬級 聽聽聽 //澧炲姞寮曠敤
聽聽聽聽聽聽聽聽聽聽聽聽聽 聽 Realase錛堬級聽聽 //鍑忓皯寮曠敤



jay 2007-03-13 13:57 鍙戣〃璇勮
]]>
ATL3.0涓殑紿楀彛綾伙紙3錛?/title><link>http://m.shnenglu.com/yishanhante/articles/19690.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 13 Mar 2007 02:08:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19690.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19690.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19690.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19690.html</trackback:ping><description><![CDATA[ <strong>ATL涓殑瀵硅瘽妗嗙被錛?/strong> <br />鐜板湪鎴戜滑瀵笰TL涓殑紿楀彛綾繪湁浜嗕竴瀹氱殑浜嗚В錛屾帴鐫鎴戜滑鏉ュ涔犲璇濇綾匯傚湪浣犵殑欏圭洰涓紝鍙兘鏈夊緢澶氬璇濇璧勬簮錛屼粠鏈綆鍗曠殑鈥滃叧浜庘濇ā寮忓璇濇鍒板鏉傜殑婊℃槸鎺т歡鐨勯潪妯″紡瀵硅瘽妗嗐侫TL鎻愪緵浜咰SimpleDialog綾誨拰CDialogImpl綾繪潵綆鍖栨垜浠嬌鐢ㄥ璇濇璧勬簮鐨勮繃紼嬨?<br /><br />CSimpleDialog <br />CSimpleDialog鏄竴涓粠妯$増鍒涘緩妯″紡瀵硅瘽妗嗙殑綾匯傚畠鎻愪緵浜嗕竴浜涙爣鍑嗘寜綰斤紙濡侽K鍜孋ANCEL錛夌殑澶勭悊榪囩▼銆備綘鍙互灝咰SimpleDialog鎯寵薄鎴愭槸涓縐嶆秷鎭璇濇錛圡essage Box錛夛紝涓嶅悓鐨勬槸浣犲彲浠ュ湪瀵硅瘽妗嗙紪杈戝櫒涓紪杈戝畠鐨勫瑙傘?<br /><br />瑕佹樉紺鴻繖鏍蜂竴涓璇濇錛屾瘮濡傚綋浣犵偣鍑燴滃府鍔┾濊彍鍗曚腑鐨勨滃叧浜庘濊彍鍗曢」鏃舵樉紺哄叧浜庡璇濇錛屼綘闇瑕佸湪涓葷獥鍙g被涓坊鍔犲涓嬬殑娑堟伅鏄犲皠錛?<pre>BEGIN_MSG_MAP( CMyMainWindow ) COMMAND_ID_HANDLER( ID_HELP_ABOUT, onHelpAbout ) ... LRESULT onHelpAbout( WORD, WORD, HWND, BOOL& ) { CSimpleDialog<IDD_DIALOG1> dlg; int ret = dlg.DoModal(); return 0; }</pre>鎴戜滑鍙互鐪嬪埌瀵硅瘽妗嗚祫婧愮殑ID錛圛DD_DIALOG1錛夎浣滀負涓涓ā鐗堝弬鏁頒紶閫掔粰CSimpleDialog綾伙紝DoModal鏂規(guī)硶鏄劇ず瀵硅瘽妗嗐傚綋鐢ㄦ埛鐐瑰嚮OK鎸夐挳鏃訛紝CSimpleDialog綾誨叧闂璇濇騫惰繑鍥炴寜閽殑ID銆傦紙CSimpleDialog綾誨疄鐜頒簡瀵規(guī)寜閽甀DOK錛孖DCANCEL錛孖DABORT錛孖DRETRY錛孖DIGNORE錛孖DYES鍜孖DNO鐨勫搷搴斻傦級 <br /><br />CDialogImpl <br />CSimpleDialog綾誨彧鑳藉澶勭悊綆鍗曠殑妯″紡瀵硅瘽妗嗭紝瀵逛簬鏇村姞澶嶆潅鐨勫璇濇鎴栬呮ā寮忓璇濇錛屽氨瑕佺敤鍒癈DialogImpl綾匯傦紙鍏跺疄CSimpleDialog鏄疌DialogImpl涓殑涓縐嶇壒渚嬨傦級 <br /><br />濡傛灉鎴戜滑闇瑕佸疄鐜頒竴涓潪妯″紡瀵硅瘽妗嗭紝鎴戜滑蹇呴』浠嶤DialogImpl媧劇敓鍑轟竴涓柊綾伙紝騫跺皢鏂扮被鐨勭被鍚嶄綔涓烘ā鏉垮弬鏁頒紶閫掔粰CDialogImpl綾伙紝灝辮薄鍓嶉潰鐨凜WindowImpl涓鏍鳳細 <pre>class CMyModelessDialog: public CDialogImpl<cmymodelessdialog> { </cmymodelessdialog></pre>鍜孋SimpleDialog涓嶅悓錛屾垜浠笉闇瑕佸皢瀵硅瘽妗嗚祫婧愮殑ID浣滀負妯℃澘鍙傛暟浼犻掔粰瀹冿紝浣嗘槸鎴戜滑蹇呴』灝嗚繖涓被鍜屽璇濇璧勬簮鑱旂郴璧鋒潵錛屾垜浠氳繃鍦ㄧ被涓畾涔変竴涓灇涓懼彉閲忓疄鐜幫細 <pre>public: enum { IDD = IDD_DIALOG1 }; </pre>鐒跺悗瀹氫箟娑堟伅鏄犲皠琛細 <pre>BEGIN_MSG_MAP( CMyDialog ) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) MESSAGE_HANDLER( WM_CLOSE, OnClose ) ... END_MSG_MAP() </pre>鍝嶅簲鍑芥暟鐨勫畾涔夊拰鍓嶉潰鐨勪竴鏍鳳紝浣嗘槸鏈変竴鐐歸渶瑕佹敞鎰忥紝濡傛灉浣犲疄鐜扮殑鏄竴涓潪妯″紡瀵硅瘽妗嗭紝閭d箞鍦╓M_CLOSE娑堟伅鐨勫搷搴斿嚱鏁頒腑蹇呴』璋冪敤DestroyWindow錛?pre>LRESULT OnClose( UINT, WPARAM, LPARAM, BOOL& ) { DestroyWindow(); return 0; } ... }; // CMyModelessDialog </pre>瑕佸湪灞忓箷涓婂垱寤鴻繖鏍蜂竴涓璇濇錛岄渶瑕佸垱寤鴻繖涓被鐨勪竴涓疄渚嬪茍璋冪敤Create鏂規(guī)硶錛?<pre>CMyModelessDialog dlg; dlg.Create( wndParent ); </pre>濡傛灉瀵硅瘽妗嗚祫婧愭病鏈夐変腑WS_VISIBLE灞炴э紝鎴戜滑闇瑕佽繖鏍瘋瀵硅瘽妗嗘樉紺哄嚭鏉ワ細 <pre>dlg.ShowWindow( SW_SHOW );</pre>涓嬮潰鐨勪緥瀛愭湁涓涓潪妯″紡鐨勫璇濇鍙互鎺ュ彈鐢ㄦ埛杈撳叆鐨勫瓧絎︿覆錛岀劧鍚庡湪涓葷獥鍙d腑鏄劇ず榪欎釜瀛楃涓層傚璇濇涓湁涓涓紪杈戞鎺т歡鍜屼竴涓寜閽紱褰撴寜閽鐐瑰嚮鏃訛紝瀵硅瘽妗嗚皟鐢ㄥ畠鎵灞炵獥鍙g殑DoSomething鏂規(guī)硶瀵圭紪杈戞涓殑瀛楃涓茶繘琛屽鐞嗭紝瀹冩墍灞炵殑紿楀彛鏄竴涓秴綾誨寲鐨勫垪琛ㄦ鎺т歡錛孌oSomething鏂規(guī)硶鐨勫姛鑳芥槸灝嗗瓧絎︿覆娣誨姞鍒板垪琛ㄦ涓?<pre>#include "atlbase.h" CComModule _Module; #include "atlwin.h" #include "resource.h" class CMyWindow: public CWindowImpl<CMyWindow> { public: DECLARE_WND_SUPERCLASS( "MyWindow", "listbox" ) BEGIN_MSG_MAP( CMyWindow ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) END_MSG_MAP() LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ) { PostQuitMessage( 0 ); return 0; } void DoSomething( LPCTSTR s ) { SendMessage( LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(s) ); } }; class CMyDialog: public CDialogImpl<CMyDialog> { public: enum { IDD = IDD_DIALOG1 }; BEGIN_MSG_MAP( CMyDialog ) COMMAND_ID_HANDLER( IDC_BUTTON1, OnButton ) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) MESSAGE_HANDLER( WM_CLOSE, OnClose ) END_MSG_MAP() LRESULT OnButton(WORD, WORD, HWND, BOOL&) { char buf[100]; m_ed.GetWindowText( buf, 100 ); m_owner.DoSomething( buf ); return 0; } LRESULT OnInitDialog( UINT, WPARAM, LPARAM, BOOL& ) { m_owner.Attach( GetParent() ); CenterWindow( m_owner ); m_ed = GetDlgItem( IDC_EDIT1 ); return TRUE; } LRESULT OnClose( UINT, WPARAM, LPARAM, BOOL& ) { DestroyWindow(); m_owner.Detach(); return 0; } CMyWindow m_owner; CWindow m_ed; }; CMyDialog dlg; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { _Module.Init( NULL, hInstance ); CMyWindow win; win.Create( NULL, CWindow::rcDefault, _T("modeless dialog test"), WS_OVERLAPPEDWINDOW|WS_VISIBLE ); dlg.Create( win ); dlg.ShowWindow( SW_SHOW ); MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ){ if( !IsWindow(dlg) || !dlg.IsDialogMessage( &msg ) ){ DispatchMessage( &msg ); } } _Module.Term(); return 0; } </pre><strong><a id="A13" name="A13"></a>鎸囧畾紿楀彛綾葷殑淇℃伅錛?/strong><br />榪欑瘒鏂囩珷鐨勫ぇ閮ㄥ垎鍐呭閮芥槸鍦ㄨ榪版庢牱澶勭悊紿楀彛綾葷殑琛屼負鈥斺旂獥鍙f庢牱鍝嶅簲娑堟伅銆傚湪琛屼負涔嬪錛屼竴涓獥鍙g被榪樺叿鏈変竴浜涘叾瀹冪殑閲嶈鐨勫睘鎬э紝姣斿鏍峰紡銆佺被鍚嶃佽儗鏅鑹插拰鎸囬拡絳夌瓑銆傝繖涓鑺備粙緇嶆庢牱浣跨敤ATL涓彁渚涚殑瀹忔潵鎸囧畾榪欎簺灞炴с?<br /><br />浣跨敤Window Traits鎸囧畾紿楀彛鐨勬牱寮?<br />鍒扮洰鍓嶄負姝紝鎵鏈変緥瀛愪腑鐨勭獥鍙f牱寮忛兘鏄湪璋冪敤Create鏂規(guī)硶鏃舵寚瀹氱殑錛?<pre>CMyWindow wnd; wnd.Create( NULL, CWindow::rcDefault, _T("Hello"), WS_OVERLAPPEDWINDOW|WS_VISIBLE ); </pre>濡傛灉浣犱笉鎸囧畾浠諱綍鏍峰紡鍜屾墿灞曟牱寮忥紝ATL灝嗕嬌鐢ㄩ粯璁ょ殑鏍峰紡錛涜繖浜涢粯璁ょ殑鏍峰紡鏄綔涓虹獥鍙g殑鐗瑰緛瀹氫箟鐨勶紝榛樿鐗瑰緛鏄疌ControlWinTraits錛屽畾涔夊涓嬶細<pre>typedef CWinTraits<WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN |WS_CLIPSIBLINGS, 0> CControlWinTraits; </pre>CWinTraits鏄竴涓ā鏉跨被錛屽畠闇瑕?涓弬鏁幫細紿楀彛鏍峰紡銆佹墿灞曠獥鍙f牱寮忋?<br /><br />鍦–WindowImpl鐨勫畾涔変腑錛孋ControlWinTraits浣滀負榛樿鐨勬ā鏉垮弬鏁頒紶閫掔粰CWindowImpl錛?<pre>template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl : public ... </pre>鎵浠ュ湪榛樿鎯呭喌涓嬶紝浠嶤WindowImpl媧劇敓鐨勭獥鍙i兘鍏鋒湁鍙銆佸瓙紿楀彛銆佽鍓厔寮熺獥鍙c佽鍑忓瓙紿楀彛鐨勫睘鎬с?<br /><br />鎴戜滑涔熻兘瀹氫箟鑷繁鐨勭獥鍙g壒寰侊細 <pre>typedef CWinTraits<WS_OVERLAPPEDWINDOW|WS_VISIBLE,0> MyTraits; </pre>鐒跺悗錛屼粠CWindowImpl媧劇敓涓涓獥鍙g被錛屾寚瀹氳嚜宸辯殑紿楀彛鐗瑰緛錛?<pre>class CMyWindow: public CWindowImpl<CMyWindow,CWindow,MyTraits> {...}; </pre>鎴栬呰薄涓嬮潰榪欐牱鏇村姞鐩存帴錛?<pre>class CMyWindow: public CWindowImpl< CMyWindow, CWindow, CWinTraits<WS_OVERLAPPEDWINDOW|WS_VISIBLE,0> > {...};</pre>娉ㄦ剰錛屾垜浠繀欏繪彁渚涘叏閮ㄧ殑涓変釜妯℃澘鍙傛暟錛氭淳鐢熺被錛屽熀綾伙紙CWindow錛夊拰鐗瑰緛綾匯?<br /><br />CMyWindow紿楀彛鐜板湪鍏鋒湁鐨勯粯璁ょ殑鏍峰紡涓衡滃彲瑙佺殑寮瑰嚭紿楀彛鈥濓紝鎵浠ユ垜浠彲浠ュ湪Create鏂規(guī)硶涓渷鐣ユ牱寮忓弬鏁幫細 <pre>CMyWindow wnd; wnd.Create( NULL, CWindow::rcDefault, _T("Hello") ); // style: WS_OVERLAPPEDWINDOW|WS_VISIBLE </pre>鎴戜滑涔熷彲浠ラ噸鍐欑獥鍙g壒寰侊細<pre>ovwnd.Create( NULL, CWindow::rcDefault, _T("Hello"), WS_OVERLAPPEDWINDOW ); // not visible </pre>紿楀彛鐗瑰緛涔熷彲浠ュ寘鍚墿灞曟牱寮忥細<pre>class CClientWindow: public CWindowImpl<CClientWindow, CWindow, CWinTraits< WS_OVERLAPPEDWINDOW|WS_VISIBLE, WS_EX_CLIENTEDGE > > {...}; </pre>DECLARE_WND_CLASS <br />浣跨敤DECLARE_WND_CLASS瀹忓彲浠ユ寚瀹氱獥鍙g殑綾誨悕錛?<pre>DECLARE_WND_CLASS("my window class");</pre>榪欑瓑浠蜂簬錛?pre>DECLARE_WND_CLASS_EX( "my window class", CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, // default style COLOR_WINDOW // default color ); </pre>DECLARE_WND_CLASS_EX <br />浣跨敤DECLARE_WND_CLASS_EX瀹忓彲浠ユ寚瀹氱獥鍙g被鍚嶃佹牱寮忓拰鑳屾櫙棰滆壊錛?<pre>class CMyWindow: public CWindowImpl<CMyWindow> { public: DECLARE_WND_CLASS_EX( "my window class", // class name CS_HREDRAW|CS_VREDRAW, // class style COLOR_WINDOW // background color ); BEGIN_MSG_MAP(CMyWindow) ... </pre>鎵璋撶殑紿楀彛綾誨悕鏄寚娉ㄥ唽鐨勭獥鍙g被鐨勫悕瀛楋紝濡傛灉鎴戜滑涓嶆寚瀹氱獥鍙g被鍚嶏紝ATL灝嗚嚜鍔ㄧ敓鎴愪竴涓紝浣嗘槸褰撴垜浠嬌鐢⊿py++涔嬬被鐨勫伐鍏風殑鏃跺欙紝浣犲皢浼氬彂鐜版垜浠嚜宸卞彇鐨勭被鍚嶆瘮"ATL:00424bd0"涔嬬被鐨勫悕瀛楄鏈夌敤寰楀銆?<br /><br />綾繪牱寮忔槸鎸夌収鎸変綅鎴栫粍鍚堢殑銆?<br /><br />鑳屾櫙棰滆壊蹇呴』鏄爣鍑嗙郴緇熼鑹蹭箣涓銆?<br /><br />CWndClassInfo <br />鎴戜滑涔熷彲浠ュ畾涔夎秴鍑篋ECLARE_WND_瀹忚兘鍔涗箣澶栫殑紿楀彛綾匯傚鏋滀綘鐪嬬湅DECLARE_WND_CLASS鐨勫畾涔変綘灝變細鍙戠幇瀹冨畾涔変簡涓涓狢WndClassInfo緇撴瀯錛屽茍涓斾竴涓嚱鏁拌繑鍥炶繖縐嶇粨鏋勭被鍨嬬殑鍊鹼細 <pre>#define DECLARE_WND_CLASS(WndClassName) \ static CWndClassInfo& GetWndClassInfo() \ { \ static CWndClassInfo wc = \ { \ { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, \ StartWindowProc, \ 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, \ WndClassName, NULL }, \ NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \ }; \ return wc; \ } </pre>CWndClassInfo緇撴瀯鎻愪緵浜嗘洿鐏墊椿鐨勮嚜瀹氫箟鐨勫彲鑳斤紝瀹冩槸榪欐牱瀹氫箟鐨勶細 <pre>struct CWndClassInfo { struct WNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; HICON hIconSm; } m_wc; LPCSTR m_lpszOrigName; WNDPROC pWndProc; LPCSTR m_lpszCursorID; BOOL m_bSystemCursor; ATOM m_atom; CHAR m_szAutoName[13]; ATOM Register(WNDPROC* p); }; </pre>渚嬪錛岃鎸囧畾涓涓獥鍙g殑鎸囬拡錛屾垜浠彲浠ュ皢m_lpszCursorID璁劇疆涓烘寚閽堢殑鍚嶅瓧錛屽鏋滃畠鏄竴涓郴緇熸寚閽堬紝灝唌_bSystemCursor璁劇疆涓篢RUE錛屽惁鍒欒緗負FALSE銆傛敞鎰廌ECLARE_WND_CLASS瀹忔槸鎬庢牱灝嗚繖涓や釜鎴愬憳鍙橀噺鍒嗗埆璁劇疆涓篒DC_ARROW 鍜?TRUE鐨勩傛棦鐒禗ECLARE_WND_瀹忎笉鑳借鎴戜滑鏀瑰啓榪欎簺榛樿鐨勫鹼紝鎴戜滑鍙互榪欐牱鍋氾細 <pre>class CMyWindow: public CWindowImpl<CMyWindow> { public: static CWndClassInfo& GetWndClassInfo() { // a manual DECLARE_WND_CLASS macro expansion // modified to specify an application-defined cursor: static CWndClassInfo wc = { { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, "MyWindow", NULL }, NULL, NULL, MAKEINTRESOURCE(IDC_CURSOR1), FALSE, 0, _T("") }; return wc; } ... </pre><strong><a name="A14"></a>緇撹錛?/strong><br />ATL鎻愪緵浜嗕竴縐嶇畝鍗曠殑銆侀泤鑷寸殑騫朵笖鍔熻兘寮哄ぇ鐨勭獥鍙g紪紼嬫ā寮忋傚湪閭d簺鏂逛究鐨勫皝瑁呭ソ浜嗙殑鍑芥暟銆佹秷鎭槧灝勫拰瀹忎箣澶栵紝榪樻湁涓浜涙妧鏈濡傞摼鎺ャ佺獥鍙g殑瀛愮被鍖栧拰瓚呯被鍖栥佽鍖呭惈鐨勭獥鍙e拰娑堟伅鍙嶅皠絳変篃浣垮緱璁捐鍜屽疄鐜扮獥鍙e拰瀵硅瘽妗嗛潪甯哥伒媧匯傛垨璁窤TL緇欎漢鏈娣辯殑鍗拌薄灝辨槸錛氬姛鑳藉己澶с佺伒媧繪уソ錛屼絾鏄笉浼氬崰鐢ㄥお澶氱殑鍐呭瓨鍜岀郴緇熷紑閿銆?img src ="http://m.shnenglu.com/yishanhante/aggbug/19690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-13 10:08 <a href="http://m.shnenglu.com/yishanhante/articles/19690.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ATL3.0涓殑紿楀彛綾伙紙2錛?/title><link>http://m.shnenglu.com/yishanhante/articles/19689.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 13 Mar 2007 02:07:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19689.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19689.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19689.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19689.html</trackback:ping><description><![CDATA[ <div> <a id="A10" name="A10"> </a> <strong>琚寘鍚殑紿楀彛錛?/strong> <br />涓涓鍖呭惈鐨勭獥鍙f槸涓涓笉鍝嶅簲浠諱綍娑堟伅鐨勭獥鍙o紝瀹冨皢鏀跺埌鐨勬墍鏈夋秷鎭噸鏂板彂閫佸埌鍙﹀涓涓獥鍙g殑娑堟伅鏄犲皠錛岃繖涓彟澶栫殑紿楀彛灝辨槸瀹冪殑瀹瑰櫒紿楀彛銆傞氬父鎯呭喌涓嬶紝琚寘鍚殑紿楀彛鏄畠鐨勫鍣ㄧ獥鍙g殑瀛愮獥鍙o紝浣嗘儏鍐靛茍涓嶆槸鎬繪槸榪欐牱銆傚鍣ㄧ獥鍙e茍涓嶆槸蹇呴』絳夊悓浜庣埗紿楀彛錛屽寘鍚笌琚寘鍚殑鍏崇郴鍙栧喅浜嶤++綾伙紝琚寘鍚殑紿楀彛鏄鍣ㄧ獥鍙g被鐨勪竴涓暟鎹垚鍛橈紝鑰岀埗紿楀彛鍜屽瓙紿楀彛鐨勫叧緋諱綋鐜板湪灞忓箷涓婏紝瀹冧滑鐨勫叧緋繪槸鍒涘緩紿楀彛鏃剁‘瀹氱殑銆?<br /><br />涓涓鍖呭惈鐨勭獥鍙e緩绔嬪湪宸叉敞鍐岀殑紿楀彛綾葷殑鍩虹涔嬩笂錛屾瘮濡傜紪杈戞鎺т歡銆傚鏋滀竴涓紪杈戞琚寘鍚紝閭d箞鍙戦佸埌瀹冪殑娑堟伅瀹為檯涓婅瀹冪殑瀹瑰櫒紿楀彛鐨勬秷鎭槧灝勫鐞嗐備嬌鐢ㄨ繖縐嶆柟娉曪紝鍙互鏀瑰彉緙栬緫妗嗘帶浠剁殑鏍囧噯琛屼負銆傝繖鏈夌偣綾諱技浜庡瓙綾誨寲浣嗘槸涓嶉渶瑕佸畾涔夋柊綾繪潵瀛愮被鍖栨帶浠躲傚拰鍓嶉潰閭d釜瀹氫箟CnoNumEdit綾誨搷搴擶M_CHAR娑堟伅鐨勪緥瀛愮浉姣旓紝澶勭悊WM_CHAR娑堟伅鐨勫鍣ㄧ獥鍙g被鐪嬭搗鏉ュ涓嬶細 <pre>class CMyWindow: public CWindowImpl<cmywindow> { CContainedWindow m_contained; public: CMyWindow(): m_contained( _T("edit"), this, 99 ) { } ... </cmywindow></pre>CmyWindow鏄竴涓鍣ㄧ獥鍙g被錛屽畠鐨勬瀯閫犲嚱鏁板CcontainedWindow綾誨瀷鐨勬垚鍛樺仛榪欐牱鐨勫垵濮嬪寲錛氳鍖呭惈鐨勭獥鍙f槸緙栬緫妗嗭紝鍙戦佸畠鐨勬秷鎭埌鈥渢his鈥濓紙瀹冪殑鐖剁獥鍙o級錛屼嬌鐢ㄥ彲閫夋秷鎭槧灝勮〃99銆?pre>BEGIN_MSG_MAP( CMyWindow ) MESSAGE_HANDLER( WM_CREATE, OnCreate ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) ALT_MSG_MAP( 99 ) // contained window''s messages come here... MESSAGE_HANDLER( WM_CHAR, OnChar ) END_MSG_MAP() </pre>褰撶埗紿楀彛琚垱寤虹殑鏃跺欙紝琚寘鍚殑紿楀彛涔熻鍒涘緩錛堝湪WM_CREATE娑堟伅鐨勫搷搴斿嚱鏁頒腑錛夈傚洜涓鴻鍖呭惈鐨勬帶浠舵槸浠ョ紪杈戞涓哄熀紜鐨勶紝鎵浠ュ畠鍦ㄥ睆騫曚笂鐪嬭搗鏉ヨ薄涓涓紪杈戞錛?<pre>LRESULT OnCreate( UINT, WPARAM, LPARAM, BOOL& ) { RECT rc = { 10, 10, 200, 35 }; m_contained.Create( *this, rc, _T("non-numeric edit"), WS_CHILD|WS_VISIBLE|WS_BORDER, 0, 666 ); return 0; } </pre>鍦ㄨ繖涓緥瀛愪腑錛屽鍣ㄧ獥鍙e悓鏃朵篃鏄鍖呭惈紿楀彛鐨勭埗紿楀彛銆?<br /><br />褰撹鍖呭惈鐨勭獥鍙f敹鍒癢M_CHAR娑堟伅鏃訛紝瀹瑰櫒紿楀彛鐨凮nChar鎴愬憳鍑芥暟琚皟鐢ㄣ傝繖涓嚱鏁板拰鍓嶉潰鐨凜noNumEdit渚嬪瓙涓殑鐩稿悓錛屼絾鏄湪榪欎釜渚嬪瓙涓紝瀹冩椂瀹瑰櫒綾葷殑鎴愬憳鍑芥暟銆?<pre>LRESULT OnChar( UINT, WPARAM wParam, LPARAM, BOOL& bHandled ) { TCHAR ch = wParam; if( _T(''0'') <= ch && ch <= _T(''9'') ) MessageBeep( 0 ); else bHandled = FALSE; return 0; } LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ) { PostQuitMessage( 0 ); return 0; } }; </pre>鎴戜滑鍚屾牱涔熷彲浠ョ敤琚寘鍚殑紿楀彛鏉ュ瓙綾誨寲瀵硅瘽妗嗕腑宸茬粡瀛樺湪鐨勬帶浠訛紝鍜屾瑙勭殑瀛愮被鍖栦笉鍚岋紝琚瓙綾誨寲鐨勭獥鍙g殑娑堟伅鏃惰瀹瑰櫒紿楀彛鎹曡幏鐨勩傚湪涓嬮潰鐨勪緥瀛愪腑錛屼竴涓璇濇瀛愮被鍖栦簡涓涓紪杈戞鎺т歡錛屾妸瀹冭漿鍖栨垚浜嗚鍖呭惈鐨勭獥鍙o紱閭d釜瀵硅瘽妗嗭紙瀹瑰櫒錛夋崟鑾稺M_CHAR娑堟伅騫跺拷鐣ユ帀鏁板瓧瀛楃錛岀劧鍚庡湪鍙戦佸埌緙栬緫妗嗘帶浠躲傦紙CdialogImpl鍦ˋTL涓殑瀵硅瘽妗嗙被涓鑺傝榪般傦級 <pre>class CMyDialog: public CDialogImpl<CMyDialog> { public: enum { IDD = IDD_DIALOG1 }; // contained window is an edit control: CMyDialog(): m_contained( "edit", this, 123 ) { } BEGIN_MSG_MAP( CMyDialog ) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) ALT_MSG_MAP( 123 ) // contained window''s messages come here... MESSAGE_HANDLER( WM_CHAR, OnChar ) END_MSG_MAP() LRESULT OnInitDialog( UINT, WPARAM, LPARAM, BOOL& bHandled ) { // when the dialog box is created, subclass its edit control: m_contained.SubclassWindow( GetDlgItem(IDC_EDIT1) ); bHandled = FALSE; return 0; } LRESULT OnChar( UINT, WPARAM wParam, LPARAM, BOOL& bHandled ) { TCHAR ch = wParam; if( _T(''0'') <= ch && ch <= _T(''9'') ) MessageBeep( 0 ); else bHandled = FALSE; return 0; } CContainedWindow m_contained; }; </pre><strong><a id="A11" name="A11"></a>娑堟伅鍙嶅皠錛?/strong><br />鍓嶉潰璁茶堪浜嗕竴浜涙墿灞曠獥鍙e姛鑳界殑鏂規(guī)硶錛岃繖浜涙柟娉曟槸閫氳繃浣跨獥鍙e搷搴斿彂寰紿楀彛鐨勬秷鎭疄鐜扮殑銆傚拰鍓嶉潰鐨勬柟娉曠浉鍙嶏紝娑堟伅鍙嶅皠鏄嬌紿楀彛鑳藉鍝嶅簲浠庡畠浠嚜宸卞彂鍑虹殑娑堟伅銆?<br /><br />褰撶敤鎴峰拰鎺т歡浜や簰鐨勬椂鍊欙紝鎺т歡閫氬父浣垮彂閫佷竴涓猈M_COMMAND鎴栬匴M_NOTIFY娑堟伅緇欏畠鐨勭埗紿楀彛錛涚劧鍚庣埗紿楀彛鍋氬嚭鍝嶅簲錛屾瘮濡傦細 <pre>class CParentWindow: CWindowImpl<CParentWindow> { // 鍋囪榪欎釜紿楀彛鏈変竴涓寜閽瀷鐨勫瓙紿楀彛錛? // 騫朵笖鍏?ID 涓?ID_BUTTON BEGIN_MSG_MAP( CParentWindow ) COMMAND_ID_HANDLER( ID_BUTTON, OnButton ) MESSAGE_HANDLER( WM_CTLCOLORBUTTON, OnColorButton ) ... </pre>褰撴寜閽鎸変笅鐨勬椂鍊欙紝瀹冨彂閫佷竴涓懡浠ゆ秷鎭粰鐖剁獥鍙o紝鐒跺悗CParentWindow::OnButton琚皟鐢ㄣ傚悓鐞嗭紝褰撴寜閽渶瑕佽緇樺埗鐨勬椂鍊欙紝瀹冨彂閫乄M_CTLCOLORBUTTON娑堟伅緇欑埗紿楀彛錛孋ParentWindow::OnColorButton鍝嶅簲榪欎釜娑堟伅錛屽畠浣跨敤鐗瑰畾鐨勭敾鍒風粯鍒舵帶浠躲?<br /><br />鏌愪簺鎯呭喌涓嬶紝璁╂帶浠惰嚜宸卞搷搴斿畠鍙戦佸嚭鍘葷殑娑堟伅姣旇鐖剁獥鍙e搷搴旇濂藉緱澶氥侫TL鎻愪緵浜嗘秷鎭弽灝勭殑鏈哄埗錛氬綋鎺т歡鍚戠埗紿楀彛鍙戦佹秷鎭殑鏃跺欙紝鐖剁獥鍙h兘澶熷皢娑堟伅鍙嶅皠緇欐帶浠躲?<pre>class CParentWindow: CWindowImpl<cparentwindow> { BEGIN_MSG_MAP( CParentWindow ) MESSAGE_HANDLER( WM_CREATE, OnCreate ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) ...other messages that CParentWindow will handle... REFLECT_NOTIFICATIONS() END_MSG_MAP() ... </cparentwindow></pre>褰撶埗紿楀彛鏀跺埌涓涓秷鎭紝鍏堟煡鎵懼畠鐨勬秷鎭槧灝勮〃錛屽鏋滄病鏈夊拰榪欎釜娑堟伅鐩稿尮閰嶇殑鍏ュ彛錛屽垯REFLECT_NOTIFICATIONS瀹忎嬌寰楄娑堟伅琚弽灝勭粰鍙戦佽繖涓秷鎭殑鎺т歡銆傛帶浠跺彲浠ユ彁渚涘搷搴斿弽灝勬秷鎭殑澶勭悊鍑芥暟錛屽涓嬶細 <pre>class CHandlesItsOwnMessages: CWindowImpl<CHandlesItsOwnMessage> { public: DECLARE_WND_SUPERCLASS( _T("Superbutton"), _T("button") ) BEGIN_MSG_MAP( CHandlesItsOwnMessage ) MESSAGE_HANDLER( OCM_COMMAND, OnCommand ) MESSAGE_HANDLER( OCM_CTLCOLORBUTTON, OnColorButton ) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() ... </pre>娉ㄦ剰錛屽弽灝勬秷鎭殑娑堟伅鏍囧織浠CM_寮澶達紝鑰屼笉鏄疻M_銆傝繖鍙互璁╀綘鍖哄垎榪欎釜娑堟伅絀剁珶鏄惁鏄鍙嶅皠鍥炴潵鐨勩?<br /><br />榪欎釜鎺т歡瑕佷箞鏄繖涓被鐨勫疄渚嬶紝瑕佷箞鏄竴涓瀛愮被鍖栫殑鎸夐挳鎺т歡銆備緥濡傦細 <pre>// in CParentWindow: CHandlesItsOwnMessages m_button; LRESULT OnCreate( UINT, WPARAM, LPARAM, BOOL& ) { RECT rc; // initialize appropriately m_button.Create( *this, rc, _T("click me"), WS_CHILD|WS_VISIBLE ); ... </pre>鎴栬咃紝濡傛灉榪欎釜鎸夐挳鎺т歡鏄凡瀛樺湪鐨勶紙渚嬪錛岀埗紿楀彛鏄竴涓璇濇錛夛細<pre>m_button.SubclassWindow( GetDlgItem(ID_BUTTON) ); </pre>涓嬮潰鐨勪緥瀛愬畾涔変簡涓涓狢staticLink綾伙紝瀹冩槸涓涓猄tatic鎺т歡錛屽綋鐐瑰嚮瀹冪殑鏃跺欙紝灝嗘墦寮涓涓寚瀹氱殑緗戦〉銆傛墍鏈変粠CstaticLink鍙戦佸嚭鍘葷殑娑堟伅閮借瀹冪殑鐖剁獥鍙e弽灝勫洖鏉ワ紙鍦ㄨ繖涓緥瀛愪腑錛岀敤鍒板璇濇錛岃鐪婣TL涓殑瀵硅瘽妗嗙被榪欎竴鑺傦級銆傞櫎浜嗗搷搴斿弽灝勫洖鐨勫懡浠ゆ秷鎭紝CstaticLink榪樺鐞嗗弽灝勫洖鐨刉M_CTLCOLORSTATIC娑堟伅浠ヤ究瀹冭兘澶熻鑷繁鍦ㄧ偣鍑誨墠鍜岀偣鍑誨悗鏄劇ず涓嶅悓鐨勯鑹層?<pre>#include "stdafx.h" #include "resource.h" CComModule _Module; class CStaticLink : public CWindowImpl<CStaticLink> { /* Based on CStaticLink by Paul DiLascia, C++ Q&A, Microsoft Systems Journal 12/1997. Turns static controls into clickable "links" -- when the control is clicked, the file/program/webpage named in the control''s text (or set by SetLinkText()) is opened via ShellExecute(). Static control can be either text or graphic (bitmap, icon, etc.). */ public: DECLARE_WND_SUPERCLASS( _T("StaticLink"), _T("Static") ) CStaticLink() : m_colorUnvisited( RGB(0,0,255) ), m_colorVisited( RGB(128,0,128) ), m_bVisited( FALSE ), m_hFont( NULL ) { } void SetLinkText( LPCTSTR szLink ) { USES_CONVERSION; m_bstrLink = T2OLE( szLink ); } BEGIN_MSG_MAP(CStaticLink) // uses message reflection: WM_* comes back as OCM_* MESSAGE_HANDLER( OCM_COMMAND, OnCommand ) MESSAGE_HANDLER( OCM_CTLCOLORSTATIC, OnCtlColor ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) // not a reflected message DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ) { if( m_hFont ) DeleteObject( m_hFont ); return 0; } LRESULT OnCommand( UINT, WPARAM wParam, LPARAM, BOOL& ) { USES_CONVERSION; int code = HIWORD( wParam ); if( code == STN_CLICKED || code == STN_DBLCLK ){ if( m_bstrLink.Length() == 0 ){ GetWindowText( &m_bstrLink ); } if( (int)ShellExecute( *this, _T("open"), OLE2T(m_bstrLink), NULL, NULL, SW_SHOWNORMAL ) > 32 ){ m_bVisited = TRUE; // return codes > 32 => success Invalidate(); }else{ MessageBeep( 0 ); ATLTRACE( _T("Error: CStaticLink couldn''t open file") ); } } return 0; } LRESULT OnCtlColor( UINT, WPARAM wParam, LPARAM, BOOL& ) { // notify bit must be set to get STN_* notifications ModifyStyle( 0, SS_NOTIFY ); HBRUSH hBr = NULL; if( (GetStyle() & 0xff) <= SS_RIGHT ){ // it''s a text control: set up font and colors if( !m_hFont ){ LOGFONT lf; GetObject( GetFont(), sizeof(lf), &lf ); lf.lfUnderline = TRUE; m_hFont = CreateFontIndirect( &lf ); } HDC hDC = (HDC)wParam; SelectObject( hDC, m_hFont ); SetTextColor( hDC, m_bVisited ? m_colorVisited : m_colorUnvisited ); SetBkMode( hDC, TRANSPARENT ); hBr = (HBRUSH)GetStockObject( HOLLOW_BRUSH ); } return (LRESULT)hBr; } private: COLORREF m_colorUnvisited; COLORREF m_colorVisited; BOOL m_bVisited; HFONT m_hFont; CComBSTR m_bstrLink; }; // CStaticLink class CReflectDlg : public CDialogImpl<CReflectDlg> { public: enum { IDD = IDD_DIALOG1 }; BEGIN_MSG_MAP(CReflectDlg) COMMAND_RANGE_HANDLER( IDOK, IDCANCEL, OnClose ) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) REFLECT_NOTIFICATIONS() // reflect messages back to static links END_MSG_MAP() LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&) { CenterWindow( GetParent() ); // a textual static control: s1.SubclassWindow( GetDlgItem(IDS_TEST1) ); // a static control displaying an icon s2.SubclassWindow( GetDlgItem(IDS_TEST2) ); // set the icon''s link s2.SetLinkText( _T("http://www.microsoft.com") ); return 1; } LRESULT OnClose(UINT, WPARAM wID, HWND, BOOL& ) { ::EndDialog( m_hWnd, wID ); return 0; } private: CStaticLink s1, s2; }; // CReflectDlg int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { _Module.Init( NULL, hInstance ); CReflectDlg dlg; dlg.DoModal(); _Module.Term(); return 0; } </pre><strong><a id="A12" name="A12"></a></strong></div> <img src ="http://m.shnenglu.com/yishanhante/aggbug/19689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-13 10:07 <a href="http://m.shnenglu.com/yishanhante/articles/19689.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>ATL3.0涓殑紿楀彛綾?/title><link>http://m.shnenglu.com/yishanhante/articles/19687.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Tue, 13 Mar 2007 01:52:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19687.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19687.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19687.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19687.html</trackback:ping><description><![CDATA[ <div>鎽樿錛氳璁篈ctive Template Library (ATL) 3.0涓殑涓浜涚被錛岃繖浜涚被鍥寸粫鐫Windows API寤虹珛浜嗕竴涓潰鍚戝璞$殑緙栫▼妗嗘灦錛屼嬌鐢ㄨ繖涓鏋訛紝鍙互綆鍖朚icrosoft&reg; Windows&reg;緙栫▼騫朵笖鍙渶瑕佸緢灝戠殑緋葷粺寮閿銆傚唴瀹瑰寘鎷細鑰冨療瀵圭獥鍙e仛浜嗙畝鍗曞皝瑁呯殑CWindow綾伙紱浣跨敤CWindowImpl榪涜娑堟伅澶勭悊鍜屾秷鎭槧灝勶紱浣跨敤ATL涓殑瀵硅瘽妗嗙被浠ュ強鎵╁睍鐜版湁紿楀彛綾葷殑鍔熻兘鐨勬柟娉曘?<br /><br /><strong><a id="A1" name="A1"></a>綆浠嬶細</strong><br />铏界劧Active Template Library (ATL)涓昏鏄負浜嗘敮鎸丆OM寮鍙戣岃璁$殑錛屼絾瀹冪‘瀹炲寘鍚簡寰堝鍙敤浜庣獥鍙h璁$殑綾匯傝繖浜涚獥鍙g被鍜孉TL涓殑鍏跺畠綾諱竴鏍鳳紝閮芥槸鍩轟簬妯$増鐨勶紝騫朵笖鍙渶瑕佽姳璐瑰緢灝戠郴緇熷紑閿銆傝繖綃囨枃绔犲氨鍚戞垜浠紨紺轟簡浣跨敤ATL鍒涘緩紿楀彛鍜屽璇濇騫惰繘琛屾秷鎭鐞嗙殑鍩烘湰鏂規(guī)硶銆?<br />榪欑瘒鏂囩珷鍋囪璇昏呯啛鎮(zhèn)塁++璇█鍜學indows紼嬪簭璁捐錛涗絾鏄茍涓嶄竴瀹氳姹傝鑰呭叿鏈塁OM鏂歸潰鐨勭煡璇嗐?<br /><br /><strong><a id="A2" name="A2"></a>CWindow:</strong><br />鍦ˋTL紿楀彛綾諱腑錛孋Window鏄渶鍩烘湰鐨勩傝繖涓被瀵筗indows API榪涜浜嗛潰鍚戝璞$殑鍖呰錛屽畠?yōu)畞瑁呬簡涓涓獥鍙e彞鏌勶紝騫舵彁渚涗竴浜涙垚鍛樺嚱鏁版潵鎿嶄綔瀹冿紝榪欎簺鍑芥暟鍖呰浜嗙浉搴旂殑Windows API銆?<br /><br />鏍囧噯鐨刉indows紼嬪簭璁捐鐪嬭搗鏉ヨ薄榪欐牱錛?<br /><pre>HWND hWnd = ::CreateWindow( "button", "Click me", WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ::ShowWindow( hWnd, nCmdShow ); ::UpdateWindow( hWnd ); </pre>浣跨敤ATL涓殑CWindow綾誨悗錛岀瓑鏁堜唬鐮佸涓嬶細<pre>CWindow win; win.Create( "button", NULL, CWindow::rcDefault, "Click me", WS_CHILD ); win.ShowWindow( nCmdShow ); win.UpdateWindow(); </pre>鎴戜滑搴旇鍦ㄦ垜浠殑澶ц剳涓垜浠簲璇ヤ繚鎸佽繖鏍蜂竴涓蹇碉細ATL鐨勭獥鍙e璞′笌Windows緋葷粺涓殑紿楀彛鏄笉鍚岀殑銆俉indows緋葷粺涓殑紿楀彛鎸囩殑鏄搷浣滅郴緇熶腑緇存寔鐨勪竴鍧楁暟鎹紝鎿嶄綔緋葷粺闈犺繖鍧楁暟鎹潵鎿嶄綔灞忓箷涓婄殑涓鍧楀尯鍩熴傝屼竴涓狝TL紿楀彛瀵硅薄錛屾槸CWindow綾葷殑涓涓疄渚嬶紝瀹冩槸涓涓狢++瀵硅薄錛屽畠鐨勫唴閮ㄦ病鏈変繚瀛樹換浣曟湁鍏沖睆騫曞尯鍩熸垨鑰呯獥鍙f暟鎹粨鏋勭殑鍐呭錛屽彧淇濆瓨浜嗕竴涓獥鍙g殑鍙ユ焺錛岃繖涓彞鏌勪繚瀛樺湪瀹冪殑鏁版嵁鎴愬憳m_hWnd涓紝CWindow瀵硅薄鍜屽畠鍦ㄥ睆騫曚笂鏄劇ず鍑烘潵鐨勭獥鍙e氨鏄潬榪欎釜鍙ユ焺鑱旂郴璧鋒潵鐨勩?br />鐞嗚В浜咥TL涓殑紿楀彛瀵硅薄鍜學indows緋葷粺涓獥鍙g殑鍖哄埆錛屽氨鏇村姞瀹規(guī)槗鐞嗚ВCWindow瀵硅薄鐨勬瀯閫犱笌紿楀彛鐨勫垱寤烘槸涓や釜鍒嗗紑鐨勮繃紼嬨傛垜浠啀鐪嬬湅鍓嶉潰鐨勪唬鐮侊紝灝變細鍙戠幇錛岄鍏堟槸涓涓狢Window瀵硅薄琚瀯閫狅細 <pre>CWindow win;</pre>鐒跺悗鍒涘緩瀹冪殑紿楀彛錛?pre>win.Create( "button", NULL, CWindow::rcDefault, "Click me", WS_CHILD ); </pre>鎴戜滑涔熷彲浠ユ瀯閫犱竴涓狢Window瀵硅薄錛岀劧鍚庢妸瀹冨拰涓涓凡緇忓瓨鍦ㄧ殑紿楀彛鍏寵仈璧鋒潵錛岃繖鏍鋒垜浠氨鍙互閫氳繃CWindow綾葷殑鎴愬憳鍑芥暟鏉ユ搷浣滆繖涓凡緇忓瓨鍦ㄧ殑紿楀彛銆傝繖縐嶆柟娉曢潪甯告湁鐢紝鍥犱負CWindow綾繪彁渚涚殑鍑芥暟閮芥槸灝佽濂戒簡鐨勶紝鐢ㄨ搗鏉ュ緢鏂逛究錛屾瘮濡侰Window綾諱腑鐨凜enterWindow, GetDescendantWindow絳夊嚱鏁扮敤璧鋒潵灝辨瘮鐩存帴浣跨敤Windows API鏂逛究寰楀銆?<pre>HWND hWnd = CreateWindow( szWndClass, "Main window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); // 涓嬮潰鐨勬柟娉曚腑鍙互浠婚変竴縐嶏細 // CWindow win( hWnd ); // 閫氳繃鏋勯犲嚱鏁板叧鑱? // 鎴? // CWindow win; // win = hWnd; // 閫氳繃璧嬪兼搷浣滅鍏寵仈 // 鎴? // CWindow win; // win.Attach( hWnd ); // 浣跨敤Attach()鏂規(guī)硶鍏寵仈 win.CenterWindow(); // 鐜板湪鍙互浣跨敤win瀵硅薄鏉ヤ唬鏇縣Wnd榪涜鎿嶄綔 win.ShowWindow( nCmdShow ); win.UpdateWindow(); </pre>CWindow綾諱篃鎻愪緵浜嗕竴涓狧WND鎿嶄綔絎︼紝鍙互鎶奀Window綾葷殑瀵硅薄杞寲涓虹獥鍙e彞鏌勶紝榪欐牱錛屼換浣曡姹備嬌鐢℉WND鐨勫湴鏂歸兘鍙互浣跨敤CWindow綾葷殑瀵硅薄浠f浛錛?<pre>::ShowWindow( win, nCmdShow ); // 姝PI鍑芥暟鏈潵瑕佹眰HWND綾誨瀷鐨勫弬鏁?/pre>CWindow綾諱嬌寰楀紿楀彛鐨勬搷浣滄洿綆鍗曪紝鑰屼笖涓嶄細澧炲姞緋葷粺寮閿鈥斺斿畠緇忚繃緙栬瘧鍜屼紭鍖栧悗鐨勪唬鐮佷笌浣跨敤綰疉PI緙栫▼鐨勪唬鐮佹槸絳変環(huán)鐨勩?br /><br />涓嶅垢鐨勬槸錛孋Window綾諱笉鑳借鎴戜滑鑷繁鍐沖畾紿楀彛濡備綍鍝嶅簲娑堟伅銆傚綋鐒訛紝鎴戜滑鍙互浣跨敤CWindow綾繪彁渚涚殑鏂規(guī)硶鏉ヤ嬌涓涓獥鍙e眳涓垨闅愯棌錛岀敋鑷沖彲浠ュ悜涓涓獥鍙e彂閫佹秷鎭紝浣嗘槸褰撶獥鍙f敹鍒版秷鎭悗鎬庝箞澶勭悊鍒欏彇鍐充簬鍒涘緩榪欎釜紿楀彛鏃朵嬌鐢ㄧ殑紿楀彛綾伙紝濡傛灉鎴戜滑鏄垱寤虹殑鏄漛utton鈥濈被鐨勭獥鍙o紝閭d箞瀹冪殑琛ㄧ幇灝辮薄涓寜閽紝濡傛灉鐢ㄢ漧istbox鈥濈被鍒涘緩錛岄偅瀹冨氨鍏鋒湁璺熷垪琛ㄦ鐩稿悓鐨勮涓猴紝浣跨敤CWindow綾繪垜浠病鏈夊姙娉曟敼鍙樿繖鐐廣傚垢濂斤紝ATL涓烘垜浠彁渚涗簡鍙﹀涓涓被CWindowImpl錛屽畠鍏佽鎴戜滑鎸囧畾紿楀彛鐨勬柊琛屼負銆?<br /><br /><strong><a id="A3" name="A3"></a>CWindowImpl:</strong><br />CWindowImpl綾繪槸浠嶤Window綾繪淳鐢熺殑錛屾墍浠ユ垜浠緷鐒跺彲浠ヤ嬌鐢–Window綾諱腑鐨勬垚鍛樺嚱鏁幫紝浣嗘槸CWindowImpl綾葷殑鍔熻兘鏇村己澶э紝瀹冨厑璁告垜浠寚瀹氱獥鍙f庢牱澶勭悊娑堟伅銆傚湪浼犵粺鐨勭獥鍙g紪紼嬩腑錛屽鏋滄垜浠澶勭悊紿楀彛娑堟伅錛屾垜浠繀欏諱嬌鐢ㄧ獥鍙e嚱鏁幫紱浣嗘槸浣跨敤ATL錛屾垜浠彧闇瑕佸湪鎴戜滑鐨凙TL紿楀彛綾諱腑瀹氫箟涓涓秷鎭槧灝勩?<br /><br />棣栧厛錛屼粠CWindowImpl綾繪淳鐢熻嚜宸辯殑紿楀彛綾伙紝濡備笅錛?<pre>class CMyWindow : public CWindowImpl<cmywindow> { </cmywindow></pre>娉ㄦ剰錛屾垜浠嚜宸辯殑綾誨悕蹇呴』浣滀負涓涓ā鐗堝弬鏁頒紶閫掔粰CWindowImpl綾匯?<br /><br />鐒跺悗鍦ㄧ被鐨勫畾涔夐噷闈㈠畾涔夊涓嬬殑娑堟伅鏄犲皠錛?<pre>BEGIN_MSG_MAP(CMyWindow) MESSAGE_HANDLER(WM_PAINT,OnPaint) MESSAGE_HANDLER(WM_CREATE,OnCreate) MESSAGE_HANDLER(WM_DESTROY,OnDestroy) END_MSG_MAP() </pre>涓嬮潰榪欏彞<pre>MESSAGE_HANDLER(WM_PAINT,OnPaint)</pre>鐨勬剰鎬濇槸錛屽綋WM_PAINT娑堟伅鍒拌揪鏃訛紝灝嗚皟鐢–MyWindow::OnPaint鎴愬憳鍑芥暟銆?<br /><br />鏈鍚庡氨鏄畾涔夊鐞嗘秷鎭殑鍑芥暟浜嗭紝濡備笅錛?<pre>LRESULT OnPaint( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { ... } LRESULT OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { ... } LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { ... } }; // CmyWindow </pre>榪欎簺鍑芥暟涓殑鍙傛暟鎰忎箟涓猴細絎竴涓槸娑堟伅ID錛屼腑闂寸殑涓や釜鍙傛暟鐨勬剰涔夊彇鍐充簬娑堟伅綾誨瀷錛岀鍥涗釜鍙傛暟鏄竴涓爣蹇楋紝鐢ㄥ畠鏉ュ喅瀹氳繖涓秷鎭槸宸茬粡澶勭悊瀹屼簡榪樻槸闇瑕佽繘涓姝ョ殑澶勭悊銆傚叧浜庤繖浜涘弬鏁幫紝鎴戜滑鍦∕essage Map灝忕粨鏈夋洿璇︾粏鐨勮璁恒?<br /><br />褰撶獥鍙f敹鍒頒竴涓秷鎭紝瀹冨皢浠庢秷鎭槧灝勮〃鐨勯《閮ㄥ紑濮嬫煡鎵懼尮閰嶇殑娑堟伅澶勭悊鍑芥暟錛屽洜姝ゆ妸鏈甯哥敤鐨勬秷鎭斁鍦ㄦ秷鎭槧灝勮〃鐨勫墠闈㈡槸涓笉閿欑殑娉ㄦ剰銆傚鏋滄病鏈夋壘鍒板尮閰嶇殑娑堟伅澶勭悊鍑芥暟錛屽垯榪欎釜娑堟伅琚彂閫佸埌榛樿鐨勭獥鍙h繃紼嬭繘琛屽鐞嗐?<br /><br />ATL鐨勬秷鎭槧灝勮〃灝佽浜哤indows鐨勬秷鎭鐞嗚繃紼嬶紝瀹冩瘮浼犵粺鐨勭獥鍙e嚱鏁頒腑鐨勫ぇ閲弒witch鍒嗘敮鎴栬卛f璇彞鐪嬭搗鏉ユ洿鍔犵洿瑙傘?<br /><br />瑕佸垱寤轟竴涓熀浜嶤WindowImpl媧劇敓綾葷殑紿楀彛錛岃璋冪敤CWindowImpl綾葷殑Create鏂規(guī)硶錛?<pre>CMyWindow wnd; // 鏋勯犱竴涓?CMyWindow 綾葷殑瀵硅薄 wnd.Create( NULL, CWindow::rcDefault, _T("Hello"), WS_OVERLAPPEDWINDOW|WS_VISIBLE ); </pre>娉ㄦ剰錛孋WindowImpl綾葷殑Create鏂規(guī)硶涓嶤Window綾葷殑Create鏂規(guī)硶鐣ユ湁涓嶅悓錛屽湪CWindow綾葷殑Create涓紝鎴戜滑蹇呴』鎸囧畾涓涓敞鍐屼簡鐨勭獥鍙g被錛屼絾鏄疌WindowImpl鍒欎笉鍚岋紝瀹冨垱寤轟竴涓柊鐨勭獥鍙g被錛屽洜姝わ紝涓嶉渶瑕佷負瀹冩寚瀹氱獥鍙g被銆?<br /><br /><strong><a id="A4" name="A4"></a>涓涓畝鍗曡屽畬鏁寸殑紺轟緥錛?br /></strong><br />榪欑瘒鏂囩珷涓殑澶ч儴鍒嗙ず渚嬮兘鍙槸浠g爜鐗囨錛屼絾鏄笅闈㈠垪鍑虹殑鏄竴涓畬鏁寸殑Hello world鐨勭ず渚嬬▼搴忋傝櫧鐒舵垜浠嬌鐢ㄧ殑鏄疉TL錛屼絾鏄病鏈夋秹鍙婂埌COM錛屽洜姝ゅ湪浣跨敤Visual C++&reg;寤虹珛欏圭洰鐨勬椂鍊欙紝鎴戜滑閫夋嫨Win32&reg; application鑰屼笉鏄疉TL COM錛?<br />鍦╯tdafx.h鏂囦歡涓紝鍔犲叆涓嬮潰鍑犺錛?<pre>#include <atlbase.h> extern CComModule _Module; #include <atlwin.h> </pre>鍦╤ello.cpp鏂囦歡涓紝鍐欏涓嬩唬鐮侊細<pre>#include "stdafx.h" CComModule _Module; class CMyWindow : public CWindowImpl<CMyWindow> { BEGIN_MSG_MAP( CMyWindow ) MESSAGE_HANDLER( WM_PAINT, OnPaint ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) END_MSG_MAP() LRESULT OnPaint( UINT, WPARAM, LPARAM, BOOL& ){ PAINTSTRUCT ps; HDC hDC = GetDC(); BeginPaint( &ps ); TextOut( hDC, 0, 0, _T("Hello world"), 11 ); EndPaint( &ps ); return 0; } LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ){ PostQuitMessage( 0 ); return 0; } }; int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int ) { _Module.Init( NULL, hInstance ); CMyWindow wnd; wnd.Create( NULL, CWindow::rcDefault, _T("Hello"), WS_OVERLAPPEDWINDOW|WS_VISIBLE ); MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } _Module.Term(); return msg.wParam; } </pre><p>鍦ㄨ繖涓ず渚嬬▼搴忎腑錛孋myWindow鏄粠CWindowImpl媧劇敓鐨勶紝瀹冪殑娑堟伅鏄犲皠鎹曡幏浜嗕袱涓秷鎭疻M_PAINT鍜學M_DESTROY錛屽綋鏀跺埌WM_PAINT娑堟伅鏃訛紝瀹冪殑鎴愬憳鍑芥暟OnPaint澶勭悊榪欎釜娑堟伅騫跺湪紿楀彛涓婅緭鍑衡淗ello world鈥濓紝褰撴敹鍒癢M_DESTROY娑堟伅鏃訛紝涔熷氨鏄綋鐢ㄦ埛鍏抽棴榪欎釜紿楀彛鐨勬椂鍊欙紝璋冪敤OnDestroy鍑芥暟澶勭悊榪欎釜娑堟伅錛屽湪OnDestroy鍑芥暟涓皟鐢≒ostQuitMessage鏉ョ粨鏉熸秷鎭驚鐜?<br /><br />WinMain鍑芥暟涓垱寤轟簡涓涓狢myWindow綾葷殑瀹炰緥騫跺疄鐜頒簡涓涓爣鍑嗙殑娑堟伅寰幆銆傦紙鏈変竴浜涘湴鏂癸紝鎴戜滑蹇呴』閬靛驚ATL鐨勮鑼冿紝姣斿鍦ㄨ繖閲屾垜浠繀欏諱嬌鐢╛Module銆傦級 <br /><br /><strong><a id="A5" name="A5"></a>娑堟伅鏄犲皠錛?</strong><br />鏈変笁緇勭敤浜庢秷鎭槧灝勭殑瀹忥紝浠栦滑鍒嗗埆鏄細 </p><ul><li>紿楀彛娑堟伅鏄犲皠瀹忥紝鐢ㄤ簬鎵鏈夌殑紿楀彛娑堟伅錛堝WM_CREATE銆乄M_PAINT絳夛級錛? </li><li>鍛戒護娑堟伅鏄犲皠瀹忥紝涓撶敤浜嶹M_COMMAND娑堟伅錛堟瘮濡傜敱鎺т歡鎴栬彍鍗曞彂鍑虹殑娑堟伅錛夛紱 </li><li>閫氱煡娑堟伅鏄犲皠瀹忥紝涓撶敤浜嶹M_NOTUFY娑堟伅錛堥氬父鐢遍氱敤鎺т歡鍙戝嚭姝ゆ秷鎭紝姣斿宸ュ叿鏍忔帶浠舵垨鍒楄〃瑙嗗浘鎺т歡錛?</li></ul><p>紿楀彛娑堟伅鏄犲皠瀹忥細 <br />鏈変袱涓獥鍙f秷鎭槧灝勫畯錛屼粬浠垎鍒槸錛?/p><ul><li>MESSAGE_HANDLER </li><li>MESSAGE_RANGE_HANDLER </li></ul><p>絎竴涓畯灝嗕竴涓壒瀹氱殑娑堟伅鏄犲皠鍒扮浉搴旂殑澶勭悊鍑芥暟錛涚浜屼釜瀹忓皢涓緇勬秷鎭槧灝勫埌涓涓鐞嗗嚱鏁般傛秷鎭鐞嗗嚱鏁伴兘瑕佹眰鍏鋒湁濡備笅鐨勫師褰細 <br /></p><pre>LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); </pre><p>鍏朵腑錛屽弬鏁皍Msg鏄秷鎭爣璇嗭紝wParam鍜宭Param鏄袱涓檮鍔犱笌娑堟伅鐨勫弬鏁幫紝錛堜粬浠殑鍏蜂綋鎰忎箟鍙栧喅涓庢秷鎭被鍒傦級 <br /><br />娑堟伅澶勭悊鍑芥暟浣跨敤bHandled鏉ユ爣蹇楁秷鎭槸鍚﹀凡緇忚瀹屽叏鎹曡幏錛屽鏋渂Handled琚緗垚FALSE錛岀▼搴忓皢緇х畫鍦ㄦ秷鎭槧灝勮〃鐨勫悗緇儴鍒嗘煡鎵捐繖涓秷鎭殑鍏跺畠澶勭悊鍑芥暟銆傝繖涓壒鎬т嬌寰楁垜浠涓涓秷鎭嬌鐢ㄥ涓鐞嗗嚱鏁版垚涓哄彲鑳姐備粈涔堟椂鍊欓渶瑕佸涓涓秷鎭嬌鐢ㄥ涓鐞嗗嚱鏁板憿錛熷彲鑳芥槸鍦ㄥ澶氫釜綾婚摼鎺ユ椂錛屼篃鍙兘鏄垜浠彧鎯沖涓涓秷鎭仛鍑哄搷搴斾絾鏄茍涓嶇湡姝f崟鑾峰畠銆傚湪澶勭悊鍑芥暟琚皟鐢ㄤ箣鍓嶏紝bHandled琚疆涓篢RUE錛屾墍浠ュ鏋滄垜浠笉鍦ㄥ嚱鏁扮殑緇撳熬鏄懼紡鍦板皢瀹冪疆涓篎ALSE錛屽垯娑堟伅鏄犲皠琛ㄧ殑鍚庣畫閮ㄥ垎涓嶄細琚戶緇煡鎵撅紝涔熶笉浼氭湁鍏跺畠鐨勫鐞嗗嚱鏁拌璋冪敤銆?<br /><br />鍛戒護娑堟伅鏄犲皠瀹忥細 <br />鍛戒護娑堟伅鏄犲皠瀹忓彧澶勭悊鍛戒護娑堟伅錛圵M_COMMAND娑堟伅錛夛紝浣嗘槸瀹冭兘璁╂垜浠牴鎹秷鎭被鍨嬫垨鑰呭彂閫佸懡浠ゆ秷鎭殑鎺т歡ID鏉ユ寚瀹氭秷鎭鐞嗗嚱鏁般?</p><ul><li>COMMAND_HANDLER鏄犲皠涓涓壒瀹氭帶浠剁殑涓鏉$壒瀹氭秷鎭埌涓涓鐞嗗嚱鏁幫紱 </li><li>COMMAND_ID_HANDLER鏄犲皠涓涓壒瀹氭帶浠剁殑鎵鏈夋秷鎭埌涓涓鐞嗗嚱鏁幫紱 </li><li>COMMAND_CODE_HANDLER鏄犲皠浠繪剰鎺т歡鐨勪竴涓壒瀹氭秷鎭埌涓涓鐞嗗嚱鏁幫紱 </li><li>COMMAND_RANGE_HANDLER鏄犲皠涓瀹氳寖鍥村唴鐨勬帶浠剁殑鎵鏈夋秷鎭埌涓涓鐞嗗嚱鏁幫紱 </li><li>COMMAND_RANGE_CODE_HANDLER鏄犲皠涓瀹氳寖鍥村唴鐨勬帶浠剁殑涓鏉$壒瀹氭秷鎭埌涓涓鐞嗗嚱鏁般?</li></ul><p>鍛戒護娑堟伅澶勭悊鍑芥暟搴旇鍏鋒湁濡備笅鐨勫師褰細 </p><pre>LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); </pre><p>鍏朵腑錛屽弬鏁皐NotifyCode浠h〃娑堟伅浠g爜錛寃ID浠h〃鍙戦佹秷鎭殑鎺т歡鐨処D錛宧WndCtl浠h〃鍙戦佹秷鎭殑鎺т歡鐨勭獥鍙e彞鏌勶紝bHandled鐨勬剰涔夊鍓嶆墍榪般?<br /><br />閫氱煡娑堟伅鏄犲皠瀹忥細 <br />閫氱煡娑堟伅鏄犲皠瀹忕敤鏉ュ鐞嗛氱煡娑堟伅錛圵M_NOTUFY娑堟伅錛夛紝瀹冩牴鎹氱煡娑堟伅鐨勭被鍨嬪拰鍙戦侀氱煡娑堟伅鐨勬帶浠剁殑涓嶅悓灝嗘秷鎭槧灝勫埌涓嶅悓鐨勫鐞嗗嚱鏁幫紝榪欎簺瀹忎笌鍓嶉潰璁茬殑鍛戒護娑堟伅鏄犲皠瀹忔槸絳変環(huán)鐨勶紝鍞竴鐨勪笉鍚屽氨鏄畠澶勭悊鐨勬槸閫氱煡娑堟伅鑰屼笉鏄懡浠ゆ秷鎭?</p><ul><li>NOTIFY_HANDLER </li><li>NOTIFY_ID_HANDLER </li><li>NOTIFY_CODE_HANDLER </li><li>NOTIFY_RANGE_HANDLER </li><li>NOTIFY_RANGE_CODE_HANDLER </li></ul><p>閫氱煡娑堟伅澶勭悊鍑芥暟閮介渶瑕佸涓嬬殑鍘熷艦錛?/p><pre>LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); </pre>鍏朵腑錛屽弬鏁癷dCtrl浠h〃鍙戦侀氱煡娑堟伅鐨勬帶浠剁殑ID錛屽弬鏁皃nmh鏄寚鍚戜竴涓狽MHDR緇撴瀯鐨勬寚閽堬紝bHandled鐨勬剰涔夊鍓嶆墍榪般?<br /><br />閫氱煡娑堟伅鍖呭惈浜嗕竴涓寚鍚戞秷鎭粏鑺傜殑緇撴瀯鐨勬寚閽堬紝渚嬪錛屽綋涓涓垪琛ㄨ鍥炬帶浠跺彂閫佷竴涓氱煡娑堟伅錛岃繖涓秷鎭氨鍖呭惈浜嗕竴涓寚鍚慛MLVDISPINFO緇撴瀯鐨勬寚閽堬紝鎵鏈夌被浼間簬NMLVDISPINFO鐨勭粨鏋勯兘鍖呭惈涓涓狽MHDR緇撴瀯鐨勫ご錛宲nmh灝辨寚鍚戣繖涓ご錛屽鏋滈渶瑕佽闂繖縐嶇粨鏋勪腑澶撮儴浠ュ鐨勫叾瀹冩暟鎹垚鍛橈紝鍙互灝唒nmh杞寲鎴愮浉搴旂被鍨嬬殑鎸囬拡銆?<br /><br />渚嬪錛屾垜浠鏋滆澶勭悊鍒楄〃瑙嗗浘鎺т歡鍙戝嚭鐨凩VN_ENDLABELEDIT閫氱煡娑堟伅錛屾垜浠彲浠ユ妸涓嬮潰榪欒浠g爜鏀懼埌娑堟伅鏄犲皠琛ㄤ腑錛?<pre>NOTIFY_HANDLER( ID_LISTVIEW, LVN_ENDLABELEDIT, OnEndLabelEdit)</pre>榪欎釜閫氱煡娑堟伅闄勫甫鐨勯澶栦俊鎭寘鍚湪涓涓狽MLVDISPINFO緇撴瀯涓紝鍥犳錛屾秷鎭鐞嗗嚱鏁扮湅璧鋒潵搴旇璞′笅闈㈣繖涓牱瀛愶細 <pre>LRESULT OnEndLabelEdit(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) { // The item is -1 if editing is being canceled. if ( ((NMLVDISPINFO*)pnmh)->item.iItem == -1) return FALSE; ... </pre>鍙互鐪嬪嚭錛宲nmh鎸囬拡琚漿鍖栨垚NMLVDISPINFO*綾誨瀷錛屼互渚胯闂ご閮ㄧ粨鏋勪互澶栫殑鏁版嵁銆?<br /><br /><strong><a id="A6" name="A6"></a>涓虹幇鏈夌殑紿楀彛綾繪坊鍔犲姛鑳斤細</strong><br />鏈夎澶氬悜鐜版湁鐨勭獥鍙f坊鍔犲姛鑳界殑鏂規(guī)硶銆傚鏋滆繖涓被鏄疉TL紿楀彛綾伙紝鎴戜滑鍙互浠庤繖涓獥鍙g被媧劇敓鑷繁鐨勭被錛屽氨璞ase Class Chaining涓弿榪扮殑涓鏍楓傝繖縐嶆柟娉曚富瑕佹槸涓涓狢++綾葷殑緇ф壙鍔犱笂涓鐐規(guī)秷鎭槧灝勭殑閾炬帴銆?<br /><br />濡傛灉鎴戜滑鎯蟲墿灞曚竴涓瀹氫箟鐨勭獥鍙g被錛堝鎸夌航綾繪垨鍒楄〃妗嗙被錛夌殑鍔熻兘錛屾垜浠彲浠ヨ秴綾誨寲瀹冦傚氨鏄垱寤轟竴涓熀浜庤繖涓瀹氫箟綾葷殑鏂扮被錛屽茍鍦ㄦ秷鎭槧灝勮〃涓坊鍔犳秷鎭槧灝勪互澧炲己瀹冪殑鍔熻兘銆?<br /><br />鏈変簺鏃跺欙紝鎴戜滑闇瑕佹敼鍙樹竴涓凡緇忓瓨鍦ㄧ殑紿楀彛瀹炰緥鐨勮涓猴紝鑰屼笉鏄竴涓獥鍙g被鈥斺旀垨璁告垜浠璁╀竴涓璇濇涓婄殑緙栬緫妗嗗仛鐐逛粈涔堢壒鍒殑浜嬫儏銆傚湪榪欑鎯呭喌涓嬶紝鎴戜滑鍙互鍐欎竴涓柊鐨凙TL紿楀彛綾伙紝騫跺瓙綾誨寲榪欎釜宸茬粡瀛樺湪鐨勭紪杈戞銆備換浣曟湰璇ュ彂閫佸埌榪欎釜緙栬緫妗嗙殑娑堟伅閮戒細鍏堣鍙戦佸埌榪欎釜瀛愮被鐨勫璞°?<br /><br />鍙﹀涓縐嶅彲閫夌殑鏂規(guī)硶錛氭垜浠篃鍙互璁╄繖涓紪杈戞鎴愪負涓涓鍖呭惈鐨勭獥鍙o紝鎵鏈夊彂閫佸埌榪欎釜緙栬緫妗嗙殑娑堟伅閮戒細緇忚繃瀹冪殑瀹瑰櫒紿楀彛錛涙垜浠彲浠ュ湪榪欎釜瀹瑰櫒紿楀彛涓負榪欎釜琚寘鍚殑紿楀彛瀹炵幇鐗規(guī)畩鐨勬秷鎭鐞嗐?<br /><br />鏈鍚庣殑涓縐嶆柟娉曞氨鏄秷鎭弽灝勶紝褰撲竴涓獥鍙f敹鍒頒竴涓秷鎭悗涓嶅鐞嗗畠錛岃屾槸鍙嶅皠緇欏彂閫佽繖涓秷鎭殑紿楀彛鑷繁澶勭悊錛岃繖縐嶆妧鏈彲浠ョ敤鏉ュ垱寤鴻嚜鍖呭惈鐨勬帶浠躲?<br /><br /><strong><a id="A7" name="A7"></a>鍩虹被娑堟伅閾撅紙Base Class Chaining錛夛細</strong><br />濡傛灉鎴戜滑宸茬粡鏈変竴浜涘疄鐜頒簡鐗瑰畾鍔熻兘鐨凙TL紿楀彛綾伙紝鎴戜滑鍙互浠庡畠浠淳鐢熸柊綾諱互鍏呭垎鍒╃敤緇ф壙鐨勪紭鐐廣傛瘮濡傦細 <pre>class CBase: public CWindowImpl< CBase > // simple base window class: shuts down app when closed { BEGIN_MSG_MAP( CBase ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) END_MSG_MAP() LRESULT OnDestroy( UINT, WPARAM, LPARAM, BOOL& ) { PostQuitMessage( 0 ); return 0; } }; class CDerived: public CBase // derived from CBase; handles mouse button events { BEGIN_MSG_MAP( CDerived ) MESSAGE_HANDLER( WM_LBUTTONDOWN, OnButtonDown ) END_MSG_MAP() LRESULT OnButtonDown( UINT, WPARAM, LPARAM, BOOL& ) { ATLTRACE( "button down\n" ); return 0; } }; // in WinMain(): ... CDerived win; win.Create( NULL, CWindow::rcDefault, "derived window" ); </pre>鍙槸錛屼笂闈㈢殑浠g爜鏈変竴涓棶棰樸傚綋鎴戜滑鍦ㄨ皟璇曟ā寮忎笅榪愯榪欎釜紼嬪簭錛屼竴涓獥鍙e嚭鐜頒簡錛屽鏋滄垜浠湪榪欎釜紿楀彛涓崟鍑伙紝鈥渂utton down鈥濆皢鍑虹幇鍦ㄨ緭鍑虹獥鍙d腑錛岃繖鏄疌Drived綾葷殑鍔熻兘錛屽彲鏄紝褰撴垜浠叧闂繖涓獥鍙g殑鏃跺欙紝紼嬪簭騫朵笉閫鍑猴紝灝界CBase綾誨鐞嗕簡WM_DESTROY娑堟伅騫朵笖CDrived綾繪槸浠嶤Base綾繪淳鐢熺殑銆?<br /><br />Why錛熷洜涓烘垜浠繀欏繪槑紜湴灝嗕竴涓秷鎭槧灝勮〃閾炬帴鍒板彟澶栦竴涓傚涓嬶細 <pre>BEGIN_MSG_MAP( CDerived ) MESSAGE_HANDLER( WM_LBUTTONDOWN, OnButtonDown ) CHAIN_MSG_MAP( CBase ) // 閾炬帴鍒板熀綾? END_MSG_MAP() </pre>鐜板湪錛屼換浣曞湪CDrived綾諱腑娌℃湁琚鐞嗙殑娑堟伅閮戒細琚紶鍒癈Base綾諱腑銆?<br /><br />涓轟粈涔堜笉鑷姩灝嗘淳鐢熺被鐨勬秷鎭槧灝勫拰瀹冪殑鍩虹被鐨勬秷鎭槧灝勯摼鎺ヨ搗鏉ュ憿錛熻繖鏄洜涓哄湪ATL鐨勪綋緋葷粨鏋勪腑鏈夊緢澶氬閲嶇戶鎵跨殑鎯呭喌錛岃繖縐嶆儏鍐典笅娌℃湁鍔炴硶鐭ラ亾絀剁珶搴旇閾炬帴鍒板摢涓熀綾伙紝鎵浠ュ彧濂借紼嬪簭鍛樿嚜宸辨潵鍋氬喅瀹氥?<br /><br />鍙夌殑娑堟伅鏄犲皠錛?<br />娑堟伅鏄犲皠閾懼厑璁稿涓被鍚屾椂榪涜娑堟伅澶勭悊錛屽悓鏃朵篃甯︽潵浜嗛棶棰橈細濡傛灉鎴戜滑鍦ㄥ涓被涓兘瑕佸搷搴擶M_CREATE娑堟伅錛屼絾鏄笉鍚岀殑綾婚渶瑕佸熀綾繪彁渚涗笉鍚岀殑澶勭悊錛屾庝箞鍔炲憿錛熶負浜嗚В鍐寵繖涓棶棰橈紝ATL浣跨敤浜嗗彲閫夌殑娑堟伅鏄犲皠錛氬皢娑堟伅鏄犲皠琛ㄥ垎鎴愬緢澶氳妭錛屾瘡涓鑺傜敤涓嶅悓鐨勬暟瀛楁爣璇嗭紝姣忎竴鑺傞兘鏄竴涓彲閫夌殑娑堟伅鏄犲皠琛ㄣ?<pre>// in class CBase: BEGIN_MSG_MAP( CBase ) MESSAGE_HANDLER( WM_CREATE, OnCreate1 ) MESSAGE_HANDLER( WM_PAINT, OnPaint1 ) ALT_MSG_MAP( 100 ) MESSAGE_HANDLER( WM_CREATE, OnCreate2 ) MESSAGE_HANDLER( WM_PAINT, OnPaint2 ) ALT_MSG_MAP( 101) MESSAGE_HANDLER( WM_CREATE, OnCreate3 ) MESSAGE_HANDLER( WM_PAINT, OnPaint3 ) END_MSG_MAP() </pre>濡備笂錛屽熀綾葷殑娑堟伅鏄犲皠琛ㄧ敱3鑺傜粍鎴愶細涓涓粯璁ょ殑娑堟伅鏄犲皠琛紙闅愬惈鐨勬爣璇嗕負0錛夊拰涓や釜鍙夌殑娑堟伅鏄犲皠琛紙鏍囪瘑涓?00鍜?01錛夈?<br /><br />褰撲綘閾炬帴娑堟伅鏄犲皠琛ㄦ椂錛屾寚瀹氫綘鎵甯屾湜鐨勬柟妗堢殑鏍囪瘑錛屽涓嬶細 <pre>class CDerived: public CBase { BEGIN_MSG_MAP( CDerived ) CHAIN_MSG_MAP_ALT( CBase, 100 ) END_MSG_MAP() ... </pre>CDrived綾葷殑娑堟伅鏄犲皠琛ㄩ摼鎺ュ埌CBase綾諱腑鏍囪瘑鍙蜂負100鐨勫彲閫夎妭錛屽洜姝ゅ綋WM_PAINT鍒拌揪鏃訛紝CBase::OnPaint2琚皟鐢ㄣ?<br />錛堣瘧鑰呮敞錛氭垜瑙夊緱榪欑鏂規(guī)硶涓嶅お鍚堜箮C++鐨勬濇兂錛屽熀綾葷殑緙栧啓鑰呬笉涓瀹氭昏兘鐭ラ亾媧劇敓鑷畠鐨勭被浼氭湁鍝簺闇姹傦紝鑰屼笖鎶婃墍鏈変笉鍚岀殑鐗堟湰閮藉湪鍩虹被涓疄鐜幫紝鍩虹被涓棤鐢ㄧ殑浠g爜閲忎細澶уぇ澧炲姞銆傛洿濂界殑鍔炴硶搴旇鏄妸鍩虹被涓殑娑堟伅澶勭悊鍑芥暟澹版槑涓鴻櫄鍑芥暟銆傛諱箣錛屾垜瑙夊緱榪欎竴灝忚妭騫朵笉鑳戒綋鐜板嚭鍙夋秷鎭槧灝勭殑鐪熸鐢ㄩ斻傦級 <br /><br />鍏跺畠綾誨瀷鐨勯摼錛?<br />闄や簡鍩虹被娑堟伅鏄犲皠閾撅紝ATL涔熸彁渚涗簡鎴愬憳閾撅紙member chaining錛夊拰鍔ㄦ侀摼(dynamic chaining)錛岃繖浜涘緢灝戜嬌鐢ㄥ埌鐨勯摼鎶鏈秴鍑轟簡鎴戜滑榪欑瘒鏂囩珷鐨勮璁鴻寖鍥達紝浣嗘槸鍙互綆鍗曟彁涓涓嬨傛垚鍛橀摼鍏佽鎶婃秷鎭槧灝勯摼鎺ュ埌涓涓被鐨勬垚鍛樺彉閲忥紝鍔ㄦ侀摼鍏佽鍦ㄨ繍琛屾椂榪涜鍔ㄦ侀摼鎺ャ傚鏋滀綘鎯充簡瑙f洿澶氾紝璇峰弬鑰傾TL鏂囨。涓殑CHAIN_MSG_MAP_DYNAMIC 鍜孋HAIN_MSG_MAP_MEMBER鐨勭浉鍏沖唴瀹廣?<br /><br /><strong><a id="A8" name="A8"></a>紿楀彛鐨勮秴綾誨寲錛?/strong><br />瓚呯被鍖栧畾涔変竴涓被錛屽茍涓洪瀹氫箟鐨勭獥鍙g被錛堝鎸夐挳綾繪垨鍒楄〃妗嗙被錛夋坊鍔犳柊鐨勫姛鑳斤紝涓嬮潰鐨勪緥瀛愯秴綾誨寲涓涓寜閽紝璁╄繖涓寜閽湪琚崟鍑葷殑鏃跺欏彂鍑鴻渹楦c?<pre>class CBeepButton: public CWindowImpl< CBeepButton > { public: DECLARE_WND_SUPERCLASS( _T("BeepButton"), _T("Button") ) BEGIN_MSG_MAP( CBeepButton ) MESSAGE_HANDLER( WM_LBUTTONDOWN, OnLButtonDown ) END_MSG_MAP() LRESULT OnLButtonDown( UINT, WPARAM, LPARAM, BOOL& bHandled ) { MessageBeep( MB_ICONASTERISK ); bHandled = FALSE; // alternatively: DefWindowProc() return 0; } }; // CBeepButton </pre>DECLARE_WND_SUPERCLASS瀹忓0鏄庝簡榪欎釜紿楀彛鐨勭被鍚嶏紙鈥淏eepButton鈥濓級鍜岃瓚呯被鍖栫殑綾誨悕錛堚淏utton鈥濓級銆傚畠鐨勬秷鎭槧灝勮〃鍙湁涓涓叆鍙i」錛屽皢WM_LBUTTONDOWN娑堟伅鏄犲皠鍒癘nLButtonDown鍑芥暟銆傚叾浣欑殑娑堟伅閮借榛樿鐨勭獥鍙h繃紼嬪鐞嗭紝闄や簡鍙互鍙戝嚭铚傞福澶栵紝CbeepButton闇瑕佸拰鍏跺畠鐨勬寜閽〃鐜扮浉鍚岋紝鍥犳鍦∣nLButtonDown鍑芥暟鐨勬渶鍚庯紝闇瑕佸皢bHandled璁劇疆涓篎ALSE錛岃榛樿鐨勭獥鍙h繃紼嬪湪OnLButtonDown鍑芥暟瀹屾垚鍚庡WM_LBUTTONDOWN娑堟伅榪涜鍏跺畠鐨勫鐞嗐傦紙鍙﹀鐨勪竴縐嶆柟娉曟槸鐩存帴璋冪敤DefWindowProc鍑芥暟銆傦級 <br /><br />鍒扮洰鍓嶄負姝紝鎴戜滑鎵鍋氱殑鍙槸瀹氫箟浜嗕竴涓柊綾伙紱鎴戜滑渚濈劧闇瑕佸垱寤轟竴浜涚湡姝g殑CbeepButton紿楀彛錛屼笅闈㈢殑綾誨畾涔変簡涓や釜CbeepButton綾誨瀷鐨勬垚鍛樺彉閲忥紝鍥犳錛屽綋榪欎釜綾葷殑紿楀彛琚垱寤烘椂錛屽皢浼氬垱寤轟袱涓狢beepButton綾誨瀷鐨勫瓙紿楀彛銆?<pre>const int ID_BUTTON1 = 101; const int ID_BUTTON2 = 102; class CMyWindow: public CWindowImpl< CMyWindow, CWindow, CWinTraits<WS_OVERLAPPEDWINDOW|WS_VISIBLE> > { CBeepButton b1, b2; BEGIN_MSG_MAP( CMyWindow ) MESSAGE_HANDLER( WM_CREATE, OnCreate ) COMMAND_CODE_HANDLER( BN_CLICKED, onClick ) END_MSG_MAP() LRESULT onClick(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { ATLTRACE( "Control %d clicked\n", wID ); return 0; } LRESULT OnCreate( UINT, WPARAM, LPARAM, BOOL& ) { RECT r1 = { 10, 10, 250, 80 }; b1.Create(*this, r1, "beep1", WS_CHILD|WS_VISIBLE, 0, ID_BUTTON1); RECT r2 = { 10, 110, 250, 180 }; b2.Create(*this, r2, "beep2", WS_CHILD|WS_VISIBLE, 0, ID_BUTTON2); return 0; } }; // CMyWindow </pre><strong><a id="A9" name="A9"></a>紿楀彛鐨勫瓙綾誨寲錛?/strong><br /><br />瀛愮被鍖栧厑璁告垜浠敼鍙樹竴涓凡緇忓瓨鍦ㄧ殑紿楀彛鐨勮涓猴紝鎴戜滑緇忓父鐢ㄥ畠鏉ユ敼鍙樻帶浠剁殑琛屼負銆傚畠鐨勫疄鐜版満鍒舵槸鎻掑叆涓涓秷鎭槧灝勮〃鏉ユ埅鍙栧彂鍚戞帶浠剁殑娑堟伅銆備婦渚嬭鏄庯細鍋囪鏈変竴涓璇濇錛屽璇濇涓婃湁涓涓紪杈戞鎺т歡錛屾垜浠兂璁╄繖涓帶浠跺彧鎺ュ彈涓嶆槸鏁板瓧鐨勫瓧絎︺傛垜浠彲浠ユ埅鑾峰彂寰榪欎釜鎺т歡鐨刉M_CHAR娑堟伅騫舵姏寮冩帴鏀跺埌鐨勬暟瀛楀瓧絎︺備笅闈㈢殑綾誨疄鐜拌繖涓姛鑳斤細 <pre>class CNoNumEdit: public CWindowImpl< CNoNumEdit > { BEGIN_MSG_MAP( CNoNumEdit ) MESSAGE_HANDLER( WM_CHAR, OnChar ) END_MSG_MAP() LRESULT OnChar( UINT, WPARAM wParam, LPARAM, BOOL& bHandled ) { TCHAR ch = wParam; if( _T(''0'') <= ch && ch <= _T(''9'') ) MessageBeep( 0 ); else bHandled = FALSE; return 0; } }; </pre>榪欎釜綾誨彧澶勭悊涓涓秷鎭疻M_CHAR錛屽鏋滆繖涓瓧絎︽槸鏁板瓧鐨勮瘽錛屽垯璋冪敤MessageBeep( 0 )騫惰繑鍥烇紝榪欐牱鍙互鏈夋晥鍦板拷鐣ヨ繖涓瓧絎︺傚鏋滀笉鏄暟瀛楋紝鍒欏皢bHandled璁劇疆涓篎ALSE錛屾寚鏄庨粯璁ょ殑紿楀彛榪囩▼榪欎釜娑堟伅闇瑕佽繘涓姝ュ鐞嗐?<br /><br />鐜板湪鎴戜滑灝嗗瓙綾誨寲涓涓紪杈戞鎺т歡錛屼互渚緾noNumEdit鑳藉鎶㈠厛澶勭悊鍙戝埌榪欎釜緙栬緫妗嗗緱娑堟伅銆傦紙涓嬮潰寰椾緥瀛愮敤鍒頒簡CdialogImpl綾伙紝榪欎釜綾繪垜浠皢鍦ˋTL涓殑瀵硅瘽妗嗙被涓鑺備腑浠嬬粛銆傦級鍦ㄨ繖涓緥瀛愪腑錛孋myDialog綾諱腑鐢ㄥ埌浜嗕竴涓璇濇璧勬簮錛圛D鍙蜂負IDD_DIALOG1錛夛紝瀵硅瘽妗嗕腑鏈変竴涓紪杈戞鎺т歡錛圛D鍙蜂負IDC_EDIT1錛夛紝褰撳璇濇鍒濆鍖栫殑鏃跺欙紝緙栬緫妗嗙粡榪嘢ubclassWindow鑰屽彉鎴愪竴涓笉鎺ュ彈鏁板瓧鐨勭紪杈戞錛?<pre>class CMyDialog: public CDialogImpl<CMyDialog> { public: enum { IDD = IDD_DIALOG1 }; BEGIN_MSG_MAP( CMyDialog ) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) END_MSG_MAP() LRESULT OnInitDialog( UINT, WPARAM, LPARAM, BOOL& ) { ed.SubclassWindow( GetDlgItem( IDC_EDIT1 ) ); return 0; } CNoNumEdit ed; }; </pre><strong><a id="A10" name="A10"></a></strong></div> <div> </div> <br /> <br /> <div id="hvzpftn" class="dashed">銆</div> <br />鏂囩珷寮曠敤鑷? <a target="_blank">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvc60/html/atlwindow.asp</a><img src ="http://m.shnenglu.com/yishanhante/aggbug/19687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-13 09:52 <a href="http://m.shnenglu.com/yishanhante/articles/19687.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢ˋTL寤虹珛杞婚噺綰х殑COM瀵硅薄銆愪簩銆?/title><link>http://m.shnenglu.com/yishanhante/articles/19659.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 12 Mar 2007 13:29:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19659.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19659.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19659.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19659.html</trackback:ping><description><![CDATA[ <p> <b>璧鋒綃?/b> <br /> <br />聽聽聽 鍦ㄦ湰鏂囩殑<a >絎竴閮ㄥ垎</a>錛屾垜浠畝瑕佷粙緇嶄簡ATL鐨勪竴浜涜儗鏅煡璇嗕互鍙夾TL鎵闈㈠悜鐨勫紑鍙戞妧鏈拰鐜銆傚湪榪欎竴閮ㄥ垎 灝嗗紑濮嬭蛋榪汚TL錛岃榪癆TL緙栫▼鐨勫熀鏈柟娉曘佸師鍒欏拰蹇呴』瑕佹敞鎰忕殑闂銆?br />聽聽聽 鐞嗚ВATL鏈瀹規(guī)槗鐨勬柟娉曟槸鑰冨療瀹冨瀹㈡埛绔紪紼嬬殑鏀寔銆傚浜嶤OM緙栫▼鏂版墜鑰岃█錛屼竴涓鎵嬬殑涓昏闂涔嬩竴鏄紜鐞嗘帴鍙f寚閽堢殑寮曠敤璁℃暟銆侰OM鐨勫紩鐢ㄨ鏁版硶鍒欐槸娌℃湁榪愯鏃跺己鍒?鎬х殑錛屼篃灝辨槸璇存瘡涓涓鎴風蹇呴』淇濊瘉瀵瑰璞$殑鎵胯銆?br />聽聽聽 鏈夌粡楠岀殑COM緙栫▼鑰呭父甯鎬範鎯簬浣跨敤鏂囨。涓紙濡傘奍nside OLE銆嬶級鎻愬嚭鐨勬爣鍑嗘ā寮忋傝皟鐢ㄦ煇涓嚱鏁版垨鏂規(guī)硶錛岃繑鍥炴帴鍙f寚閽堬紝鍦ㄦ煇涓椂闂磋寖鍥村唴浣跨敤榪欎釜鎺ュ彛鎸囬拡錛岀劧鍚庨噴鏀懼畠銆備笅闈㈡槸浣跨敤榪欑妯″紡鐨勪唬鐮佷緥瀛愶細 </p> <pre>void f(void) { IUnknown *pUnk = 0; // 璋冪敤 HRESULT hr = GetSomeObject(&pUnk); if (SUCCEEDED(hr)) { // 浣跨敤 UseSomeObject(pUnk); // 閲婃斁 pUnk->Release(); } } </pre>聽聽聽 榪欎釜妯″紡鍦–OM紼嬪簭鍛樺績涓槸濡傛鏍規(guī)繁钂傚浐錛屼互鑷充簬浠栦滑甯稿父涓嶅啓瀹為檯浣跨敤鎸囬拡鐨勮鍙ワ紝鑰屾槸鍏堝湪浠g爜鍧楁湯灝炬暡鍏elease璇彞銆傝繖寰堝儚C紼嬪簭鍛樹嬌鐢╯witch璇彞鏃剁殑鏉′歡鍙嶅皠涓鏍鳳紝鍏堟暡鍏reak鍐嶈銆?br />聽聽聽 鍏跺疄璋冪敤Release瀹炲湪涓嶆槸浠涔堝彲鎬曠殑璐熸媴錛屼絾鏄紝瀹㈡埛绔▼搴忓憳闈復涓や釜鐩稿綋涓ラ噸鐨勯棶棰樸傜涓涓棶棰樹笌鑾峰緱澶氭帴鍙f寚閽堟湁鍏熾傚鏋滄煇涓嚱鏁伴渶瑕佸湪鍋氫換浣曞疄闄呭伐浣滀箣鍓嶈幏寰椾笁涓帴鍙f寚閽堬紝涔熷氨鏄鍦ㄧ涓涓嬌鐢ㄦ寚閽堢殑璇彞涔嬪墠蹇呴』瑕佺敱涓変釜璋冪敤璇彞銆傚湪涔﹀啓浠g爜鏃訛紝榪欏父甯告剰鍛崇潃紼嬪簭鍛橀渶瑕佸啓璁稿宓屽鏉′歡璇彞錛屽錛?br /><pre>void f(void) { IUnknown *rgpUnk[3]; HRESULT hr = GetObject(rgpUnk); if (SUCCEEDED(hr)) { hr = GetObject(rgpUnk + 1); if (SUCCEEDED(hr)) { hr = GetObject(rgpUnk + 2); if (SUCCEEDED(hr)) { UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]); rgpUnk[2]->Release(); } rgpUnk[1]->Release(); } rgpUnk[0]->Release(); } } </pre>聽聽聽 鍍忚繖鏍風殑璇彞甯稿父淇冧嬌紼嬪簭鍛樺皢TAB閿緗垚涓涓垨涓や釜絀烘牸錛岀敋鑷蟲儏鎰夸嬌鐢ㄥぇ涓鐐圭殑鏄劇ず鍣ㄣ備絾浜嬫儏騫朵笉鎬繪槸鎸変綘鎯寵薄鐨勯偅鏍鳳紝鐢變簬縐嶇鍘熷洜欏圭洰鍥㈤槦涓殑COM緇勪歡緙栫▼浜哄憳寰寰寰椾笉鍒?鎵鎯崇殑紜歡鏀寔錛岃屼笖鍦ㄥ叕鍙哥‘瀹氬叧浜嶵AB閿殑浣跨敤鏍囧噯涔嬪墠錛岀▼搴忓憳甯稿父姹傚姪浜庝嬌鐢ㄦ湁寰堝ぇ浜夎浣嗕粛鐒舵湁鏁堢殑鈥淕OTO鈥濊鍙ワ細<br /><pre>void f(void) { IUnknown *rgpUnk[3]; ZeroMemory(rgpUnk, sizeof(rgpUnk)); if (FAILED(GetObject(rgpUnk))) goto cleanup; if (FAILED(GetObject(rgpUnk+1))) goto cleanup; if (FAILED(GetObject(rgpUnk+2))) goto cleanup; UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]); cleanup: if (rgpUnk[0]) rgpUnk[0]->Release(); if (rgpUnk[1]) rgpUnk[1]->Release(); if (rgpUnk[2]) rgpUnk[2]->Release(); } </pre>榪欐牱鐨勪唬鐮佽櫧鐒朵笉閭d箞涓撲笟錛屼絾鑷沖皯鍑忓皯浜嗗睆騫曠殑姘村鉤婊氬姩銆?br />浣跨敤浠ヤ笂榪欎簺浠g爜孌墊綔鍦ㄧ潃鏇村姞媯樻墜鐨勯棶棰橈紝閭e氨鏄湪紕板埌C++寮傚父鏃躲傚鏋滃嚱鏁癠seObjects涓㈠嚭寮傚父錛屽垯閲婃斁鎸囬拡鐨勪唬鐮佽瀹屽叏灞忚斀鎺変簡銆?瑙e喅榪欎釜闂鐨勪竴涓柟娉曟槸浣跨敤Win32鐨勭粨鏋勫寲寮傚父澶勭悊錛圫EH錛夎繘琛岀粓緇撴搷浣滐細<br /><pre>void f(void) { IUnknown *rgpUnk[3]; ZeroMemory(rgpUnk, sizeof(rgpUnk)); __try { if (FAILED(GetObject(rgpUnk))) leave; if (FAILED(GetObject(rgpUnk+1))) leave; if (FAILED(GetObject(rgpUnk+2))) leave; UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]); } __finally { if (rgpUnk[0]) rgpUnk[0]->Release(); if (rgpUnk[1]) rgpUnk[1]->Release(); if (rgpUnk[2]) rgpUnk[2]->Release(); } </pre>聽聽聽 鍙儨Win32 SHE鍦–++涓殑琛ㄧ幇騫朵笉濡傛兂璞″緱閭d箞濂姐傝緝濂界殑鏂規(guī)硶鏄嬌鐢ㄥ唴寤虹殑C++寮傚父澶勭悊妯″瀷錛屽悓鏃跺仠姝嬌鐢ㄦ病鏈夊姞宸ヨ繃鐨勬寚閽堛傛爣鍑咰++搴撴湁涓涓被錛歛uto_ptr錛屽湪鍏舵瀽鏋勫嚱鏁頒腑瀹?姝諱簡涓涓搷浣滄寚閽堢殑delete璋冪敤錛堝嵆浣垮湪鍑虹幇寮傚父鏃朵篃鑳戒繚璇佽皟鐢級銆備笌涔嬬被浼鹼紝ATL鏈変竴涓狢OM鏅鴻兘鎸囬拡錛孋ComPtr錛屽畠鐨勬瀽鏋勫嚱鏁頒細姝g‘璋冪敤Release銆?br />聽聽聽 <a >CComPtr</a>綾誨疄鐜板鎴風鍩烘湰鐨凜OM寮曠敤璁℃暟妯″瀷銆侰ComPtr鏈変竴涓暟鎹垚鍛橈紝瀹冩槸涓涓湭緇忚繃浠諱綍鍔犲伐鐨凜OM鎺ュ彛鎸囬拡銆傚叾綾誨瀷琚綔涓烘ā鏉垮弬鏁頒紶閫掞細<br /><pre> CComPtr<IUnknown> unk; CComPtr<IClassFactory> cf; </pre>聽聽聽 緙虹渷鐨勬瀯閫犲嚱鏁板皢榪欎釜鍘熷鎸囬拡鏁版嵁鎴愬憳鍒濆鍖栦負NULL銆傛櫤鑳芥寚閽堜篃鏈夋瀯閫犲嚱鏁幫紝瀹冪殑鍙傛暟瑕佷箞鏄師濮嬫寚閽堬紝瑕佷箞鏄浉鍚岀被鍨嬬殑鏅鴻兘鍙傛暟銆備笉璁哄摢縐嶆儏鍐碉紝鏅鴻兘鎸囬拡閮借皟鐢ˋddRef鎺у埗寮曠敤銆侰ComPtr鐨勮祴鍊兼搷浣滅 鏃㈠彲浠ュ鐞嗗師濮嬫寚閽堬紝涔熷彲浠ュ鐞嗘櫤鑳芥寚閽堬紝騫朵笖鍦ㄨ皟鐢ㄦ柊鍒嗛厤鎸囬拡鐨凙ddRef涔嬪墠鑷姩閲婃斁淇濆瓨鐨勬寚閽堛傛渶閲嶈鐨勬槸錛孋ComPtr鐨勬瀽鏋勫嚱鏁伴噴鏀句繚瀛樼殑鎺ュ彛錛堝鏋滈潪絀猴級銆傝鐪嬩笅鍒椾唬鐮侊細<br /><pre>void f(IUnknown *pUnk1, IUnknown *pUnk2) { // 濡傛灉闈炵┖錛屾瀯閫犲嚱鏁拌皟鐢╬Unk1鐨凙ddRef CComPtr<iunknown> unk1(pUnk1); // 濡傛灉闈炵┖錛屾瀯閫犲嚱鏁拌皟鐢╱nk1.p鐨凙ddRef CComPtr<iunknown> unk2 = unk1; // 濡傛灉闈炵┖錛宱perator= 璋冪敤unk1.p鐨凴elease騫朵笖 //濡傛灉闈炵┖錛岃皟鐢╱nk2.p鐨凙ddRef unk1 = unk2; //濡傛灉闈炵┖錛屾瀽鏋勫嚱鏁伴噴鏀緐nk1 鍜?unk2 } </iunknown></iunknown></pre>聽聽聽 闄や簡姝g‘瀹炵幇COM鐨凙ddRef 鍜?Release瑙勫垯涔嬪錛孋ComPtr榪樺厑璁稿疄鐜板師濮嬪拰鏅鴻兘鎸囬拡鐨勯忔槑鎿嶄綔錛屽弬瑙?a >闄勮〃浜?/a>鎵紺恒備篃灝辨槸璇翠笅闈㈢殑浠g爜鎸夌収浣犳墍鎯寵薄鐨勬柟寮忚繍琛岋細<br /><pre>void f(IUnknown *pUnkCO) { CComPtr<iclassfactory> cf; HRESULT hr; // 浣跨敤鎿嶄綔絎?& 鑾峰緱瀵?&cf.p 鐨勫瓨鍙? hr = pUnkCO->QueryInterface(IID_IClassFactory,(void**)&cf); if (FAILED(hr)) throw hr; CComPtr<iunknown> unk; // 鎿嶄綔絎?-> 鑾峰緱瀵筩f.p鐨勫瓨鍙? // 鎿嶄綔絎?& 鑾峰緱瀵?&unk.p鐨勫瓨鍙? hr = cf->CreateInstance(0, IID_IUnknown, (void**)&unk); if (FAILED(hr)) throw hr; // 鎿嶄綔絎?IUnknown * 榪斿洖 unk.p UseObject(unk); // 鏋愭瀯鍑芥暟閲婃斁unk.p 鍜?cf.p } </iunknown></iclassfactory></pre>聽聽聽 闄や簡緙轟箯瀵筊elease鐨勬樉寮忚皟鐢ㄥ錛岃繖孌典唬鐮佸儚鏄函綺圭殑COM浠g爜銆傛湁浜咰ComPtr綾葷殑姝﹁錛屽墠闈㈡墍閬囧埌鐨勯夯鐑﹂棶棰橀】鏃跺彉寰楃畝鍗曚簡錛?br /><pre>void f(void) {<br /> CComPtr<IUnknown> rgpUnk[3];<br /> if (FAILED(GetObject(&rgpUnk[0]))) return;<br /> if (FAILED(GetObject(&rgpUnk[1]))) return;<br /> if (FAILED(GetObject(&rgpUnk[2]))) return;<br /> UseObjects(rgpUnk[0], rgpUnk[1], rgpUnk[2]);<br /> }<br /></pre>鐢變簬CComPtr瀵規(guī)搷浣滅閲嶈澆鐢ㄦ硶鐨勬墿灞曪紝浣垮緱浠g爜鐨勭紪璇戝拰榪愯鏃犳噲鍙嚮銆?br />聽聽聽 鍋囧畾妯℃澘綾葷煡閬撳畠鎵鎿嶇旱鐨勬寚閽堢被鍨嬶紝浣犲彲鑳戒細闂細閭d負浠涔堟櫤鑳芥寚閽堜笉鑳藉湪瀹冪殑鍔熻兘鎿嶄綔絎︽垨鏋勯犲嚱鏁頒腑鑷姩璋冪敤QueryInterface錛屼粠鑰屾洿鏈夋晥鍦板寘瑁匢Unknown鍛紵鍦╒isual C++ 5.0鍑烘潵浠ュ墠錛屾病鏈夊姙娉曞皢鏌愪釜鎺ュ彛鐨凣UID涓庡畠鐨勬湰韜殑C++綾誨瀷鍏寵仈璧鋒潵鈥斺擵isual C++ 5.0鐢ㄧ鏈夌殑declspec灝嗘煇涓狪ID涓庝竴涓帴鍙e畾涔夌粦瀹氬湪涓璧楓傚洜涓篈TL鐨勮璁?鑰冭檻鍒頒簡瀹冭涓庡ぇ閲忎笉鍚岀殑C++緙栬瘧鍣ㄤ竴璧峰伐浣滐紝瀹冮渶瑕佺敤涓庣紪璇戝櫒鏃犲叧鐨勬墜孌墊彁渚汫UID銆備笅闈㈡垜浠潵鎺㈣鍙︿竴涓被鈥斺擟ComQIPtr綾匯?br />聽聽聽 CComQIPtr涓嶤ComPtr鍏崇郴寰堝瘑鍒囷紙瀹為檯涓婏紝瀹冨彧澧炲姞浜嗕袱涓垚鍛樺嚱鏁幫級銆侰ComQIPtr蹇呴』瑕佷袱涓ā鏉垮弬鏁幫細涓涓槸琚搷綰電殑鎸囬拡綾誨瀷 錛屽彟涓涓槸瀵瑰簲浜庤繖涓寚閽堢被鍨嬬殑GUID銆備緥濡傦紝涓嬪垪浠g爜澹版槑浜嗘搷綰礗DataObject 鍜孖Persist鎺ュ彛鐨勬櫤鑳芥寚閽堬細<br /><pre> CComQIPtr<IDataObject, &IID_IDataObject> do; CComQIPtr<IPersist, &IID_IPersist> p; </pre>聽聽聽 CComQIPtr鐨勪紭鐐規(guī)槸瀹冩湁閲嶈澆鐨勬瀯閫犲嚱鏁板拰璧嬪兼搷浣滅銆傚悓綾葷増鏈紙渚嬪錛屾帴鍙楃浉鍚岀被鍨嬬殑鎺ュ彛錛変粎浠匒ddRef鍙寵竟鐨勮祴鍊?鍒濆鍖栨搷浣溿傝繖瀹為檯涓婂氨鏄疌ComPtr鐨勫姛鑳姐傚紓綾葷増鏈紙鎺ュ彈綾誨瀷涓嶄竴鑷寸殑鎺ュ彛錛夋紜皟鐢≦ueryInterface鏉ュ喅瀹氭槸鍚﹁繖涓璞$‘瀹炴敮鎸佹墍璇鋒眰鐨勬帴鍙o細<br /><pre> void f(IPersist *pPersist) { CComQIPtr<IPersist, &IID_IPersist> p; // 鍚岀被璧嬪?- AddRef''s p = pPersist; CComQIPtr<IDataObject, &IID_IDataObject> do; // 寮傜被璧嬪?- QueryInterface''s do = pPersist; } </pre>聽聽聽 鍦ㄧ浜岀璧嬪艱鍙ヤ腑錛屽洜涓簆Persist鏄潪IDataObject *綾誨瀷錛屼絾瀹冩槸媧劇敓浜嶪Unknown鐨勬帴鍙f寚閽堬紝CComQIPtr閫氳繃pPersist璋冪敤QueryInterface鏉ヨ瘯鍥捐幏寰楄繖涓璞$殑IDataObject鎺ュ彛鎸囬拡銆傚鏋淨ueryInterface璋冪敤鎴愬姛錛屽垯姝ゆ櫤鑳芥寚閽堝皢鍚湁浣滀負緇撴灉鐨勫師濮婭DataObject鎸囬拡銆傚鏋淨ueryInterface璋冪敤澶辮觸錛屽垯do.p灝嗚緗負null銆傚鏋淨ueryInterface榪斿洖鐨凥RESULT鍊煎緢閲嶈錛屼絾鍙堟病鏈夊姙娉曚粠璧嬪兼搷浣滆幏寰楀叾鍊兼椂錛屽垯蹇呴』鏄懼紡璋冪敤QueryInterface銆?br />聽聽聽 鏃㈢劧鏈変簡CComQIPtr錛岄偅涓轟粈涔堣繕瑕丆ComPtr鍛紵鐢卞嚑涓悊鐢憋細棣栧厛錛孉TL鏈鍒濈殑鍙戝竷鐗堟湰鍙敮鎸丆ComPtr錛屾墍浠ュ畠?yōu)兏鐩村悎娉曞湴淇濈暀涓嬫潵浜嗐傚叾浜岋紙涔熸槸鏈閲嶈鐨勭悊鐢憋級錛岀敱浜庨噸杞界殑鏋勯犲嚱鏁板拰璧嬪兼搷浣滐紝瀵笽Unknown浣跨敤CComQIPtr鏄潪娉曠殑銆傚洜涓烘墍鏈塁OM鎺ュ彛鐨勭被鍨嬪畾涔夐兘蹇呴』涓嶪Unknown鍏煎銆?br /><pre> CComPtr<IUnknown> unk; </pre>浠庡姛鑳戒笂灝嗗畠絳夊悓浜?<pre> CComQIPtr<IUnknown, &IID_IUnknown> unk; </pre>鍓嶈呮紜傚悗鑰呮槸閿欒鐨勭敤娉曘傚鏋滀綘榪欐牱鍐欎簡錛孋++緙栬瘧鍣ㄥ皢鎻愰啋浣犳敼姝c?br />聽聽聽 灝咰ComPtr浣滀負棣栭夌殑鍙﹀涓涓悊鐢卞彲鑳芥槸涓浜涘紑鍙戜漢鍛樼浉淇¢潤鎮(zhèn)勬?zhèn)勫湴璋冪敤QueryInterface錛屾病鏈夎鍛婏紝鍓婂急浜咰++緋葷粺鐨勭被鍨嬨傛瘯绔燂紝C++鍦ㄦ病鏈夎繘琛屽己鍒剁被鍨嬭漿鎹㈢殑鎯呭喌涓嬩笉鍏佽瀵圭被鍨嬩笉涓鑷寸殑鍘熷鎸囬拡 榪涜璧嬪兼搷浣滐紝鎵浠ヤ負浠涔堣鐢ㄦ櫤鑳芥寚閽堢殑閬撶悊涔熷湪榪欙紝騫歌繍鐨勬槸寮鍙戜漢鍛樺彲浠ラ夋嫨鏈鑳芥弧瓚抽渶瑕佺殑鎸囬拡綾誨瀷銆?br />聽聽聽 璁稿寮鍙戜漢鍛樺皢鏅鴻兘鎸囬拡鐪嬫垚鏄榪囦簬鐨勫鏉傜紪紼嬩換鍔$殑綆鍖栥傛垜鏈鍒濅篃鏄繖涔堣涓虹殑銆備絾鍙鐣欐剰瀹冧滑浣跨敤COM鏅鴻兘鎸囬拡鐨勬柟娉曘傚氨浼氶愭笎璁よ瘑鍒板畠浠紩鍏ョ殑娼滃湪鍗遍櫓涓庡畠浠В鍐崇殑闂涓鏍峰銆?br />鍏充簬榪欎竴鐐癸紝鎴戠敤涓涓幇鎴愮殑浣跨敤鍘熷鎸囬拡鐨勫嚱鏁頒負渚嬶細<br /><pre> void f(void) { IFoo *pFoo = 0; HRESULT hr = GetSomeObject(&pFoo); if (SUCCEEDED(hr)) { UseSomeObject(pFoo); pFoo->Release(); } } </pre>灝嗗畠鑷劧鑰岀劧杞崲鍒頒嬌鐢–ComPtr銆?br /><pre> void f(void) { CComPtr<IFoo> pFoo = 0; HRESULT hr = GetSomeObject(&pFoo); if (SUCCEEDED(hr)) { UseSomeObject(pFoo); pFoo->Release(); } } </pre>聽聽聽 娉ㄦ剰CComPtr 鍜?CComQIPtr杈撳嚭鎵鏈夊彈鎺ф帴鍙f垚鍛橈紝鍖呮嫭AddRef鍜孯elease銆傚彲鎯滃綋瀹㈡埛绔氳繃鎿嶄綔絎?>鐨勭粨鏋滆皟鐢≧elease鏃訛紝鏅鴻兘鎸囬拡寰堝仴蹇?錛屼細浜屾璋冪敤鏋勯犲嚱鏁頒腑鐨凴elease銆傛樉鐒惰繖鏄敊璇殑錛岀紪璇戝櫒鍜岄摼鎺ュ櫒涔熸鐒舵帴鍙椾簡榪欎釜浠g爜銆傚鏋滀綘榪愭皵濂界殑璇濓紝璋冭瘯鍣ㄤ細寰堝揩鎹曡幏鍒拌繖涓敊璇?br />聽聽聽 浣跨敤ATL鏅鴻兘鎸囬拡鐨勫彟涓涓寮曡搗娉ㄦ剰鐨勯闄╂槸綾誨瀷寮哄埗杞崲鎿嶄綔絎﹀鍘熷鎸囬拡鎻愪緵鐨勮闂傚鏋滈殣寮忓己鍒惰漿鎹㈡搷浣滅鐨勪嬌鐢ㄥ瓨鍦ㄤ簤璁傚綋 ANSI/ISO C++ 濮斿憳浼氬湪鍐沖畾閲囩敤鏌愪釜C++涓茬被鏃訛紝浠栦滑鏄庣‘紱佹闅愬紡綾誨瀷杞崲銆傝屾槸瑕佹眰蹇呴』鏄懼紡浣跨敤c_str鍑芥暟鍦ㄩ渶瑕佸父閲廲har *錛坈onst char *錛夌殑鍦版柟浼犻掓爣鍑咰++涓層侫TL鎻愪緵浜嗕竴縐嶉殣鍚紡鐨勭被鍨嬭漿鎹㈡搷浣滅欏哄埄鍦拌В鍐充簡榪欎釜闂銆傞氬父錛岃繖涓漿鎹㈡搷浣滅鍙互鏍規(guī)嵁浣犵殑鍠滃ソ鏉ヤ嬌鐢紝鍏佽浣犲皢鏅鴻兘鎸囬拡浼犻掑埌闇瑕佺敤鍘熷鎸囬拡鐨勫嚱鏁般?br /><pre> void f(IUnknown *pUnk) { CComPtr<iunknown> unk = pUnk; // 闅愬紡璋冪敤鎿嶄綔絎Unknown *() CoLockObjectExternal(unk, TRUE, TRUE); } </iunknown></pre>榪欐浠g爜鑳芥紜繍琛岋紝浣嗘槸涓嬮潰鐨勪唬鐮佷篃涓嶄細浜х敓璀﹀憡淇℃伅錛岀紪璇戞甯擱氳繃錛?<pre>HRESULT CFoo::Clone(IUnknown **ppUnk) { CComPtr<iunknown> unk; CoCreateInstance(CLSID_Foo, 0, CLSCTX_ALL, IID_IUnknown, (void **) &unk); // 闅愬紡璋冪敤鎿嶄綔絎Unknown *() *ppUnk = unk; return S_OK; } </iunknown></pre>聽聽聽 鍦ㄨ繖縐嶆儏鍐典笅錛屾櫤鑳芥寚閽堬紙unk錛夊鍘熷鍊奸拡**ppUnk鐨勮祴鍊艱Е鍙戜簡涓庡墠闈唬鐮佹鐩稿悓鐨勫己鍒剁被鍨嬭漿鎹€傚湪絎竴涓緥瀛愪腑錛屼笉闇瑕佺敤AddRef銆傚湪絎簩涓緥瀛愪腑錛屽繀欏昏鐢ˋddRef銆?br />聽聽聽 鏈夊叧浣跨敤鏅鴻兘鎸囬拡鐨勬洿璇︾粏涓鑸俊鎭紝璇峰弬瑙丼cott Meyer鐨勩奙ore Effective C++銆嬶紙Addison-Wesley, 1995騫村嚭鐗堬級銆傚浗鍐呯洰鍓嶈繕娌℃湁榪欐湰涔︾殑涓瘧鏈垨褰卞嵃鏈傛湁鍏矯OM鏅鴻兘鎸囬拡鐨勬洿澶氱壒瀹氫俊鎭紝璇峰弬瑙丏on Box鐨勪竴綃囧叧浜庢櫤鑳芥寚閽堢殑涓撻鏂囩珷http://www.develop.com/dbox/cxx/SmartPointer.htm銆?錛堝緟緇級<br /><img src ="http://m.shnenglu.com/yishanhante/aggbug/19659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-12 21:29 <a href="http://m.shnenglu.com/yishanhante/articles/19659.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>CComPtr 鍜?CComQIPtr http://m.shnenglu.com/yishanhante/articles/19619.htmljayjayMon, 12 Mar 2007 03:39:00 GMThttp://m.shnenglu.com/yishanhante/articles/19619.htmlhttp://m.shnenglu.com/yishanhante/comments/19619.htmlhttp://m.shnenglu.com/yishanhante/articles/19619.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/19619.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/19619.html瀵逛簬鎿嶄綔鍘熷鐨勬帴鍙f寚閽堟槸姣旇緝楹葷儲鐨勶紝闇瑕佹垜浠嚜宸辨帶鍒跺紩鐢ㄨ鏁般丄PI 璋冪敤銆佸紓甯稿鐞嗐備簬鏄?ATL 鎻愪緵浜?/p>

2涓櫤鑳芥寚閽堢殑妯℃澘鍖呰綾伙紝CComPtr<> 鍜?CComQIPtr<>錛岃繖涓や釜綾婚兘鍦?<atlbase.h> 涓0鏄庛侰ComQIPtr<>

鍖呭惈浜?CComPtr<>鐨勬墍鏈夊姛鑳斤紝鍥犳鎴戜滑鍙互瀹屽叏鐢?CComQIPtr<> 鏉ヤ嬌鐢ㄦ櫤鑳芥帴鍙f寚閽堬紝鍞竴瑕佽鏄庣殑涓鐐瑰氨

鏄細CComQIPtr<> 鐢變簬浣跨敤浜嗚繍綆楃鐨勯噸杞藉姛鑳斤紝瀹冧細鑷姩甯垜浠皟鐢≦ueryInterface()鍑芥暟錛屽洜姝?

CComQIPtr<> 鍞竴鐨勭己鐐瑰氨鏄笉鑳藉畾涔?IUnknown * 鎸囬拡銆?/p>

銆銆聽 // 鏅鴻兘鎸囬拡 smart pointer錛屾寜鐓у寛鐗欏埄鍛藉悕娉曪紝涓鑸互 sp 寮澶存潵琛ㄧず鍙橀噺綾誨瀷
銆銆聽 CComPtr < IUnknown > spUnk;聽// 姝g‘
銆銆聽 // 鍋囪 IFun 鏄竴涓帴鍙g被鍨?br />銆銆聽 CComPtr < IFun > spFun;聽// 姝g‘
銆銆聽 CComQIPtr < IFun > spFun;聽// 姝g‘
銆銆聽 CComQIPtr < IFun, &IID_IFun > spFun;聽// 姝g‘
銆銆聽 CComQIPtr < IUnknown > spUnk;聽// 閿欒錛丆ComQIPtr涓嶈兘瀹氫箟IUnknown鎸囬拡
緇欐櫤鑳芥寚閽堣祴鍊肩殑鏂規(guī)硶錛氥銆聽 CComQIPtr < IFun > spFun;聽// 璋冪敤鏋勯犲嚱鏁幫紝榪樻病鏈夎祴鍊鹼紝琚寘瑁呯殑鍐呴儴

鎺ュ彛鎸囬拡涓?NULL
銆銆聽
銆銆聽 CComQIPtr < IFun > spFun( pOtherInterface );聽// 璋冪敤鏋勯犲嚱鏁幫紝鍐呴儴鎺ュ彛鎸囬拡璧嬪間負
銆銆聽 // 閫氳繃 pOtherInterface 榪欎釜鏅氭帴鍙f寚閽堣皟鐢≦ueryInterface()寰楀埌鐨処Fun鎺ュ彛鎸囬拡
銆銆聽
銆銆銆銆聽
銆銆聽 CComQIPtr < IFun > spFun ( pUnknown );聽// 璋冪敤鏋勯犲嚱鏁幫紝鐢盜Unknown鐨凲ueryInterface()寰楀埌

IFun鎺ュ彛鎸囬拡
銆銆聽
銆銆聽 CComQIPtr < IFun > spFun = pOtherInterface;聽// = 榪愮畻絎﹂噸杞斤紝鍚箟鍜屼笂闈竴鏍?br />銆銆聽 spFun = spOtherInterface;聽// 鍚屼笂
銆銆聽 spFun = pUnknown;聽// 鍚屼笂
銆銆聽
銆銆聽 pUnknown->QueryInterface( IID_IFun, &sp );聽// 涔熷彲浠ラ氳繃QueryInterface璧嬪?br />銆銆聽
銆銆聽 // 鏅鴻兘鎸囬拡璧嬪煎悗錛屽彲浠ョ敤鏉′歡璇彞鍒ゆ柇鏄惁鍚堟硶鏈夋晥
銆銆聽 if ( spFun ){}聽聽// 濡傛灉鎸囬拡鏈夋晥
銆銆聽 if ( NULL != spFun ){}聽// 濡傛灉鎸囬拡鏈夋晥
銆銆聽
銆銆聽 if ( !spFun ){}聽聽// 濡傛灉鎸囬拡鏃犳晥
銆銆聽 if ( NULL == spFun ){}聽// 濡傛灉鎸囬拡鏃犳晥
鏅鴻兘鎸囬拡璋冪敤鍑芥暟鐨勬柟娉曪細銆銆聽 spFun.CoCreateInstance(...);聽// 絳変環(huán)涓?API

鍑芥暟::CoCreateInstance(...)
銆銆聽 spFun.QueryInterface(...);聽// 絳変環(huán)涓?API 鍑芥暟::QueryInterface()
銆銆聽
銆銆聽 spFun->Add(...);聽// 璋冪敤鍐呴儴鎺ュ彛鎸囬拡鐨勬帴鍙e嚱鏁?/p>

銆銆聽 // 璋冪敤鍐呴儴鎺ュ彛鎸囬拡鐨凲ueryInterface()鍑芥暟錛屽叾瀹炴晥鏋滃拰 spFun.QueryInterface(...) 涓鏍?br />銆銆聽 spFun->QueryInterface(...);聽
銆銆聽
銆銆聽 spFun.Release();聽// 閲婃斁鍐呴儴鐨勬帴鍙f寚閽堬紝鍚屾椂鍐呴儴鎸囬拡璧嬪間負 NULL
銆銆聽 spFun->Release();聽// 閿欙紒錛侊紒涓瀹氫笉瑕佽繖涔堜嬌鐢ㄣ?br />銆銆聽 // 鍥犱負榪欎釜璋冪敤騫朵笉鎶婂唴閮ㄦ寚閽堟竻絀猴紝閭d箞鏋愭瀯鐨勬椂鍊欎細琚啀嬈¢噴鏀撅紙閲婃斁浜嗕袱嬈★級



jay 2007-03-12 11:39 鍙戣〃璇勮
]]>
COM 緇勪歡璁捐涓庡簲鐢紙涓冿級緙栬瘧銆佹敞鍐屻佽皟鐢?/title><link>http://m.shnenglu.com/yishanhante/articles/19617.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 12 Mar 2007 03:01:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19617.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19617.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19617.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19617.html</trackback:ping><description><![CDATA[ <p> <b>涓銆佸墠璦</b> <br /> <br />銆銆<a target="_blank">涓婁袱鍥炰腑</a>錛屽挶浠敤 ATL 鍐欎簡絎竴涓?COM 緇勪歡紼嬪簭錛岃繖鍥炰腑錛屼富瑕佷粙緇嶇紪璇戙佹敞鍐屽拰璋冪敤鏂規(guī)硶銆傜ず渚嬬▼搴忎綘宸茬粡涓嬭澆浜嗗悧錛熷鏋滆繕娌℃湁涓嬭澆錛寁c6.0 鐨勭敤鎴風偣<a >榪欓噷</a>錛寁c.net 鐨勭敤鎴風偣<a >榪欓噷</a>銆?b><br /></b><br /><br /><b>浜屻佸叧浜庣紪璇?br /><i><br />銆銆2-1 鏈灝忎緷璧?/i></b><br />銆銆鈥滄渶灝忎緷璧栤濓紝琛ㄧず緙栬瘧鍣ㄤ細鎶?ATL 涓繀欏諱嬌鐢ㄧ殑涓浜涘嚱鏁伴潤鎬佽繛鎺ュ埌鐩爣紼嬪簭涓傝繖鏍風洰鏍囨枃浠跺昂瀵鎬細紼嶅ぇ錛屼絾鐙珛鎬ф洿寮猴紝瀹夎鏂逛究錛涘弽涔嬬郴緇熸墽琛岀殑鏃跺欓渶瑕佹湁 ATL.DLL 鏂囦歡鐨勬敮鎸併傚浣曢夋嫨璁劇疆涓衡滄渶灝忎緷璧栤濆憿錛熺瓟妗堟槸錛氬垹闄ら瀹氫箟瀹忊淿ATL_DLL鈥濓紝鎿嶄綔鏂規(guī)硶瑙佸浘涓銆佸浘浜屻?br /><br /><img height="446" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut7pic1.jpg" width="677" border="0" /><br />鍥句竴銆佸湪vc6.0涓紝璁劇疆鏂規(guī)硶<br /><br /><img height="455" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut7pic2.jpg" width="645" border="0" /><br />鍥句簩銆佸湪 vc.net 2003涓紝璁劇疆鏂規(guī)硶<br /><br />銆銆<i><b>2-2 CRT搴?/b></i><br />銆銆濡傛灉鍦?ATL 緇勪歡紼嬪簭涓皟鐢ㄤ簡 CRT 鐨勮繍琛屾椂鍒誨簱鍑芥暟錛屾瘮濡傚紑騫蟲柟 sqrt() 錛岄偅涔堢紪璇戠殑鏃跺欏彲鑳戒細鎶ラ敊鈥渆rror LNK2001: unresolved external symbol _main鈥濄傛庝箞鍔烇紵鍒犻櫎棰勫畾涔夊畯鈥淿ATL_MIN_CRT鈥濓紒鎿嶄綔鏂規(guī)硶涔熻鍥句竴銆佸浘浜屻傦紙vc.net 2003 涓殑榪欎釜欏圭洰灞炴у彨鈥滃湪 ATL 涓渶灝忎嬌鐢?CRT鈥濓級<br /><br />銆銆<i><b>2-3 MBCS/UNICODE</b></i><br />銆銆榪欎釜涓嶅璇翠簡錛屽湪棰勫畾涔夊畯涓紝鍒嗗埆浣跨敤 _MBCS 鎴?_UNICODE銆?br /><br />銆銆<i><b>2-4 IDL 鐨勭紪璇?/b></i><br />銆銆COM 鍦ㄨ璁″垵鏈燂紝灝卞畾浜嗕竴涓洰鏍囷細瑕佽兘瀹炵幇璺ㄨ璦鐨勮皟鐢ㄣ傛棦鐒舵槸璺ㄨ璦鐨勶紝閭d箞緇勪歡鐨勬帴鍙f弿榪板氨蹇呴』鍦ㄤ換浣曡璦鐜涓兘瑕佽兘澶熻璇嗐傛庝箞鍔烇紵鐢?.h 鏂囦歡鎻忚堪錛?----- C璇█紼嬪簭鍛樼瑧浜嗭紝鐪熸柟渚匡紒BASIC 紼嬪簭鍛樺摥浜?-( 鍥犳錛屽井杞嬌鐢ㄤ簡涓涓柊鐨勬枃浠舵牸寮?--IDL鏂囦歡錛堟帴鍙e畾涔夋弿榪拌璦錛夈侷DL 鏄竴涓枃鏈枃浠訛紝瀹冪殑璇█璇硶姣旇緝綆鍗曪紝寰堣薄C銆傚叿浣?IDL 鏂囦歡鐨勮瑙o紝瑙佷笅涓鍥炪奀OM 緇勪歡璁捐涓庡簲鐢紙鍏級涔嬫坊鍔犳柊鎺ュ彛銆嬨侷DL 緇忚繃緙栬瘧錛岀敓鎴愪簩榪涘埗鐨勭瓑浠風被鍨嬪簱鏂囦歡 TLB 鎻愪緵緇欏叾瀹冭璦鏉ヤ嬌鐢ㄣ傚浘涓夌ず鎰忎簡 ATL COM 紼嬪簭緙栬瘧鐨勮繃紼嬶細<br /><br /><img height="330" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut7pic3.jpg" width="561" border="0" /><br />鍥句笁銆丄TL 緇勪歡紼嬪簭緙栬瘧榪囩▼<br /><br />銆銆璇存槑1錛氱紪璇戝悗錛岀被鍨嬪簱浠?TLB 鏂囦歡褰㈠紡鍗曠嫭瀛樺湪錛屽悓鏃朵篃淇濆瓨鍦ㄧ洰鏍囨枃浠剁殑璧勬簮涓傚洜姝わ紝鎴戜滑灝嗘潵鍦?#import 寮曞叆綾誨瀷搴撶殑鏃跺欙紝鏃㈠彲浠ユ寚瀹?TLB 鏂囦歡錛屼篃鍙互鎸囧畾鐩爣鏂囦歡錛?br />銆銆璇存槑2錛氭垜浠綔涓?C/C++ 鐨勭▼搴忓憳錛岃繕綆楁槸姣旇緝騫哥鐨勩傚洜涓?IDL 緙栬瘧鍚庯紝鐗規(guī)剰涓烘垜浠彁渚涗簡 C 璇█褰㈠紡鐨勬帴鍙f枃浠躲?br />銆銆璇存槑3錛欼DL 緙栬瘧鍚庣敓鎴愪唬鐞?瀛樻牴婧愮▼搴忥紝鏈夛細dlldata.c銆亁xx_p.c銆亁xxps.def銆亁xxps.mak錛屾垜浠彲浠ョ敤 NMAKE.EXE 鍐嶆緙栬瘧鏉ヤ駭鐢熺湡姝g殑浠g悊/瀛樻牴DLL鐩爣鏂囦歡(娉?)銆?br /><br /><br /><b>涓夈佸叧浜庢敞鍐?br /><br /></b>銆銆<b><i>鎯呭喌1錛?/i></b>褰撴垜浠嬌鐢?ATL 緙栧啓緇勪歡紼嬪簭錛屾敞鍐屼笉鐢ㄦ垜浠潵璐熻矗銆傜紪璇戞垚鍔熷悗錛孖DE 浼氬府鎴戜滑鑷姩娉ㄥ唽錛?br />銆銆<i><b>鎯呭喌2錛?/b></i>褰撴垜浠嬌鐢?MFC 緙栧啓緇勪歡紼嬪簭錛岀敱浜庣紪璇戝櫒涓嶇煡閬撲綘鍐欑殑鏄惁鏄?COM 緇勪歡錛屾墍浠ュ畠涓嶄細甯垜浠嚜鍔ㄦ敞鍐屻傝繖涓椂鍊欙紝鎴戜滑鍙互鎵ц鑿滃崟鈥淭ools\Register Control鈥濇潵娉ㄥ唽銆?br />銆銆<i><b>鎯呭喌3錛?/b></i>褰撴垜浠啓涓涓叿鏈?COM 鍔熻兘鐨?EXE 紼嬪簭鏃訛紝娉ㄥ唽鐨勬柟娉曞氨鏄繍琛屼竴嬈¤繖涓▼搴忥紱<br />銆銆<i><b>鎯呭喌4錛?/b></i>褰撴垜浠渶瑕佷嬌鐢ㄧ涓夋柟鎻愪緵鐨勭粍浠剁▼搴忔椂錛屽彲浠ュ懡浠よ榪愯鈥渞egsvr32.exe 鏂囦歡鍚嶁濇潵娉ㄥ唽銆傞『渚胯涓鍙ワ紝鍙嶆敞鍐岀殑鏂規(guī)硶鏄渞egsvr32.exe /u 鏂囦歡鍚嶁濓紱<br />銆銆<i><b>鎯呭喌5錛?/b></i>褰撴垜浠渶瑕佸湪紼嬪簭涓紙姣斿瀹夎紼嬪簭錛夐渶瑕佹墽琛屾敞鍐岋紝閭d箞錛?/p> <pre>typedef HRESULT (WINAPI * FREG)(); TCHAR szWorkPath[ MAX_PATH ]; ::GetCurrentDirectory( sizeof(szWorkPath), szWorkPath ); // 淇濆瓨褰撳墠榪涚▼鐨勫伐浣滅洰褰? ::SetCurrentDirectory( 緇勪歡鐩綍 ); // 鍒囨崲鍒扮粍浠剁殑鐩綍 HMODULE hDLL = ::LoadLibrary( 緇勪歡鏂囦歡鍚?); // 鍔ㄦ佽杞界粍浠? if(hDLL) { FREG lpfunc = (FREG)::GetProcAddress( hDLL, _T("DllRegisterServer") ); // 鍙栧緱娉ㄥ唽鍑芥暟鎸囬拡 // 濡傛灉鏄弽娉ㄥ唽錛屽彲浠ュ彇寰?DllUnregisterServer"鍑芥暟鎸囬拡 if ( lpfunc ) lpfunc(); // 鎵ц娉ㄥ唽銆傝繖閲屼負浜嗙畝鍗曪紝娌℃湁鍒ゆ柇榪斿洖鍊? ::FreeLibrary(hDLL); } ::SetCurrentDirectory(szWorkPath); // 鍒囨崲鍥炲師鍏堢殑榪涚▼宸ヤ綔鐩綍 </pre>銆銆涓婇潰鐨勭ず渚嬶紝鍦ㄥ鏁版儏鍐典笅鍙互綆鍖栨帀鍒囨崲宸ヤ綔鐩綍鐨勪唬鐮侀儴鍒嗐備絾鏄紝濡傛灉榪欎釜緇勪歡鍦ㄨ杞界殑鏃跺欙紝瀹冮渶瑕佸悓鏃跺姞杞戒竴浜涘繀欏諱緷璧栫殑DLL鏃訛紝鏈夊彲鑳界敱浜庡畠鑷韓紼嬪簭鐨?BUG 瀵艱嚧鏃犳硶姝g‘瀹氫綅銆傚挸......榪樻槸璁╂垜浠嚜宸卞啓鐨勭▼搴忥紝鏉ュ譏琛ュ畠鐨勯敊璇惂......璋佽鍜變滑鏄ソ浜哄憿 錛岃皝璁╁挶浠殑姘村鉤姣斾粬楂樺憿錛岃皝璁╁挶浠湪 <a target="_blank">vckbase</a> 涓婃槸涓滄鐪尖濆憿......<br /><br /><br /><b>鍥涖?/b><b>鍏充簬緇勪歡璋冪敤<br /><br /></b>銆銆鎬葷殑鏉ヨ錛岃皟鐢ㄧ粍浠剁▼搴忓ぇ姒傛湁濡備笅鏂規(guī)硶錛?br />銆 <table cellspacing="1" width="100%" border="1"><tbody><tr><td width="22%">#include 鏂規(guī)硶</td><td width="78%">IDL緙栬瘧鍚庯紝涓烘柟渚緾/C++紼嬪簭鍛樼殑浣跨敤錛屼細浜х敓xxx.h鍜寈xx_i.c鏂囦歡銆傛垜浠湡騫哥錛岀洿鎺?include鍚庡氨鍙互浣跨敤浜?/td></tr><tr><td width="22%">#import 鏂規(guī)硶</td><td width="78%">姣旇緝閫氱敤鐨勬柟娉曪紝vc 浼氬府鎴戜滑浜х敓鍖呰綾伙紝璁╂垜浠殑璋冪敤鏇存柟渚?/td></tr><tr><td width="22%">鍔犺澆綾誨瀷搴撳寘瑁呯被 鏂規(guī)硶</td><td width="78%">濡傛灉緇勪歡鎻愪緵浜?IDispatch 鎺ュ彛錛岀敤榪欎釜鏂規(guī)硶璋冪敤緇勪歡鏄渶綆鍗曠殑鍟︺備笉榪囪繕娌¤IDispatch錛屽彧鑳界湅浠ュ悗鐨勬枃绔犲暒</td></tr><tr><td width="22%">鍔犺澆ActiveX鍖呰綾?鏂規(guī)硶</td><td width="78%">ActiveX 榪樻病浠嬬粛鍛紝浠ュ悗鍐嶈鍟?/td></tr></tbody></table><p>銆銆涓嬭澆紺轟緥紼嬪簭鍚庯紝璇烽愰」嫻忚浣跨敤鏂規(guī)硶錛?/p><table cellspacing="1" width="100%" border="1"><tbody><tr><td align="middle" width="5%"><b>紺轟緥</b></td><td width="11%"><p align="center"><b>鏂規(guī)硶</b></p></td><td width="177%"><p align="center"><b>綆瑕佽鏄?/b></p></td></tr><tr><td align="middle" width="5%">1</td><td width="11%">#include</td><td width="177%">瀹屽叏鐢ㄦ渶鍩烘湰鐨?API 鏂瑰紡璋冪敤緇勪歡錛屼嬌澶у鐔熸?zhèn)夎皟鐢ㄥ師鐞?/td></tr><tr><td align="middle" width="5%">2</td><td width="11%">#include</td><td width="177%">澶ч儴鍒嗕嬌鐢?API 鏂瑰紡錛屼嬌鐢?CComBSTR 綆鍖栧瀛楃涓茬殑浣跨敤</td></tr><tr><td align="middle" width="5%">3</td><td width="11%">#include</td><td width="177%">灞曠ず鏅鴻兘鎸囬拡 CComPtr<> 鐨勪嬌鐢ㄦ柟娉?/td></tr><tr><td align="middle" width="5%">4</td><td width="11%">#include</td><td width="177%">灞曠ず鏅鴻兘鎸囬拡 CComPtr<> 鍜?CComQIPtr<> 娣峰悎鐨勪嬌鐢ㄦ柟娉?/td></tr><tr><td align="middle" width="5%">5</td><td width="11%">#include</td><td width="177%">灞曠ず鏅鴻兘鎸囬拡 CComQIPtr<> 鐨勪嬌鐢ㄦ柟娉?/td></tr><tr><td align="middle" width="5%">6</td><td width="11%">#include</td><td width="177%">灞曠ず鏅鴻兘鎸囬拡鐨勯噴鏀炬柟娉?/td></tr><tr><td align="middle" width="5%">7</td><td width="11%">#import</td><td width="177%">vc 鍖呰鐨勬櫤鑳芥寚閽?IxxxPtr銆乢bstr_t銆乢variant_t 鐨勪嬌鐢ㄦ柟娉曞拰寮傚父澶勭悊</td></tr><tr><td align="middle" width="5%">8</td><td width="11%">#import</td><td width="177%">import 鍚庣殑鍛藉悕絀洪棿鐨勪嬌鐢ㄦ柟娉?/td></tr></tbody></table><p>銆銆紺轟緥紼嬪簭涓兘鍐欐湁娉ㄩ噴錛岃璇昏呬粩緇嗛槄璇誨茍鍚屾椂鍙傝?MSDN 鐨勫嚱鏁拌鏄庛傝繖閲岋紝鎴戠粰澶у浠嬬粛涓涓嬧滄櫤鑳芥寚閽堚濓細<br />銆銆瀵逛簬鎿嶄綔鍘熷鐨勬帴鍙f寚閽堟槸姣旇緝楹葷儲鐨勶紝闇瑕佹垜浠嚜宸辨帶鍒跺紩鐢ㄨ鏁般丄PI 璋冪敤銆佸紓甯稿鐞嗐備簬鏄?ATL 鎻愪緵浜?涓櫤鑳芥寚閽堢殑妯℃澘鍖呰綾伙紝CComPtr<> 鍜?CComQIPtr<>錛岃繖涓や釜綾婚兘鍦?<atlbase.h> 涓0鏄庛侰ComQIPtr<> 鍖呭惈浜?CComPtr<>鐨勬墍鏈夊姛鑳斤紝鍥犳鎴戜滑鍙互瀹屽叏鐢?CComQIPtr<> 鏉ヤ嬌鐢ㄦ櫤鑳芥帴鍙f寚閽堬紝鍞竴瑕佽鏄庣殑涓鐐瑰氨鏄細CComQIPtr<> 鐢變簬浣跨敤浜嗚繍綆楃鐨勯噸杞藉姛鑳斤紝瀹冧細鑷姩甯垜浠皟鐢≦ueryInterface()鍑芥暟錛屽洜姝?CComQIPtr<> 鍞竴鐨勭己鐐瑰氨鏄笉鑳藉畾涔?IUnknown * 鎸囬拡銆?/p><pre>銆銆 // 鏅鴻兘鎸囬拡 smart pointer錛屾寜鐓у寛鐗欏埄鍛藉悕娉曪紝涓鑸互 sp 寮澶存潵琛ㄧず鍙橀噺綾誨瀷 銆銆 CComPtr < IUnknown > spUnk; // 姝g‘ 銆銆 // 鍋囪 IFun 鏄竴涓帴鍙g被鍨? 銆銆 CComPtr < IFun > spFun; // 姝g‘ 銆銆 CComQIPtr < IFun > spFun; // 姝g‘ 銆銆 CComQIPtr < IFun, &IID_IFun > spFun; // 姝g‘ 銆銆 CComQIPtr < IUnknown > spUnk; // 閿欒錛丆ComQIPtr涓嶈兘瀹氫箟IUnknown鎸囬拡</pre>緇欐櫤鑳芥寚閽堣祴鍊肩殑鏂規(guī)硶錛?pre>銆銆 CComQIPtr < IFun > spFun; // 璋冪敤鏋勯犲嚱鏁幫紝榪樻病鏈夎祴鍊鹼紝琚寘瑁呯殑鍐呴儴鎺ュ彛鎸囬拡涓?NULL 銆銆 銆銆 CComQIPtr < IFun > spFun( pOtherInterface ); // 璋冪敤鏋勯犲嚱鏁幫紝鍐呴儴鎺ュ彛鎸囬拡璧嬪間負 銆銆 // 閫氳繃 pOtherInterface 榪欎釜鏅氭帴鍙f寚閽堣皟鐢≦ueryInterface()寰楀埌鐨処Fun鎺ュ彛鎸囬拡 銆銆 銆銆 CComQIPtr < IFun > spFun( spOtherInterface ); // 璋冪敤鏋勯犲嚱鏁幫紝鍐呴儴鎺ュ彛鎸囬拡璧嬪間負 銆銆 // 閫氳繃 spOtherInterface 榪欎釜鍙兘鎺ュ彛鎸囬拡璋冪敤QueryInterface()寰楀埌鐨処Fun鎺ュ彛鎸囬拡 銆銆 銆銆 CComQIPtr < IFun > spFun ( pUnknown ); // 璋冪敤鏋勯犲嚱鏁幫紝鐢盜Unknown鐨凲ueryInterface()寰楀埌IFun鎺ュ彛鎸囬拡 銆銆 銆銆 CComQIPtr < IFun > spFun = pOtherInterface; // = 榪愮畻絎﹂噸杞斤紝鍚箟鍜屼笂闈竴鏍? 銆銆 spFun = spOtherInterface; // 鍚屼笂 銆銆 spFun = pUnknown; // 鍚屼笂 銆銆 銆銆 pUnknown->QueryInterface( IID_IFun, &sp ); // 涔熷彲浠ラ氳繃QueryInterface璧嬪? 銆銆 銆銆 // 鏅鴻兘鎸囬拡璧嬪煎悗錛屽彲浠ョ敤鏉′歡璇彞鍒ゆ柇鏄惁鍚堟硶鏈夋晥 銆銆 if ( spFun ){} // 濡傛灉鎸囬拡鏈夋晥 銆銆 if ( NULL != spFun ){} // 濡傛灉鎸囬拡鏈夋晥 銆銆 銆銆 if ( !spFun ){} // 濡傛灉鎸囬拡鏃犳晥 銆銆 if ( NULL == spFun ){} // 濡傛灉鎸囬拡鏃犳晥</pre>鏅鴻兘鎸囬拡璋冪敤鍑芥暟鐨勬柟娉曪細<pre>銆銆 spFun.CoCreateInstance(...); // 絳変環(huán)涓?API 鍑芥暟::CoCreateInstance(...) 銆銆 spFun.QueryInterface(...); // 絳変環(huán)涓?API 鍑芥暟::QueryInterface() 銆銆 銆銆 spFun->Add(...); // 璋冪敤鍐呴儴鎺ュ彛鎸囬拡鐨勬帴鍙e嚱鏁? 銆銆 // 璋冪敤鍐呴儴鎺ュ彛鎸囬拡鐨凲ueryInterface()鍑芥暟錛屽叾瀹炴晥鏋滃拰 spFun.QueryInterface(...) 涓鏍? 銆銆 spFun->QueryInterface(...); 銆銆 銆銆 spFun.Release(); // 閲婃斁鍐呴儴鐨勬帴鍙f寚閽堬紝鍚屾椂鍐呴儴鎸囬拡璧嬪間負 NULL 銆銆 spFun->Release(); // 閿欙紒錛侊紒涓瀹氫笉瑕佽繖涔堜嬌鐢ㄣ? 銆銆 // 鍥犱負榪欎釜璋冪敤騫朵笉鎶婂唴閮ㄦ寚閽堟竻絀猴紝閭d箞鏋愭瀯鐨勬椂鍊欎細琚啀嬈¢噴鏀撅紙閲婃斁浜嗕袱嬈★級</pre>鍜?.....涓嶈浜嗭紝涓嶈浜嗭紝澶у澶氱湅涔︼紝澶氱湅MSND錛屽鐪嬬ず渚嬬▼搴忓惂銆?鍐欑瘡浜?-(<br /><br /><b>浜斻佸皬緇?/b><br /><br />銆銆鏁鍏蟲敞銆奀OM 緇勪歡璁捐涓庡簲鐢?鍏?銆?-----濡備綍澧炲姞 ATL 緇勪歡涓殑絎簩涓帴鍙? <p></p><hr /> 娉?錛氱紪璇戜唬鐞?瀛樻牴錛寁c6.0 涓◢寰夯鐑︼紝鎴戜滑鍦ㄥ悗闈粙緇嶁滆繘紼嬪緇勪歡鈥濆拰鈥滆繙紼嬬粍浠垛濈殑鏃跺欏啀浠嬬粛銆傚湪 vc.net 2003 涓嬪垯姣旇緝綆鍗曪紝鍥犱負浠g悊/瀛樻牴浣滀負鍗曠嫭鐨勪竴涓伐紼嬮」鐩細鑷姩鍔犲埌鎴戜滑鐨勮В鍐蟲柟妗堜腑浜嗐?img src ="http://m.shnenglu.com/yishanhante/aggbug/19617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-12 11:01 <a href="http://m.shnenglu.com/yishanhante/articles/19617.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>COM 緇勪歡璁捐涓庡簲鐢紙鍏級鐢?ATL 鍐欑涓涓粍浠?/title><link>http://m.shnenglu.com/yishanhante/articles/19606.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 12 Mar 2007 02:40:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19606.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19606.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19606.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19606.html</trackback:ping><description><![CDATA[ <strong>涓銆佸墠璦<br /><br /></strong>銆銆1銆佷笌 <a target="_blank"><font color="#002c99">銆奀OM 緇勪歡璁捐涓庡簲鐢?浜?銆?/font></a>鐨勫唴瀹瑰熀鏈竴鑷淬備絾鏈洖璁茶В鐨勬槸鍦?vc.net 2003 涓嬬殑浣跨敤鏂規(guī)硶錛屽嵆浣夸綘涓嶅啀浣跨敤vc6.0錛屼篃璇峰拰涓婁竴鍥炵殑鍐呭錛屽弬鐓ф瘮瀵廣?br />銆銆2銆佽繖絎竴涓粍浠訛紝闄や簡鎵鏈?COM 緇勪歡蹇呴』鐨?IUnknown 鎺ュ彛澶栵紝鎴戜滑鍐嶅疄鐜頒竴涓嚜宸卞畾涔夌殑鎺ュ彛 IFun錛屽畠鏈変袱涓嚱鏁幫細 Add()瀹屾垚涓や釜鏁板肩殑鍔犳硶錛孋at()瀹屾垚涓や釜瀛楃涓茬殑榪炴帴銆?br />銆銆3銆佷笅闈?.....濂藉ソ鍚! 寮濮嬩簡:-)<br />銆 <p><b>浜屻?/b><b>寤虹珛 ATL 宸ョ▼</b><br /><br />銆銆姝ラ2.1錛氬緩绔嬩竴涓В鍐蟲柟妗堛?br />銆銆姝ラ2.2錛氬湪 璇ヨВ鍐蟲柟妗堜腑錛屾柊寤轟竴涓?vc++ 鐨?ATL 欏圭洰銆傜ず渚嬬▼搴忓彨 Simple2錛屽茍閫夋嫨DLL鏂瑰紡錛岃鍥句竴銆佸浘浜屻?br /><br /><img height="361" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic01.jpg" width="531" border="0" /><br />鍥句竴銆佹柊寤?ATL 欏圭洰<br /><br /><img height="449" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic02.jpg" width="615" border="0" /><br />鍥句簩銆侀夋嫨闈炲睘鎬у寲鐨凞LL緇勪歡綾誨瀷<br /><br />銆銆<i><b>灞炴у寲</b></i> 灞炴у寲緙栫▼錛屾槸鏈潵鐨勬柟鍚戯紝浣嗘垜浠幇鍦ㄥ厛涓嶈閫夊畠銆?br />銆銆<i><b>鍔ㄦ侀摼鎺ュ簱(DLL)</b></i> 閫夋嫨瀹冦?br />銆銆<i><b>鍙墽琛屾枃浠?EXE)</b></i> 浠ュ悗鍐嶈銆?br />銆銆<i><b>鏈嶅姟(EXE)</b></i> 琛ㄧず寤虹珛涓涓郴緇熸湇鍔$粍浠剁▼搴忥紝緋葷粺鍚姩鍚庡氨浼氬姞杞藉茍鎵ц鐨勭▼搴忋?br />銆銆<b><i>鍏佽鍚堝茍浠g悊/瀛樻牴(stub)浠g爜</i></b> 閫夋嫨璇ラ」琛ㄧず鎶娾滀唬鐞?瀛樻牴鈥濅唬鐮佸悎騫跺埌緇勪歡紼嬪簭涓紝鍚﹀垯闇瑕佸崟鐙紪璇戯紝鍗曠嫭娉ㄥ唽浠g悊瀛樻牴紼嬪簭銆備唬鐞?瀛樻牴錛岃繖涓槸浠涔堟蹇碉紵榪樿寰楁垜浠湪<a ><font color="#002c99">涓婂洖涔?/font></a>涓粙緇嶇殑鍚楋紵褰撹皟鐢ㄨ呰皟鐢ㄨ繘紼嬪鎴栬繙紼嬬粍浠跺姛鑳界殑鏃跺欙紝鍏跺疄鏄唬鐞?瀛樻牴璐熻矗鏁版嵁浜ゆ崲鐨勩傚叧浜庝唬鐞?瀛樻牴鐨勫叿浣撳彉鎴愬拰鎿嶄綔錛屼互鍚庡啀璇村暒......<br />銆銆<b><i>鏀寔</i></b><i><b> MFC</b></i> 闄ら潪鏈夌壒孌婄殑鍘熷洜錛屾垜浠啓 ATL 紼嬪簭錛屾渶濂戒笉瑕侀夋嫨璇ラ」銆備綘鍙兘浼氳錛屽鏋滄病鏈塎FC鐨勬敮鎸侊紝閭String鎬庝箞鍔炲憖錛熷憡璇変綘涓瀵嗗惂錛屼竴鑸漢鎴戦兘涓嶅憡璇変粬錛屾垜鍚庡崐杈堝瓙灝遍潬鐫榪欎釜縐樺瘑媧葷潃浜嗭細<br />銆銆1銆佷綘浼歋TL鍚楋紵鍙互鐢?STL 涓殑 string 浠f浛錛?br />銆銆2銆佽嚜宸卞啓涓?MyString 綾伙紝鍢垮樋錛?br />銆銆3銆佹?zhèn)勬?zhèn)勫湴銆佺瀵嗗湴銆佷笉瑕佸憡璇夊埆浜猴紙鐗瑰埆鏄埆鍛婅瘔寰蔣錛夛紝鎶?MFC 涓殑 CString 婧愮爜鎷胯繃鏉ョ敤錛?br />銆銆4銆佷嬌鐢?CComBSTR 綾伙紝鑷沖皯涔熻兘綆鍖栨垜浠瓧絎︿覆鎿嶄綔錛?br />銆銆5銆佺洿鎺ョ敤 API 鎿嶄綔瀛楃涓詫紝鍙嶆鎴戜滑澶у瀛︿範 C 璇█鐨勬椂鍊欙紝閮芥槸浠庤繖閲屽共璧風殑銆傦紙絳変簬娌¤錛屽懙鍛碉級<br />銆銆<b><i>鏀寔 COM+ 1.0</i></b> 鏀寔浜嬪姟澶勭悊鐨?COM+ 鍔熻兘銆侰OM+ 涔熻鍦ㄧ 99 鍥炰粙緇嶅惂銆?br /><br /><br /><b>涓夈佹坊鍔?ATL 瀵硅薄綾?/b><br /><br />銆銆姝ラ3.1錛氳彍鍗?欏圭洰\娣誨姞綾?.."錛堟垨鑰呯敤榧犳爣鍙抽敭鍦?欏圭洰涓脊鍑鴻彍鍗?娣誨姞\娣誨姞綾?.."錛夊茍閫夋嫨 ATL 綆鍗曞璞°傝鍥句笁銆?br /><br /><img height="418" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic03.jpg" width="531" border="0" /><br />鍥句笁銆侀夋嫨寤虹珛ATL綆鍗曞璞?br /><br />銆銆闄や簡綆鍗曞璞?鍙疄鐜頒簡 IUnknown 鎺ュ彛)錛岃繕鍙互閫夋嫨鈥淎TL鎺т歡鈥?ActiveX錛屽疄鐜頒簡10澶氫釜鎺ュ彛)......鍙互閫夋嫨鐨勭粍浠跺璞$被鍨嬪緢澶氾紝浣嗘湰璐ㄤ笂錛屽氨鏄鍚戝甯垜浠粯璁ゅ姞涓婁竴浜涙帴鍙c傚湪浠ュ悗鐨勬枃绔犱腑錛岄檰緇粙緇嶅惂銆?br /><br />銆銆姝ラ3.2錛氬鍔犺嚜瀹氫箟綾?CFun(鎺ュ彛 IFun) ,瑙佸浘鍥涖?br /><br />聽<img height="449" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic04.jpg" width="615" border="0" /><br />鍥懼洓銆佸~鍐欏悕縐?br /><br />銆銆鍏跺疄錛屾垜浠彧闇瑕佽緭鍏ョ畝縐幫紝鍏跺畠鐨勯」鐩細鑷姩濉啓銆傛病浠涔堝璇寸殑錛屽彧璇峰ぇ瀹舵敞鎰忎竴涓?ProgID 欏癸紝榛樿鐨?ProgID 鏋勯犳柟寮忎負鈥滈」鐩悕.綆縐板悕鈥濄?br /><br />銆銆姝ラ3.3錛氬~鍐欐帴鍙e睘鎬ч夐」錛岃鍥?浜斻?br /><br /><img height="449" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic05.jpg" width="615" border="0" /><br />鍥句簲銆佹帴鍙i夐」<br /><br />銆銆<b><i>綰跨▼妯″瀷</i></b> COM 涓殑綰跨▼錛屾垜璁や負鏄渶璁ㄥ帉錛屾渶澶嶆潅鐨勯儴鍒嗐侰OM 綰跨▼鍜屽叕瀵撶殑姒傚康錛岀暀寰呭悗緇粙緇嶃傜幇鍦ㄥ悧......澶у閮介?鍗曞厓"(Apartment)錛屽畠浠h〃浠涔堥偅錛熺畝鍗曞湴璇達細褰撳湪綰跨▼涓皟鐢ㄧ粍浠跺嚱鏁扮殑鏃跺欙紝榪欎簺璋冪敤浼氭帓闃熻繘琛屻傚洜姝わ紝榪欑妯″紡涓嬶紝鎴戜滑鍙互鏆傛椂涓嶇敤鑰冭檻鍚屾鐨勯棶棰樸?娉?)<br />銆銆<b><i>鎺ュ彛</i></b>銆傚弻閲?Dual)錛岃繖涓潪甯?闈炲父閲嶈錛岄潪甯擱潪甯稿父鐢紝浣嗘垜浠粖澶╀笉璁?娉?)銆?b>鍒囪錛佸垏璁幫紒鎴戜滑鐨勮繖絎竴涓?COM 紼嬪簭涓紝涓瀹氳閫夋嫨鈥滆嚜瀹氫箟鈥濓紒錛侊紒錛?/b>錛堝鏋滀綘閫夐敊浜嗭紝璇峰垹闄ゅ叏閮ㄥ唴瀹癸紝閲嶆柊鏉ヨ繃銆傦級<br />銆銆<i><b>鑱氬悎</b></i> 鎴戜滑鍐欑殑緇勪歡錛屽皢鏉ユ槸鍚﹀厑璁歌鍒漢鑱氬悎(娉?)浣跨敤銆傗滃彧鑳藉垱寤轟負鑱氬悎鈥濓紝鏈夌偣綾諱技 C++ 涓殑綰櫄綾伙紝浣犺鏄誨伐紼嬪笀錛屽彧璐熻矗璁捐浣嗕笉浜茶嚜鍐欎唬鐮佺殑璇濓紝鎵嶉夋嫨瀹冦?br />銆銆<i><b>ISupportErrorInfo</b></i> 鏄惁鏀寔涓板瘜淇℃伅鐨勯敊璇鐞嗘帴鍙c備互鍚庡氨璁層?br />銆銆<b><i>榪炴帴</i></b><i><b>鐐?/b></i> 鏄惁鏀寔榪炴帴鐐規(guī)帴鍙o紙浜嬩歡銆佸洖璋冿級銆備互鍚庡氨璁層?br />銆銆<i><b>IObjectWithSite</b></i> 鏄惁鏀寔IE鐨勮皟鐢?br /><br /><br /><b>鍥涖佹坊鍔犳帴鍙e嚱鏁?br /></b><br /><img height="471" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic06.jpg" width="422" border="0" /><br />鍥懼叚銆佽皟鍑哄鍔犳帴鍙f柟娉曠殑鑿滃崟<br /><br /><img height="449" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic07.jpg" width="615" border="0" /><br />鍥句竷銆佸鍔犳帴鍙e嚱鏁?Add<br /><br />銆銆璇鋒寜鐓у浘紺虹殑鏂規(guī)硶錛屽鍔燗dd()鍑芥暟錛屽鍔燙at()鍑芥暟 銆俒in]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍏ワ紱[out]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍑猴紱[out,retval]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍑猴紝鍚屾椂鍙互浣滀負鍑芥暟榪愮畻緇撴灉鐨勮繑鍥炲箋備竴涓嚱鏁頒腑錛屽彲浠ユ湁澶氫釜[in]銆乕out]錛屼絾[retval]鍙兘鏈変竴涓紝騫朵笖瑕佸拰[out]緇勫悎鍚庡湪鏈鍚庝竴涓綅緗?娉?)<br /><br /><img height="599" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut6pic08.jpg" width="490" border="0" /><br />鍥懼叓銆佹帴鍙e嚱鏁板畾涔夊畬鎴愬悗鐨勫浘紺?br /><br />銆銆鎴戜滑閮界煡閬擄紝瑕佹兂鏀瑰彉 C++ 涓殑綾誨嚱鏁幫紝闇瑕佷慨鏀逛袱涓湴鏂癸細涓鏄ご鏂囦歡(.h)涓被鐨勫嚱鏁板0鏄庯紝浜屾槸鍑芥暟浣?.cpp)鏂囦歡鐨勫疄鐜板銆傝屾垜浠幇鍦ㄧ敤 ATL 鍐欑粍浠剁▼搴忥紝鍒欒繕瑕佷慨鏀逛竴涓湴鏂癸紝灝辨槸鎺ュ彛瀹氫箟(IDL)鏂囦歡銆傚埆鐫鎬?IDL 涓嬫灝辮璁ㄨ鍟︺?br /><br /><br /><b>浜斻佸疄鐜版帴鍙e嚱鏁?/b><br /><br />銆銆榧犳爣鍙岀偣鍥懼叓涓瑿Fun\鍩洪」鍜屾帴鍙Add(...)灝卞彲浠ュ紑濮嬭緭鍏ュ嚱鏁板疄鐜頒簡錛?/p><pre>STDMETHODIMP CFun::Add(long n1, long n2, long *pVal) { *pVal = n1 + n2; return S_OK; }</pre>榪欎釜澶畝鍗曚簡錛屼笉鍐嶆氮璐光滃彛鏉♀濄備笅闈㈡垜浠疄鐜板瓧絎︿覆榪炴帴鐨凜at()鍑芥暟錛?pre>STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { int nLen1 = ::SysStringLen( s1 ); // s1 鐨勫瓧絎﹂暱搴? int nLen2 = ::SysStringLen( s2 ); // s2 鐨勫瓧絎﹂暱搴? *pVal = ::SysAllocStringLen( s1, nLen1 + nLen2 );// 鏋勯犳柊鐨?BSTR 鍚屾椂鎶?s1 鍏堜繚瀛樿繘鍘? if( nLen2 ) { ::memcpy( *pVal + nLen1, s2, nLen2 * sizeof(WCHAR) ); // 鐒跺悗鎶?s2 鍐嶈繛鎺ヨ繘鍘? // wcscat( *pVal, s2 ); } return S_OK; }</pre>瀛︾敓錛氫笂闈㈢殑鍑芥暟瀹炵幇錛屽畬鍏ㄦ槸璋冪敤鍩烘湰鐨?API 鏂瑰紡瀹屾垚鐨勩?br />鑰佸笀錛氭槸鐨勶紝璇村疄璇濓紝鐨勭‘姣旇緝鐑︾悙銆?br />瀛︾敓錛氭垜浠槸鐢╩emcpy()瀹屾垚榪炴帴絎簩涓瓧絎︿覆鍔熻兘鐨勶紝閭d箞涓轟粈涔堜笉鐢ㄥ嚱鏁?wcscat()閭o紵<br />鑰佸笀錛氬鏁版儏鍐典笅鍙互錛屼絾浣犻渶瑕佺煡閬擄細鐢變簬BSTR鍖呭惈鏈夊瓧絎︿覆闀垮害錛屽洜姝ゅ疄闄呯殑BSTR瀛楃涓插唴瀹逛腑鏄彲浠ュ瓨鍌↙''\0''鐨勶紝鑰屽嚱鏁?wcscat() 鏄互L''\0''浣滀負澶嶅埗緇撴潫鏍囧織錛屽洜姝ゅ彲鑳戒細涓㈠け鏁版嵁銆傛槑鐧戒簡鍚楋紵<br />瀛︾敓錛氭槑鐧斤紝鏄庣櫧銆傛垜鐪嬭繃<a target="_blank"><font color="#002c99">銆奀OM 緇勪歡璁捐涓庡簲鐢?涓?涔嬫暟鎹被鍨嬨?/font></a>鍚庡氨鏄庣櫧浜嗐傞偅涔堣佸笀錛屾湁娌℃湁綆鍗曚竴浜涚殑鏂規(guī)硶閭o紵<br />鑰佸笀錛氭湁鍛錛屼綘鐪?.....<pre>STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { CComBSTR sResult( s1 ); sResult.AppendBSTR( s2 ); *pVal = sResult.Copy(); // *pVal = sResult.Detach(); return S_OK; }</pre>瀛︾敓錛氬搱鍝堬紝濂斤紒浣跨敤浜?CComBSTR錛岃繖涓氨綆鍗曞浜嗐侰ComBSTR::Copy()鍜孋ComBSTR::Detach()鏈変粈涔堝尯鍒紵<br />鑰佸笀錛欳ComBSTR::Copy() 浼氬埗閫犱竴涓?BSTR 鐨勫壇鏈紝鍙﹀CComBSTR::CopyTo()涔熸湁綾諱技鍔熻兘銆傝孋ComBSTR::Detach()鏄嬌瀵硅薄涓庡唴閮ㄧ殑 BSTR 鎸囬拡鍓ョ錛岃繖涓嚱鏁扮敱浜庢病鏈夊鍒惰繃紼嬶紝鍥犳閫熷害紼嶅井蹇竴鐐圭偣銆備絾瑕佹敞鎰忥紝涓浣嗗墺紱誨悗錛屽氨涓嶈兘鍐嶄嬌鐢ㄨ瀵硅薄鍟︺?br />瀛︾敓錛氳佸笀錛屾?zhèn)ㄨ鐨勫お鐗涘暒锛屾垜瀵规?zhèn)ㄧ殑鏁話濡傚穽宸嶆嘲灞憋紝鐩村叆浜戦渼......<br />鑰佸笀錛歋TOP錛孲TOP錛佺暀浣滀笟鍟?.....<br />銆銆1銆佽嚜宸卞厛鎸夌収浠婂ぉ璁茬殑鍐呭鍐欏嚭榪欎釜緇勪歡錛?br />銆銆2銆佷笉綆′綘鎳備笉鎳傦紝涓瀹氳鍘昏瀵?IDL 鏂囦歡錛孋PP 鏂囦歡錛?br />銆銆3銆佺紪璇戝悗錛岀湅閮戒駭鐢熶簡浜涗粈涔堟枃浠訛紵濡傛灉鏄枃鏈殑鏂囦歡錛屽氨鎵撳紑鐪嬬湅錛?br />銆銆4銆佷笅杞芥湰鏂囩殑紺轟緥紼嬪簭(vc.net 2003鐗堟湰)緙栬瘧榪愯錛岀湅鐪嬫晥鏋溿傜劧鍚庨涔犱竴涓嬬ず渚嬬▼搴忎腑鐨勮皟鐢ㄦ柟娉曪紱<br />瀛︾敓錛氱煡閬撳暒錛屽揩涓嬭鍚э紝鎴戣涓婂帟鎵錛屾垜閮芥唻鐨勪笉琛屼簡......<br />鑰佸笀錛氫笅璇撅紒鍒繕浜嗛《鎴戠殑甯栧瓙鍛......<br /><br /><br /><b>鍏佸皬緇?/b><br /><br />銆銆鏈洖浠嬬粛絎竴涓狝TL緇勪歡紼嬪簭鐨勫緩绔嬫楠わ紝鑰屽浣曚嬌鐢ㄨ緇勪歡錛屾暚璇峰叧娉ㄣ奀OM 緇勪歡璁捐涓庡簲鐢?涓?銆嬨? <hr /> 娉?錛欰partment錛岀郴緇熼氳繃闅愯棌鐨勭獥鍙f秷鎭潵鎺掗槦緇勪歡璋冪敤錛屽洜姝ゆ垜浠彲浠ユ殏鏃朵笉鑰冭檻鍚屾闂銆傛敞鎰忥紝鏄殏鏃跺搱銆?br />娉?錛氬弻鎺ュ彛琛ㄧず鍦ㄤ竴涓帴鍙d腑錛屽悓鏃舵敮鎸佽嚜瀹氫箟鎺ュ彛鍜?IDispatch 鎺ュ彛銆備互鍚庯紝浠ュ悗錛屼互鍚庡氨璁層傚洜涓哄弻鎺ュ彛闈炲父閲嶈錛屾垜浠互鍚庝細澶╁ぉ璁層佸澶滆銆佸父甯歌------綆縐扳滀笁璁測?)<br />娉?錛氱粍浠剁殑閲嶇敤鏂規(guī)硶鏈?涓紝鑱氬悎鍜屽寘瀹廣?br />娉?錛氳繖浜涢兘鏄?IDL 鏂囦歡涓殑姒傚康錛屼互鍚庣敤鍒頒粈涔堬紝灝變粙緇嶄粈涔堛?img src ="http://m.shnenglu.com/yishanhante/aggbug/19606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-12 10:40 <a href="http://m.shnenglu.com/yishanhante/articles/19606.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>COM 緇勪歡璁捐涓庡簲鐢紙浜旓級鐢?ATL 鍐欑涓涓粍浠?/title><link>http://m.shnenglu.com/yishanhante/articles/19605.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 12 Mar 2007 02:39:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19605.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19605.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19605.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19605.html</trackback:ping><description><![CDATA[ <strong>涓銆佸墠璦<br /><br /></strong>銆銆1銆佸鏋滀綘鍦ㄤ嬌鐢?vc5.0 鍙婁互鍓嶇殑鐗堟湰錛岃浣犲崌綰т負 vc6.0 鎴?vc.net 2003錛?br />銆銆2銆佸鏋滀綘鍦ㄤ嬌鐢?vc6.0 (ATL 3.0)璇烽槄璇繪湰鍥炲唴瀹癸紱<br />銆銆3銆佸鏋滀綘鍦ㄤ嬌鐢?vc.net(ATL 7.0)璇烽槄璇諱笅鍥炲唴瀹癸紱(褰撶劧璇昏鏈枃鍐呭涔熶笉閿?<br />銆銆4銆佽繖絎竴涓粍浠訛紝闄や簡鎵鏈?COM 緇勪歡蹇呴』鐨?IUnknown 鎺ュ彛澶栵紝鎴戜滑鍐嶅疄鐜頒竴涓嚜宸卞畾涔夌殑鎺ュ彛 IFun錛屽畠鏈変袱涓嚱鏁幫細 Add()瀹屾垚涓や釜鏁板肩殑鍔犳硶錛孋at()瀹屾垚涓や釜瀛楃涓茬殑榪炴帴銆?br />銆銆5銆佷笅闈?.....濂藉ソ鍚! 寮濮嬩簡:-) <p><b><br />浜屻?/b><b>寤虹珛 ATL 宸ョ▼</b><br />銆銆姝ラ2.1錛氬緩绔嬩竴涓伐浣滃尯(WorkSpace)銆?br />銆銆姝ラ2.2錛氬湪宸ヤ綔鍖轟腑錛屽緩绔嬩竴涓?ATL 宸ョ▼(Project)銆傜ず渚嬬▼搴忓彨 Simple1錛屽茍閫夋嫨DLL鏂瑰紡錛岃鍥句竴銆?br /><br /><img height="467" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic01.jpg" width="612" border="0" /><br />鍥句竴銆佸緩绔?ATL DLL 宸ョ▼<br /><br />銆銆<i><b>Dynamic Link Library(DLL)</b></i> 琛ㄧず寤虹珛涓涓?DLL 鐨勭粍浠剁▼搴忋?br />銆銆<i><b>Executable(EXE)</b></i> 琛ㄧず寤虹珛涓涓?EXE 鐨勭粍浠剁▼搴忋?br />銆銆<i><b>Service(EXE)</b></i> 琛ㄧず寤虹珛涓涓湇鍔$▼搴忥紝緋葷粺鍚姩鍚庡氨浼氬姞杞藉茍鎵ц鐨勭▼搴忋?br />銆銆<i><b>Allow merging of proxy/stub code</b></i> 閫夋嫨璇ラ」琛ㄧず鎶娾滀唬鐞?瀛樻牴鈥濅唬鐮佸悎騫跺埌緇勪歡紼嬪簭涓紝鍚﹀垯闇瑕佸崟鐙紪璇戯紝鍗曠嫭娉ㄥ唽浠g悊瀛樻牴紼嬪簭銆備唬鐞?瀛樻牴錛岃繖涓槸浠涔堟蹇碉紵榪樿寰楁垜浠湪<a >涓婂洖涔?/a>涓粙緇嶇殑鍚楋紵褰撹皟鐢ㄨ呰皟鐢ㄨ繘紼嬪鎴栬繙紼嬬粍浠跺姛鑳界殑鏃跺欙紝鍏跺疄鏄唬鐞?瀛樻牴璐熻矗鏁版嵁浜ゆ崲鐨勩傚叧浜庝唬鐞?瀛樻牴鐨勫叿浣撳彉鎴愬拰鎿嶄綔錛屼互鍚庡啀璇村暒......<br />銆銆<i><b>Support MFC</b></i> 闄ら潪鏈夌壒孌婄殑鍘熷洜錛屾垜浠啓 ATL 紼嬪簭錛屾渶濂戒笉瑕侀夋嫨璇ラ」銆備綘鍙兘浼氳錛屽鏋滄病鏈塎FC鐨勬敮鎸侊紝閭String鎬庝箞鍔炲憖錛熷憡璇変綘涓瀵嗗惂錛屼竴鑸漢鎴戦兘涓嶅憡璇変粬錛屾垜鍚庡崐杈堝瓙灝遍潬鐫榪欎釜縐樺瘑媧葷潃浜嗭細<br />銆銆1銆佷綘浼歋TL鍚楋紵鍙互鐢?STL 涓殑 string 浠f浛錛?br />銆銆2銆佽嚜宸卞啓涓?MyString 綾伙紝鍢垮樋錛?br />銆銆3銆佹?zhèn)勬?zhèn)勫湴銆佺瀵嗗湴銆佷笉瑕佸憡璇夊埆浜猴紙鐗瑰埆鏄埆鍛婅瘔寰蔣錛夛紝鎶?MFC 涓殑 CString 婧愮爜鎷胯繃鏉ョ敤錛?br />銆銆4銆佷嬌鐢?CComBSTR 綾伙紝鑷沖皯涔熻兘綆鍖栨垜浠瓧絎︿覆鎿嶄綔錛?br />銆銆5銆佺洿鎺ョ敤 API 鎿嶄綔瀛楃涓詫紝鍙嶆鎴戜滑澶у瀛︿範 C 璇█鐨勬椂鍊欙紝閮芥槸浠庤繖閲屽共璧風殑銆傦紙絳変簬娌¤錛屽懙鍛碉級<br />銆銆<i><b>Support MTS</b></i> 鏀寔浜嬪姟澶勭悊錛屼篃灝辨槸鏄惁鏀寔 COM+ 鍔熻兘銆侰OM+ 涔熻鍦ㄧ 99 鍥炰粙緇嶅惂銆?br /><br /><b><br />涓夈佸鍔?ATL 瀵硅薄綾?br /></b><br />銆銆姝ラ3.1錛氳彍鍗?Insert\New ATL Object...錛堟垨鑰呯敤榧犳爣鍙抽敭鍦?ClassView 鍗$墖涓脊鍑鴻彍鍗曪級騫墮夋嫨Object 鍒嗙被錛岄変腑 Simple Object 欏圭洰銆傝鍥句簩銆?br /><br /><img height="257" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic02.jpg" width="413" border="0" /><br />鍥句簩銆侀夋嫨寤虹珛綆鍗旵OM瀵硅薄<br /><br />銆銆<i><b>Category Object</b></i> 鏅氱粍浠躲傚叾涓彲浠ラ夋嫨鐨勭粍浠跺璞$被鍨嬪緢澶氾紝浣嗘湰璐ㄤ笂錛屽氨鏄鍚戝甯垜浠粯璁ゅ姞涓婁竴浜涙帴鍙c傛瘮濡傛垜浠?"Simple Object"錛屽垯鍚戝緇欐垜浠殑緇勪歡鍔犱笂 IUnknown 鎺ュ彛錛涙垜浠?"Internet Explorer Object"錛屽垯鍚戝闄や簡鍔犱笂 IUnknown 鎺ュ彛澶栵紝鍐嶅鍔犱竴涓粰 IE 鎵浣跨敤鐨?IObjectWithSite 鎺ュ彛銆傚綋鐒朵簡錛屾垜浠畬鍏ㄥ彲浠ユ墜宸ュ鍔犱換浣曟帴鍙c?br />銆銆<i><b>Category Controls</b></i> ActiveX 鎺т歡銆傚叾涓彲浠ラ夋嫨鐨?ActiveX 綾誨瀷涔熷緢澶氥傛垜浠湪鍚庣畫鐨勪笓闂ㄤ粙緇?ActiveX 緙栫▼涓啀璁ㄨ銆?br />銆銆<i><b>Category Miscellaneous</b></i> 杈呭姪鏉傜被緇勪歡銆?br />銆銆<i><b>Categroy Data Access</b></i> 鏁版嵁搴撶被緇勪歡(鎴戞渶璁ㄥ帉鏁版嵁搴撶紪紼嬩簡錛屾墍浠ユ垜涔熶笉浼?銆?br /><br />銆銆姝ラ3.2錛氬鍔犺嚜瀹氫箟綾?CFun(鎺ュ彛 IFun) ,瑙佸浘涓夈?br /><br /><img height="260" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic03.jpg" width="421" border="0" /><br />鍥句笁銆佽緭鍏ョ被涓殑鍚勯」鍚嶇О<br />銆銆 鍏跺疄錛屾垜浠彧闇瑕佽緭鍏ョ煭鍚?Short Name)錛屽叾瀹冪殑欏圭洰浼氳嚜鍔ㄥ~鍐欍傛病浠涔堝璇寸殑錛屽彧璇峰ぇ瀹舵敞鎰忎竴涓?ProgID 欏癸紝榛樿鐨?ProgID 鏋勯犳柟寮忎負鈥滃伐紼嬪悕.鐭悕鈥濄?br /><br />銆銆 姝ラ3.3錛氬~鍐欐帴鍙e睘鎬э紝瑙佸浘鍥涖?br /><img height="260" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic04.jpg" width="421" border="0" /><br />鍥懼洓銆佹帴鍙e睘鎬?br /><br />銆銆<i><b>Threading Model</b></i> 閫夋嫨緇勪歡鏀寔鐨勭嚎紼嬫ā鍨嬨侰OM 涓殑綰跨▼錛屾垜璁や負鏄渶璁ㄥ帉錛屾渶澶嶆潅鐨勯儴鍒嗐侰OM 綰跨▼鍜屽叕瀵撶殑姒傚康錛岀暀寰呭悗緇粙緇嶃傜幇鍦ㄥ悧......澶у閮介?Apartment錛屽畠浠h〃浠涔堥偅錛熺畝鍗曞湴璇達細褰撳湪綰跨▼涓皟鐢ㄧ粍浠跺嚱鏁扮殑鏃跺欙紝榪欎簺璋冪敤浼氭帓闃熻繘琛屻傚洜姝わ紝榪欑妯″紡涓嬶紝鎴戜滑鍙互鏆傛椂涓嶇敤鑰冭檻鍚屾鐨勯棶棰樸?娉?)<br />銆銆 <i><b>Interface</b></i> 鎺ュ彛鍩烘湰綾誨瀷銆侱ual 琛ㄧず鏀寔鍙屾帴鍙?娉?)錛岃繖涓潪甯?闈炲父閲嶈錛岄潪甯擱潪甯稿父鐢紝浣嗘垜浠粖澶╀笉璁層侰ustom 琛ㄧず鑷畾涔夊熷彛銆?b>鍒囪錛佸垏璁幫紒鎴戜滑鐨勮繖絎竴涓?COM 紼嬪簭涓紝涓瀹氳閫夋嫨瀹冿紒錛侊紒錛?/b>錛堝鏋滀綘閫夐敊浜嗭紝璇峰垹闄ゅ叏閮ㄥ唴瀹癸紝閲嶆柊鏉ヨ繃銆傦級<br />銆銆 Aggregation 鎴戜滑鍐欑殑緇勪歡錛屽皢鏉ユ槸鍚﹀厑璁歌鍒漢鑱氬悎(娉?)浣跨敤銆侽nly 琛ㄧず蹇呴』琚仛鍚堟墠鑳戒嬌鐢紝鏈夌偣綾諱技 C++ 涓殑綰櫄綾伙紝浣犺鏄誨伐紼嬪笀錛屽彧璐熻矗璁捐浣嗕笉浜茶嚜鍐欎唬鐮佺殑璇濓紝鎵嶉夋嫨瀹冦?br />銆銆<i><b>Support ISupportErrorInfo</b></i> 鏄惁鏀寔涓板瘜淇℃伅鐨勯敊璇鐞嗘帴鍙c備互鍚庡氨璁層?br />銆銆<i><b>Support Connection Points</b></i> 鏄惁鏀寔榪炴帴鐐規(guī)帴鍙o紙浜嬩歡銆佸洖璋冿級銆備互鍚庡氨璁層?br />銆銆<i><b>Free Threaded Marshaler</b></i> 浠ュ悗涔熶笉璁詫紝灝辯畻鎵撴浣狅紝鎴戜篃涓嶈錛?娉?)<br /><br /><b><br />鍥涖佹坊鍔犳帴鍙e嚱鏁?br /></b><br /><img height="365" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic05.jpg" width="282" border="0" /><br />鍥句簲銆佽皟鍑哄鍔犳帴鍙f柟娉曠殑鑿滃崟<br /><br /><img height="311" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic06.jpg" width="486" border="0" /><br />鍥懼叚銆佸鍔犳帴鍙e嚱鏁?Add<br /><br /><img height="311" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic07.jpg" width="486" border="0" /><br />鍥句竷銆佸鍔犳帴鍙e嚱鏁?Cat<br /><br />銆銆璇蜂弗鏍兼寜鐓у浘鍏殑鏂瑰紡錛屽鍔燗dd()鍑芥暟錛涚敱浜庡浘涓冧腑澧炲姞Cat()鍑芥暟鐨勫弬鏁版瘮杈冮暱錛屾垜娌℃湁閫傚綋鐨勮緭鍏ョ┖鏍鹼紝璇峰ぇ瀹惰嚜宸辮緭鍏ョ殑鏃跺欐敞鎰忎竴涓嬨俒in]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍏ワ紱[out]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍑猴紱[out,retval]琛ㄧず鍙傛暟鏂瑰悜鏄緭鍑猴紝鍚屾椂鍙互浣滀負鍑芥暟榪愮畻緇撴灉鐨勮繑鍥炲箋備竴涓嚱鏁頒腑錛屽彲浠ユ湁澶氫釜[in]銆乕out]錛屼絾[retval]鍙兘鏈変竴涓紝騫朵笖瑕佸拰[out]緇勫悎鍚庡湪鏈鍚庝竴涓綅緗?娉?)<br /><img height="454" src="http://www.vckbase.net/document/journal/vckbase43/images/comtut5pic08.jpg" width="535" border="0" /><br />鍥懼叓銆佹帴鍙e嚱鏁板畾涔夊畬鎴愬悗鐨勫浘紺?br />銆銆鎴戜滑閮界煡閬擄紝瑕佹兂鏀瑰彉 C++ 涓殑綾誨嚱鏁幫紝闇瑕佷慨鏀逛袱涓湴鏂癸細涓鏄ご鏂囦歡(.h)涓被鐨勫嚱鏁板0鏄庯紝浜屾槸鍑芥暟浣?.cpp)鏂囦歡鐨勫疄鐜板銆傝屾垜浠幇鍦ㄧ敤 ATL 鍐欑粍浠剁▼搴忥紝鍒欒繕瑕佷慨鏀逛竴涓湴鏂癸紝灝辨槸鎺ュ彛瀹氫箟(IDL)鏂囦歡銆傚埆鐫鎬?IDL 涓嬫灝辮璁ㄨ鍟︺?br />銆銆鐢變簬 vc6.0 鐨凚UG錛屽鑷村ぇ瀹跺湪澧炲姞瀹屾帴鍙e拰鎺ュ彛鍑芥暟鍚庯紝鍙兘涓嶄細鍚戜笂鍥撅紙鍥懼叓錛夋墍琛ㄧ幇鐨勬牱寮忋傝В鍐蟲柟娉曪細<br />銆 </p><table cellspacing="1" width="100%" border="1"><tbody><tr><td align="middle" width="3%">1</td><td width="60%">鍏抽棴宸ョ▼錛岀劧鍚庨噸鏂版墦寮</td><td width="37%">璇ユ柟娉曞父甯告湁鏁?/td></tr><tr><td align="middle" width="3%">2</td><td width="60%">鍏抽棴 IDE錛岀劧鍚庨噸鏂拌繍琛?/td><td width="37%">銆</td></tr><tr><td align="middle" width="3%">3</td><td width="60%">鎵撳紑 IDL 鏂囦歡錛屾鏌ユ帴鍙e嚱鏁版槸鍚︽紜紝濡備笉姝g‘璇蜂慨鏀?/td><td width="37%">銆</td></tr><tr><td align="middle" width="3%">4</td><td width="60%">鎵撳紑 IDL 鏂囦歡錛岄殢渚夸慨鏀逛竴涓?鍔犱竴涓┖鏍鹼紝鍐嶅垹闄よ繖涓┖鏍?錛岀劧鍚庝繚瀛?/td><td width="37%">璇ユ柟娉曞父甯告湁鏁?/td></tr><tr><td align="middle" width="3%">5</td><td width="60%">鎵撳紑 h/cpp 鏂囦歡錛屾鏌ュ嚱鏁版槸鍚﹀瓨鍦ㄦ垨鏄惁姝g‘錛屾湁鍒欐敼涔?/td><td width="37%">鏃犲垯鍢夊媺錛屼笉璇村畬榪欎釜鎴愯蹇冪悊鍒壄</td></tr><tr><td align="middle" width="3%">6</td><td width="60%">鍒犻櫎 IDL/H/CPP 涓殑鎺ュ彛鍑芥暟錛岀劧鍚?/td><td width="37%">鍐嶆潵涓閬?/td></tr><tr><td align="middle" width="3%">7</td><td width="60%">閲嶆柊寤虹珛宸ョ▼銆侀噸鏂板畨瑁卾c銆侀噸鏂板畨瑁厀indows銆佺牳璁$畻鏈?/td><td width="37%">鐮革紒</td></tr></tbody></table><p><b><br />浜斻佸疄鐜版帴鍙e嚱鏁?/b><br /><br />銆銆榧犳爣鍙岀偣鍥懼叓涓瑿Fun\IFun\Add(...)灝卞彲浠ュ紑濮嬭緭鍏ュ嚱鏁板疄鐜頒簡錛?/p><pre>STDMETHODIMP CFun::Add(long n1, long n2, long *pVal) { *pVal = n1 + n2; return S_OK; }</pre>榪欎釜澶畝鍗曚簡錛屼笉鍐嶆氮璐光滃彛鏉♀濄備笅闈㈡垜浠疄鐜板瓧絎︿覆榪炴帴鐨凜at()鍑芥暟錛?pre>STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { int nLen1 = ::SysStringLen( s1 ); // s1 鐨勫瓧絎﹂暱搴? int nLen2 = ::SysStringLen( s2 ); // s2 鐨勫瓧絎﹂暱搴? *pVal = ::SysAllocStringLen( s1, nLen1 + nLen2 ); // 鏋勯犳柊鐨?BSTR 鍚屾椂鎶?s1 鍏堜繚瀛樿繘鍘? if( nLen2 ) { ::memcpy( *pVal + nLen1, s2, nLen2 * sizeof(WCHAR) ); // 鐒跺悗鎶?s2 鍐嶈繛鎺ヨ繘鍘? // wcscat( *pVal, s2 ); } return S_OK; }</pre>瀛︾敓錛氫笂闈㈢殑鍑芥暟瀹炵幇錛屽畬鍏ㄦ槸璋冪敤鍩烘湰鐨?API 鏂瑰紡瀹屾垚鐨勩?br />鑰佸笀錛氭槸鐨勶紝璇村疄璇濓紝鐨勭‘姣旇緝鐑︾悙銆?br />瀛︾敓錛氭垜浠槸鐢╩emcpy()瀹屾垚榪炴帴絎簩涓瓧絎︿覆鍔熻兘鐨勶紝閭d箞涓轟粈涔堜笉鐢ㄥ嚱鏁?wcscat()閭o紵<br />鑰佸笀錛氬鏁版儏鍐典笅鍙互錛屼絾浣犻渶瑕佺煡閬擄細鐢變簬BSTR鍖呭惈鏈夊瓧絎︿覆闀垮害錛屽洜姝ゅ疄闄呯殑BSTR瀛楃涓插唴瀹逛腑鏄彲浠ュ瓨鍌↙''\0''鐨勶紝鑰屽嚱鏁?wcscat() 鏄互L''\0''浣滀負澶嶅埗緇撴潫鏍囧織錛屽洜姝ゅ彲鑳戒細涓㈠け鏁版嵁銆傛槑鐧戒簡鍚楋紵<br />瀛︾敓錛氭槑鐧斤紝鏄庣櫧銆傛垜鐪嬭繃銆?a >COM 緇勪歡璁捐涓庡簲鐢?涓?</a>涔嬫暟鎹被鍨嬨嬪悗灝辨槑鐧戒簡銆傞偅涔堣佸笀錛屾湁娌℃湁綆鍗曚竴浜涚殑鏂規(guī)硶閭o紵<br />鑰佸笀錛氭湁鍛錛屼綘鐪?.....<pre>STDMETHODIMP CFun::Cat(BSTR s1, BSTR s2, BSTR *pVal) { CComBSTR sResult( s1 ); sResult.AppendBSTR( s2 ); *pVal = sResult.Copy(); // *pVal = sResult.Detach(); return S_OK; }</pre>瀛︾敓錛氬搱鍝堬紝濂斤紒浣跨敤浜?CComBSTR錛岃繖涓氨綆鍗曞浜嗐侰ComBSTR::Copy()鍜孋ComBSTR::Detach()鏈変粈涔堝尯鍒紵<br />鑰佸笀錛欳ComBSTR::Copy() 浼氬埗閫犱竴涓?BSTR 鐨勫壇鏈紝鍙﹀CComBSTR::CopyTo()涔熸湁綾諱技鍔熻兘銆傝孋ComBSTR::Detach()鏄嬌瀵硅薄涓庡唴閮ㄧ殑 BSTR 鎸囬拡鍓ョ錛岃繖涓嚱鏁扮敱浜庢病鏈夊鍒惰繃紼嬶紝鍥犳閫熷害紼嶅井蹇竴鐐圭偣銆備絾瑕佹敞鎰忥紝涓浣嗗墺紱誨悗錛屽氨涓嶈兘鍐嶄嬌鐢ㄨ瀵硅薄鍟︺?br />瀛︾敓錛氳佸笀錛屾?zhèn)ㄨ鐨勫お鐗涘暒锛屾垜瀵规?zhèn)ㄧ殑鏁話濡傚穽宸嶆嘲灞憋紝鐩村叆浜戦渼......<br />鑰佸笀錛歋TOP錛孲TOP錛佺暀浣滀笟鍟?.....<br />銆銆 1銆佽嚜宸卞厛鎸夌収浠婂ぉ璁茬殑鍐呭鍐欏嚭榪欎釜緇勪歡錛?br />銆銆 2銆佷笉綆′綘鎳備笉鎳傦紝涓瀹氳鍘昏瀵?IDL 鏂囦歡錛孋PP 鏂囦歡錛?br />銆銆 3銆佺紪璇戝悗錛岀湅閮戒駭鐢熶簡浜涗粈涔堟枃浠訛紵濡傛灉鏄枃鏈殑鏂囦歡錛屽氨鎵撳紑鐪嬬湅錛?br />銆銆 4銆佷笅杞芥湰鏂囩殑紺轟緥紼嬪簭(vc6.0鐗堟湰)緙栬瘧榪愯錛岀湅鐪嬫晥鏋溿傜劧鍚庨涔犱竴涓嬬ず渚嬬▼搴忎腑鐨勮皟鐢ㄦ柟娉曪紱<br />瀛︾敓錛氱煡閬撳暒錛屽揩涓嬭鍚э紝鎴戣涓婂帟鎵錛屾垜閮芥唻鐨勪笉琛屼簡......<br />鑰佸笀錛氫笅璇撅紒鍒繕浜嗛《鎴戠殑甯栧瓙鍛......<br /><br /><br /><b>鍏佸皬緇?/b><br /><br />銆銆鏈洖浠嬬粛絎竴涓狝TL緇勪歡紼嬪簭鐨勫緩绔嬫楠わ紝鑰屽浣曚嬌鐢ㄨ緇勪歡錛屾暚璇峰叧娉ㄣ奀OM 緇勪歡璁捐涓庡簲鐢?涓?銆嬨?br />銆 <hr /> 娉?錛欰partment錛岀郴緇熼氳繃闅愯棌鐨勭獥鍙f秷鎭潵鎺掗槦緇勪歡璋冪敤錛屽洜姝ゆ垜浠彲浠ユ殏鏃朵笉鑰冭檻鍚屾闂銆傛敞鎰忥紝鏄殏鏃跺搱銆?br />娉?錛氬弻鎺ュ彛琛ㄧず鍦ㄤ竴涓帴鍙d腑錛屽悓鏃舵敮鎸佽嚜瀹氫箟鎺ュ彛鍜?IDispatch 鎺ュ彛銆備互鍚庯紝浠ュ悗錛屼互鍚庡氨璁層傚洜涓哄弻鎺ュ彛闈炲父閲嶈錛屾垜浠互鍚庝細澶╁ぉ璁層佸澶滆銆佸父甯歌------綆縐扳滀笁璁測?)<br />娉?錛氱粍浠剁殑閲嶇敤鏂規(guī)硶鏈?涓紝鑱氬悎鍜屽寘瀹廣?br />娉?錛氬悕縐扮殑鍔熻兘寰堝ソ鍚紝浣嗗井杞牴鏈氨娌℃湁瀹炵幇銆?br />娉?錛氳繖浜涢兘鏄?IDL 鏂囦歡涓殑姒傚康錛屼互鍚庣敤鍒頒粈涔堬紝灝變粙緇嶄粈涔堛?br /><img src ="http://m.shnenglu.com/yishanhante/aggbug/19605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-12 10:39 <a href="http://m.shnenglu.com/yishanhante/articles/19605.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢ˋTL寤虹珛杞婚噺綰х殑COM瀵硅薄銆愪竴銆?/title><link>http://m.shnenglu.com/yishanhante/articles/19602.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 12 Mar 2007 02:01:00 GMT</pubDate><guid>http://m.shnenglu.com/yishanhante/articles/19602.html</guid><wfw:comment>http://m.shnenglu.com/yishanhante/comments/19602.html</wfw:comment><comments>http://m.shnenglu.com/yishanhante/articles/19602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/yishanhante/comments/commentRss/19602.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/yishanhante/services/trackbacks/19602.html</trackback:ping><description><![CDATA[ <p>鏈枃鍋囪浣犵啛鎮(zhèn)塁++鍜孋OM銆?br /><br /><b>鎽樿錛?/b><br />聽聽聽 ATL鈥斺旀椿鍔ㄦā鏉垮簱錛圱he Active Template Library錛夛紝鍏惰璁℃棬鍦ㄨ浜轟滑鐢–++鏂逛究鐏墊椿鍦板紑鍙慍OM瀵硅薄銆侫TL鏈韓鐩稿綋灝忓閥鐏墊椿錛岃繖鏄畠鏈澶х殑浼樼偣銆傜敤瀹冨彲浠ュ垱寤鴻交閲忕駭鐨勶紝鑷寘鍚殑錛屽彲澶嶇敤鐨勪簩榪涘埗浠g爜錛屼笉鐢ㄤ換浣曢檮鍔犵殑榪愯鏃禗LLs鏀寔銆?br />聽聽聽 鐢變簬COM鎶鏈壇濂界殑鍙g錛岃秺鏉ヨ秺澶氱殑紼嬪簭鍛樺凡緇忚蛋榪涙垨姝e湪璧拌繘COM鐨勭紪紼嬩笘鐣屻傚畠?yōu)鍍忕洓澶忛噷鐨勫啺闀囧暏閰掑Q屼粠鏉ヤ笉浼氳浣犲け鏈涖傚彲鎯滀綔涓轟竴涓狢++紼嬪簭鍛樻潵璇達紝C++浠庝笉涓庢垜鍒嗕韓COM鐨勬瀬鑷翠互鍙婃垜瀵笴OM鐨勬儏鏈夌嫭閽熴?<br />聽聽聽 C++涓嶤OM涔嬮棿鑻ュ嵆鑻ョ錛屽拰騫沖叡澶勶紝涓嬈″張涓嬈″湪姣忎釜瀵硅薄涓敤鍚屾牱綆媧佺殑鍑犺浠g爜瀹炵幇IUnknown銆傛垜鏁㈣偗瀹氬皢鏉++緙栬瘧鍣ㄥ拰閾炬帴鍣ㄤ細瀹炵幇C++瀵硅薄鍜孋OM瀵硅薄涔嬮棿鑷劧 鐨勬棤鎰忚瘑鐨勫搴斿拰鏄犲皠錛岀洰鍓嶈繖涓幆澧冨彧瀛樺湪浜庡疄楠屽涓紝鍥犳瀹冭偗瀹氫笉鏄竴涓綘鎴戜粖澶╁彲浠ヨ喘涔扮殑浜у搧銆傜溂涓嬪彲寰楀埌鐨勬渶鎺ヨ繎榪欎釜鐜鐨勪笢瑗垮氨鏄椿鍔ㄦā鏉垮簱鈥斺擜TL銆?br /><br /><b>涓轟粈涔堜嬌鐢ˋTL?<br />聽聽聽 </b>ATL鏄湪鍗曞眰錛坰ingle-tier錛夊簲鐢ㄩ愭笎榪囨椂錛屽垎甯冨紡搴旂敤閫愭笎鎴愪負涓繪祦榪欐牱涓涓幆澧冧腑璇炵敓鐨勶紝 瀹冩渶鍒濈殑鐗堟湰鏄湪鍥涗釜C++澶存枃浠朵腑錛屽叾涓湁涓涓繕鏄┖鐨勩傚畠鎵褰㈡垚鐨勫嚭鑹茬殑鏋勬灦涓撻棬鐢ㄤ簬寮鍙戠幇浠e垎甯冨紡搴旂敤鎵闇鐨勮交閲忕駭COM緇勪歡銆備綔涓轟竴涓ā鍧楀寲鐨勬爣鍑嗙粍浠訛紝ATL涓嶅儚MFC鏈夊帤閲嶇殑鍩虹緇撴瀯錛岀渷鏃跺ソ鐢ㄧ殑搴撲嬌寰楁垚鐧句笂鍗冪殑紼嬪簭鍛樹竴嬈″張涓嬈¤交鏉懼疄鐜癐Unknown 鍜孖ClassFactory銆?br />聽聽聽 ATL鐨勬瀯鏋跺茍涓嶆墦綆楀寘緗椾竾璞★紝鏃犳墍涓嶈兘銆傚叾絎竴涓増鏈瀹炵幇IUnknown錛孖ClassFactory錛孖Dispatch錛孖connectionPointContainer鍙奀OM鏋氫婦鎻愪緵闈炲父 鍒頒綅鐨勬敮鎸併傜浜屼釜鐗堟湰闄や簡鍙互緙栧啓ActiveX鎺т歡澶栵紝榪樺鏈鍒濈殑絎竴涓増鏈腑ATL綾昏繘琛屼簡澧炲己銆侫TL涓嶆彁渚涢泦鍚堬紙collections錛夊拰涓詫紙strings錛夌殑澶勭悊 錛屽畠鍋囪浣犵敤鏍囧噯鐨凜++搴撹繘琛岃繖浜涘鐞嗭紱涓嶆敮鎸丱DBC鈥斺旇繖涓笘鐣屾鍦ㄨ漿縐誨埌鍩轟簬COM鐨勪笉闇瑕佸寘瑁呯殑鏁版嵁瀛樺彇鏂瑰紡錛涗笉鏀寔WinSock鎵撳寘綾?-sockets鏈韓涔熸槸鏂扮殑涓滆タ錛汚TL涔熶笉鏀寔瀹屾暣鐨刉in32 API鎵撳寘綾燴斺擜TL2.0鐨勫疄鐜版満鍒舵彁渚涗簡瀵硅瘽妗嗗拰WndProcs鏀寔銆傛澶朅TL涓病鏈塎FC涓殑鏂囨。/瑙嗗浘妯″瀷銆傚彇鑰屼唬涔嬬殑鏄疉TL閭f洿鍏蜂幾緙╂у拰鐏墊椿 鎬х殑閫氳繃COM鎺ュ彛錛堝ActiveX鎺т歡錛変笌鍩轟簬UI鐨勫璞′箣闂寸殑娌熼氭ā寮忋?br />聽聽聽 浣跨敤姝g‘鐨勫伐鍏烽潪甯稿叧閿傚鏋滀綘姝e湪緙栧啓涓涓笉鍙鐨凜OM緇勪歡錛岄偅涔圓TL涓嶮FC姣旇搗鏉ワ紝浠庡紑鍙戞晥鐜囷紝鍙幾緙╂э紝榪愯鏃舵ц兘浠ュ強鍙墽琛屾枃浠跺ぇ灝忓悇鏂歸潰鏉ョ湅錛孉TL鍙兘 閮芥槸鏈濂界殑閫夋嫨銆傚浜庣幇浠e熀浜嶢ctiveX鎺т歡鐨勭敤鎴風晫闈紝ATL鎵浜х敓鐨勪唬鐮佷篃姣擬FC鏇村皬鏇村揩銆傚彟涓鏂歸潰錛屼笌MFC鐨勭被鍚戝鐩告瘮錛孉TL闇瑕佹洿澶氱殑COM鐭ヨ瘑銆侫TL涓嶴TL涓鏍鳳紝瀵逛簬鍗曞眰搴旂敤娌′粈涔堝府鍔╋紝鑰孧FC鍦ㄨ繖鏂歸潰淇濇寔鐫瀹冪殑浼樺娍銆?br />聽聽聽 ATL鐨勮璁″湪寰堝ぇ紼嬪害涓婃潵鑷猄TL鐨勭伒鎰燂紝STL涓庢墍鏈堿NSI/ISO鍏煎鐨凜++緙栬瘧鍣ㄤ竴璧峰凡緇忚綰沖叆鎴愪負鏍囧噯C++搴撶殑涓閮ㄥ垎銆傚儚STL涓鏍鳳紝ATL澶ц儐浣跨敤C++妯℃澘銆傛ā鏉挎槸C++涓紬澶氬叿鏈変簤璁殑鐗規(guī)т箣涓銆傛瘡姣忎嬌鐢ㄤ笉褰撻兘浼氬鑷存墽琛屾販涔憋紝闄嶄綆鎬ц兘 鍜岄毦浠ョ悊瑙g殑浠g爜銆傛槑鏅哄湴浣跨敤妯℃澘鎵浜х敓鐨勯氱敤鎬ф晥鏋滃拰綾誨瀷瀹夊叏鐗規(guī)у垯鏄叾瀹冩柟娉曟墍鏈涘皹鑾強鐨勩侫TL涓嶴TL涓鏍烽櫡鍏ヤ簡涓や釜鏋佺銆傚垢榪愮殑鏄?鍦↙澶ц儐浣跨敤C++妯℃澘鐨勫悓鏃訛紝緙栬瘧鍣ㄥ拰閾炬帴鍣ㄦ妧鏈篃鍦ㄤ互鍚屾牱鐨勬浼愬悜鍓嶅彂灞曘備負褰撳墠鍜屽皢鏉ョ殑寮鍙戣繘琛孲TL鍜孉TL鐨勫悎鐞嗛夋嫨銆?br />聽聽聽 灝界妯℃澘鍦ㄥ唴閮ㄥ緱鍒板箍娉涚殑浣跨敤錛屼絾鏄湪鐢ˋTL鎶鏈椂錛屼綘涓嶇敤鍘繪暡鍏ユ垨鍏沖績閭d簺妯℃澘涓殑灝栨嫭寮с傚洜涓篈TL鏈韓甯︽湁ATL瀵硅薄鍚戝錛堝弬瑙佸浘涓錛夛細<br /><br /><img height="233" src="http://www.vckbase.net/document/journal/vckbase13/images/atlcomjoy1.gif" width="400" border="0" /><br /><br /><img height="265" src="http://www.vckbase.net/document/journal/vckbase13/images/atlcomjoy2.gif" width="400" border="0" /><br /><br /><img height="265" src="http://www.vckbase.net/document/journal/vckbase13/images/atlcomjoy3.gif" width="400" border="0" /><br />鍥句竴 ATL 瀵硅薄鍚戝<br /><br /><br />聽聽聽 瀵硅薄鍚戝浜х敓澶ч噺鍩轟簬ATL妯℃澘綾葷己鐪佺殑瀵硅薄瀹炵幇浠g爜錛堝嵆妗嗘灦浠g爜錛夈傝繖浜涚己鐪佺殑瀵硅薄綾誨瀷濡?a >闄勮〃涓</a>鎵鍒椼侫TL瀵硅薄鍚戝鍏佽浠諱綍浜?蹇熷緩绔婥OM瀵硅薄騫朵笖鍦ㄥ垎鍒嗛挓涔嬪唴璁╁畠榪愯璧鋒潵錛屼笉鐢ㄥ幓鑰冭檻COM鎴朅TL鐨勭粏鑺傞棶棰樸傚綋鐒訛紝涓轟簡鑳藉厖鍒嗛┚椹瑼TL錛屼綘蹇呴』鎺屾彙C++錛屾ā鏉垮拰COM緙栫▼鎶鏈傚浜庡ぇ鍨嬬殑瀵硅薄綾伙紝鍙鍦ˋTL瀵硅薄鍚戝鎵浜х敓鐨勭己鐪佸疄鐜幫紙妗嗘灦浠g爜錛変腑鍔犲叆鏂規(guī)硶瀹炵幇鏉ヨ緭鍑哄畾鍒舵帴鍙o紝榪欎篃鏄ぇ澶氭暟寮鍙戜漢鍛樺紑濮嬪疄鐜癈OM瀵硅薄鏃剁殑閲嶇偣鎵鍦ㄣ?br />聽聽聽 鍒濇鎺ヨЕATL鏃訛紝鍏朵綋緋葷粨鏋勭粰浜虹殑鎰熻鏄縐樺拰涓嶅彲鎬濊銆?xxxxime xime="7"><a target="_blank">HelloATL</a></xxxxime>鏄竴涓渶綆鍗曠殑鍩轟簬ATL鐨勮繘紼嬪唴鏈嶅姟鍣ㄦ簮浠g爜 浠ュ強鐢⊿DK錛堢函綺圭敤C++緙栧啓錛夊疄鐜扮殑鍚屾牱涓涓繘紼嬪唴鏈嶅姟鍣ㄦ簮浠g爜銆傚湪鐪熸鏋勫緩鍑轟竴涓狢OM緇勪歡涔嬪墠錛屼唬鐮侀渶瑕佺粡榪囧弽鍙嶅澶嶅嬈℃枱閰屽拰淇敼銆傚浜庢兂鍔犻熷紑鍙慍OM緇勪歡閫熷害鐨勪富嫻佺粍浠跺紑鍙戜漢鍛樻潵璇達紝ATL浣撶郴緇撴瀯騫朵笉鏄粈涔堝ぇ闂錛屽洜涓哄璞″悜瀵間駭鐢熶簡鎵闇瑕佺殑鍏ㄩ儴妗嗘灦浠g爜錛屽彧 瑕佷綘鍔犲叆鏂規(guī)硶瀹氫箟鍗沖彲銆傚浜庤鐪熺殑COM寮鍙戜漢鍛樺拰緋葷粺緙栫▼浜哄憳鏉ヨ錛孉TL鎻愪緵浜嗕竴涓敤C++寤虹珛COM緇勪歡鐨勯珮綰х殑錛屽彲鎵╁睍鐨勪綋緋葷粨鏋勩備竴鏃︿綘鐞嗚В鍜屾帉鎻′簡榪欎釜浣撶郴緇撴瀯騫惰兘椹鵑┉瀵硅薄鍚戝錛屼綘灝變細鐪嬪埌ATL鐨勮〃鐜拌兘鍔涘拰寮哄ぇ鐨勫姛鑳?錛屽畠瀹屽叏鍙互鍜屽師濮嬬殑COM緙栫▼鎶鏈緹庛?br />聽聽聽 鍙﹀涓涓嬌鐢ˋTL寮鍙慍OM緇勪歡鐨勭悊鐢辨槸Visual C++ 5.0+闆嗘垚寮鍙戠幆澧冿紙IDE錛夊ATL鐨勯珮搴︽敮鎸併?寰蔣鍦╒isual C++ 5.0+涓皢ATL鎵瑕佺敤鍒扮殑鎺ュ彛瀹氫箟璇█錛圛DL錛夐泦鎴愬埌浜咰++緙栬緫鍣ㄤ腑銆傦紙寰呯畫錛?br /><br /></p> <img src ="http://m.shnenglu.com/yishanhante/aggbug/19602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-03-12 10:01 <a href="http://m.shnenglu.com/yishanhante/articles/19602.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item></channel></rss> <a href="http://m.shnenglu.com/">青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品</a> <div style="position:fixed;left:-9000px;top:-9000px;"><font id="pjuwb"></font><button id="pjuwb"><pre id="pjuwb"></pre></button><sub id="pjuwb"></sub><tbody id="pjuwb"><var id="pjuwb"><address id="pjuwb"></address></var></tbody><listing id="pjuwb"><label id="pjuwb"><strong id="pjuwb"></strong></label></listing><wbr id="pjuwb"><small id="pjuwb"><tbody id="pjuwb"></tbody></small></wbr><ins id="pjuwb"><xmp id="pjuwb"></xmp></ins><style id="pjuwb"></style><label id="pjuwb"><em id="pjuwb"><li id="pjuwb"></li></em></label><samp id="pjuwb"></samp><menu id="pjuwb"><input id="pjuwb"></input></menu><pre id="pjuwb"><tbody id="pjuwb"><tfoot id="pjuwb"><button id="pjuwb"></button></tfoot></tbody></pre><form id="pjuwb"></form><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"><sup id="pjuwb"></sup></label></style></i><li id="pjuwb"><table id="pjuwb"><abbr id="pjuwb"></abbr></table></li><video id="pjuwb"></video><dfn id="pjuwb"></dfn><progress id="pjuwb"></progress><strong id="pjuwb"></strong><mark id="pjuwb"></mark><em id="pjuwb"></em><tbody id="pjuwb"><p id="pjuwb"><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike></p></tbody><option id="pjuwb"></option><strike id="pjuwb"></strike><u id="pjuwb"></u><td id="pjuwb"><center id="pjuwb"><tr id="pjuwb"></tr></center></td><em id="pjuwb"><mark id="pjuwb"><em id="pjuwb"><tt id="pjuwb"></tt></em></mark></em><strong id="pjuwb"></strong><wbr id="pjuwb"></wbr><s id="pjuwb"></s><strong id="pjuwb"></strong><legend id="pjuwb"></legend><nav id="pjuwb"></nav><dl id="pjuwb"><th id="pjuwb"><dl id="pjuwb"></dl></th></dl><noframes id="pjuwb"><ins id="pjuwb"></ins></noframes><font id="pjuwb"></font><strike id="pjuwb"><i id="pjuwb"><style id="pjuwb"><label id="pjuwb"></label></style></i></strike><output id="pjuwb"></output><thead id="pjuwb"><pre id="pjuwb"></pre></thead><source id="pjuwb"></source><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem><pre id="pjuwb"><span id="pjuwb"><pre id="pjuwb"><big id="pjuwb"></big></pre></span></pre><cite id="pjuwb"><fieldset id="pjuwb"><s id="pjuwb"><rt id="pjuwb"></rt></s></fieldset></cite><big id="pjuwb"><progress id="pjuwb"><big id="pjuwb"></big></progress></big><samp id="pjuwb"><delect id="pjuwb"></delect></samp><dl id="pjuwb"></dl><strike id="pjuwb"><nav id="pjuwb"><dl id="pjuwb"><strong id="pjuwb"></strong></dl></nav></strike><tbody id="pjuwb"><b id="pjuwb"><optgroup id="pjuwb"><rp id="pjuwb"></rp></optgroup></b></tbody><em id="pjuwb"></em><xmp id="pjuwb"><blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote></xmp> <i id="pjuwb"><abbr id="pjuwb"><i id="pjuwb"><abbr id="pjuwb"></abbr></i></abbr></i><center id="pjuwb"><acronym id="pjuwb"><center id="pjuwb"></center></acronym></center><pre id="pjuwb"></pre><ul id="pjuwb"><thead id="pjuwb"></thead></ul><blockquote id="pjuwb"><pre id="pjuwb"><sup id="pjuwb"></sup></pre></blockquote><acronym id="pjuwb"></acronym><big id="pjuwb"><s id="pjuwb"></s></big><th id="pjuwb"></th><th id="pjuwb"></th><tbody id="pjuwb"></tbody><thead id="pjuwb"><strike id="pjuwb"></strike></thead><th id="pjuwb"><dl id="pjuwb"><wbr id="pjuwb"></wbr></dl></th><dl id="pjuwb"><strong id="pjuwb"></strong></dl><abbr id="pjuwb"><noframes id="pjuwb"><noscript id="pjuwb"></noscript></noframes></abbr><td id="pjuwb"><ol id="pjuwb"></ol></td><li id="pjuwb"><noscript id="pjuwb"><abbr id="pjuwb"></abbr></noscript></li><small id="pjuwb"><bdo id="pjuwb"><nav id="pjuwb"></nav></bdo></small><style id="pjuwb"></style><optgroup id="pjuwb"><table id="pjuwb"></table></optgroup><center id="pjuwb"><tr id="pjuwb"><dfn id="pjuwb"></dfn></tr></center><th id="pjuwb"></th><u id="pjuwb"></u><tfoot id="pjuwb"><legend id="pjuwb"><i id="pjuwb"></i></legend></tfoot><mark id="pjuwb"></mark><meter id="pjuwb"></meter><nav id="pjuwb"></nav><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><acronym id="pjuwb"><pre id="pjuwb"><acronym id="pjuwb"><ul id="pjuwb"></ul></acronym></pre></acronym><nobr id="pjuwb"></nobr><sub id="pjuwb"><th id="pjuwb"><menuitem id="pjuwb"><wbr id="pjuwb"></wbr></menuitem></th></sub><thead id="pjuwb"><sub id="pjuwb"></sub></thead><ul id="pjuwb"><address id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></address></ul><dfn id="pjuwb"></dfn><pre id="pjuwb"></pre><input id="pjuwb"><cite id="pjuwb"><fieldset id="pjuwb"></fieldset></cite></input><u id="pjuwb"><form id="pjuwb"><u id="pjuwb"></u></form></u><kbd id="pjuwb"><em id="pjuwb"><mark id="pjuwb"></mark></em></kbd><tr id="pjuwb"></tr><del id="pjuwb"><form id="pjuwb"><address id="pjuwb"></address></form></del><tfoot id="pjuwb"><legend id="pjuwb"><ol id="pjuwb"><dl id="pjuwb"></dl></ol></legend></tfoot><menu id="pjuwb"><nobr id="pjuwb"><th id="pjuwb"><nobr id="pjuwb"></nobr></th></nobr></menu><fieldset id="pjuwb"></fieldset><pre id="pjuwb"><blockquote id="pjuwb"><samp id="pjuwb"></samp></blockquote></pre><xmp id="pjuwb"><sup id="pjuwb"><pre id="pjuwb"></pre></sup></xmp><span id="pjuwb"><progress id="pjuwb"></progress></span><font id="pjuwb"></font><var id="pjuwb"><abbr id="pjuwb"></abbr></var><strong id="pjuwb"><label id="pjuwb"><i id="pjuwb"><legend id="pjuwb"></legend></i></label></strong><tr id="pjuwb"><em id="pjuwb"><em id="pjuwb"><output id="pjuwb"></output></em></em></tr><thead id="pjuwb"><strike id="pjuwb"></strike></thead> <acronym id="pjuwb"></acronym><i id="pjuwb"></i><tt id="pjuwb"></tt><rt id="pjuwb"><source id="pjuwb"><rt id="pjuwb"></rt></source></rt><strike id="pjuwb"><acronym id="pjuwb"></acronym></strike><del id="pjuwb"></del><font id="pjuwb"><output id="pjuwb"><ins id="pjuwb"><output id="pjuwb"></output></ins></output></font><kbd id="pjuwb"><tr id="pjuwb"><kbd id="pjuwb"></kbd></tr></kbd><pre id="pjuwb"><sup id="pjuwb"><delect id="pjuwb"><samp id="pjuwb"></samp></delect></sup></pre><samp id="pjuwb"></samp><track id="pjuwb"></track><tr id="pjuwb"></tr><center id="pjuwb"></center><fieldset id="pjuwb"></fieldset><i id="pjuwb"></i><td id="pjuwb"></td><rt id="pjuwb"></rt><object id="pjuwb"></object><pre id="pjuwb"><progress id="pjuwb"><sub id="pjuwb"><thead id="pjuwb"></thead></sub></progress></pre><kbd id="pjuwb"><tr id="pjuwb"><option id="pjuwb"></option></tr></kbd><output id="pjuwb"><ins id="pjuwb"></ins></output><ol id="pjuwb"></ol><source id="pjuwb"></source><strong id="pjuwb"></strong><ruby id="pjuwb"></ruby><sub id="pjuwb"><meter id="pjuwb"><menuitem id="pjuwb"><meter id="pjuwb"></meter></menuitem></meter></sub><pre id="pjuwb"></pre><center id="pjuwb"></center><tr id="pjuwb"><tbody id="pjuwb"><xmp id="pjuwb"><dd id="pjuwb"></dd></xmp></tbody></tr><video id="pjuwb"></video><pre id="pjuwb"></pre><form id="pjuwb"><optgroup id="pjuwb"></optgroup></form><samp id="pjuwb"></samp><kbd id="pjuwb"></kbd><strong id="pjuwb"><option id="pjuwb"></option></strong><object id="pjuwb"></object><abbr id="pjuwb"><noframes id="pjuwb"><abbr id="pjuwb"></abbr></noframes></abbr><ul id="pjuwb"><del id="pjuwb"><button id="pjuwb"><pre id="pjuwb"></pre></button></del></ul><abbr id="pjuwb"></abbr><strong id="pjuwb"><code id="pjuwb"><strong id="pjuwb"></strong></code></strong><option id="pjuwb"></option><optgroup id="pjuwb"><bdo id="pjuwb"><code id="pjuwb"></code></bdo></optgroup><mark id="pjuwb"><em id="pjuwb"><font id="pjuwb"></font></em></mark><acronym id="pjuwb"><code id="pjuwb"></code></acronym><dl id="pjuwb"></dl><em id="pjuwb"></em><object id="pjuwb"><input id="pjuwb"><object id="pjuwb"></object></input></object><output id="pjuwb"><dd id="pjuwb"></dd></output><option id="pjuwb"><button id="pjuwb"><option id="pjuwb"></option></button></option><small id="pjuwb"></small></div> <a href="http://97caoporm.com" target="_blank">亚洲一区二区免费</a>| <a href="http://gyzhoucheng.com" target="_blank">久久久人成影片一区二区三区观看</a>| <a href="http://fuqiba.com" target="_blank">欧美日韩国产综合视频在线</a>| <a href="http://56718ca.com" target="_blank">久久婷婷国产综合国色天香</a>| <a href="http://bgflee.com" target="_blank">久久精品电影</a>| <a href="http://hjk56.com" target="_blank">免费av成人在线</a>| <a href="http://gztcm01.com" target="_blank">欧美国产日韩二区</a>| <a href="http://tareandshare.com" target="_blank">欧美日韩日本网</a>| <a href="http://hhhtalk.com" target="_blank">国产日韩精品视频一区二区三区 </a>| <a href="http://hbshwx.com" target="_blank">最新69国产成人精品视频免费</a>| <a href="http://993934.com" target="_blank">久久蜜桃资源一区二区老牛</a>| <a href="http://www49718.com" target="_blank">美女图片一区二区</a>| <a href="http://yys4.com" target="_blank">亚洲国产毛片完整版</a>| <a href="http://dusenborg.com" target="_blank">日韩视频精品在线观看</a>| <a href="http://4534com.com" target="_blank">亚洲自拍另类</a>| <a href="http://126900.com" target="_blank">久久精品国产欧美激情</a>| <a href="http://www47067.com" target="_blank">欧美成人小视频</a>| <a href="http://cl5555.com" target="_blank">国产精品久久久999</a>| <a href="http://322033.com" target="_blank">国内在线观看一区二区三区</a>| <a href="http://www18bbav.com" target="_blank">精品69视频一区二区三区</a>| <a href="http://yqr55.com" target="_blank">一本久久a久久免费精品不卡</a>| <a href="http://394141.com" target="_blank">中文在线一区</a>| <a href="http://tsjcmm.com" target="_blank">久久偷窥视频</a>| <a href="http://xxtv123.com" target="_blank">99精品国产在热久久婷婷</a>| <a href="http://497988.com" target="_blank">亚洲欧美激情精品一区二区</a>| <a href="http://18av-77.com" target="_blank">久久女同精品一区二区</a>| <a href="http://shalitao.com" target="_blank">欧美日韩视频一区二区三区</a>| <a href="http://ayxchc.com" target="_blank">国内久久视频</a>| <a href="http://wzlingfeng.com" target="_blank">一区二区三区日韩在线观看</a>| <a href="http://ww4477.com" target="_blank">久久成人人人人精品欧</a>| <a href="http://cqrebo.com" target="_blank">亚洲国产91色在线</a>| <a href="http://7234hh.com" target="_blank">亚洲免费视频观看</a>| <a href="http://874805.com" target="_blank">欧美电影在线播放</a>| <a href="http://507139.com" target="_blank">黑人操亚洲美女惩罚</a>| <a href="http://yw1998.com" target="_blank">亚洲香蕉伊综合在人在线视看</a>| <a href="http://tt5125.com" target="_blank">久久久www成人免费无遮挡大片</a>| <a href="http://7628x.com" target="_blank">亚洲电影下载</a>| <a href="http://henhenai1.com" target="_blank">欧美在线观看视频一区二区</a>| <a href="http://www92y.com" target="_blank">欧美三级电影一区</a>| <a href="http://yys4.com" target="_blank">亚洲欧洲日本一区二区三区</a>| <a href="http://psykoptic.com" target="_blank">欧美在线一二三区</a>| <a href="http://787622.com" target="_blank">日韩一级视频免费观看在线</a>| <a href="http://www369cf.com" target="_blank">久久免费高清</a>| <a href="http://dy25777.com" target="_blank">久久这里只有精品视频首页</a>| <a href="http://www979vv.com" target="_blank">亚洲麻豆国产自偷在线</a>| <a href="http://138128.com" target="_blank">欧美一区二区三区在线观看视频</a>| <a href="http://oo853kj.com" target="_blank">亚洲国产精品一区二区第四页av</a>| <a href="http://e789a.com" target="_blank">亚洲欧美一区二区在线观看</a>| <a href="http://www492002.com" target="_blank">欧美日韩一卡二卡</a>| <a href="http://yy6024.com" target="_blank">亚洲日韩欧美视频</a>| <a href="http://0855dyw.com" target="_blank">毛片一区二区三区</a>| <a href="http://807225.com" target="_blank">午夜精品福利视频</a>| <a href="http://jj8518.com" target="_blank">国产精品久久久久久久午夜片</a>| <a href="http://my736.com" target="_blank">亚洲美女精品一区</a>| <a href="http://pron12.com" target="_blank">亚洲国产日本</a>| <a href="http://baigoso.com" target="_blank">久久综合电影</a>| <a href="http://000695.com" target="_blank">在线观看欧美日本</a>| <a href="http://qq5621.com" target="_blank">久久视频这里只有精品</a>| <a href="http://www1126v.com" target="_blank">亚洲欧美怡红院</a>| <a href="http://dfrllaser.com" target="_blank">国产精品一区二区三区四区 </a>| <a href="http://tongrenyaoye.com" target="_blank">欧美在线影院</a>| <a href="http://57sa.com" target="_blank">亚洲一二三区在线观看</a>| <a href="http://457745.com" target="_blank">国产精品av一区二区</a>| <a href="http://rainbowbpm.com" target="_blank">国产精品99久久久久久www</a>| <a href="http://www77711.com" target="_blank">欧美电影在线观看完整版</a>| <a href="http://submro.com" target="_blank">久久精品九九</a>| <a href="http://qhzyxcd.com" target="_blank">精品白丝av</a>| <a href="http://jigu100.com" target="_blank">欧美1区视频</a>| <a href="http://alex-bruni.com" target="_blank">美女视频黄免费的久久</a>| <a href="http://szth186.com" target="_blank">亚洲成人直播</a>| <a href="http://yw3328.com" target="_blank">亚洲第一黄色网</a>| <a href="http://zzchanke.com" target="_blank">玖玖综合伊人</a>| <a href="http://91keshi.com" target="_blank">亚洲精品免费一二三区</a>| <a href="http://0855dyw.com" target="_blank">亚洲精品欧美激情</a>| <a href="http://chufengguanye.com" target="_blank">国产精品sm</a>| <a href="http://xhs1039.com" target="_blank">久久精品中文</a>| <a href="http://888nei.com" target="_blank">老司机成人在线视频</a>| <a href="http://www51avav.com" target="_blank">亚洲黄色天堂</a>| <a href="http://xhamtube.com" target="_blank">亚洲免费成人</a>| <a href="http://www18818.com" target="_blank">国产欧美日本一区二区三区</a>| <a href="http://862323.com" target="_blank">久久精品人人爽</a>| <a href="http://www-5013.com" target="_blank">久久婷婷国产麻豆91天堂</a>| <a href="http://333666333.com" target="_blank">亚洲三级免费</a>| <a href="http://91pero.com" target="_blank">在线一区日本视频</a>| <a href="http://whmingtong.com" target="_blank">国产人久久人人人人爽</a>| <a href="http://taotuango.com" target="_blank">欧美成人dvd在线视频</a>| <a href="http://www-13978.com" target="_blank">欧美国产先锋</a>| <a href="http://66669801.com" target="_blank">欧美在线视频免费播放</a>| <a href="http://11b29.com" target="_blank">免费在线一区二区</a>| <a href="http://szjyf668.com" target="_blank">亚洲综合清纯丝袜自拍</a>| <a href="http://zw1019.com" target="_blank">久久精品99国产精品日本</a>| <a href="http://avjj80.com" target="_blank">亚洲国产你懂的</a>| <a href="http://3333328.com" target="_blank">一本色道久久综合狠狠躁篇的优点</a>| <a href="http://ztsctgs.com" target="_blank">国产精品久久国产三级国电话系列 </a>| <a href="http://jigu100.com" target="_blank">蜜桃av一区二区</a>| <a href="http://91nbs.com" target="_blank">一区二区不卡在线视频 午夜欧美不卡在 </a>| <a href="http://9658888.com" target="_blank">欧美午夜精品久久久</a>| <a href="http://sesese98.com" target="_blank">日韩午夜av电影</a>| <a href="http://989766.com" target="_blank">日韩一级欧洲</a>| <a href="http://bandycup.com" target="_blank">国产一区久久</a>| <a href="http://131397.com" target="_blank">91久久国产综合久久</a>| <a href="http://www23sds.com" target="_blank">国产精品久久一区二区三区</a>| <a href="http://yunpiwang.com" target="_blank">久久永久免费</a>| <a href="http://312012.com" target="_blank">欧美特黄一区</a>| <a href="http://love136.com" target="_blank">美脚丝袜一区二区三区在线观看 </a>| <a href="http://xianconnector.com" target="_blank">久久综合图片</a>| <a href="http://www51avav.com" target="_blank">亚洲一区二区三区久久 </a>| <a href="http://hsxinbao.com" target="_blank">久久精品99国产精品日本</a>| <a href="http://3737520.com" target="_blank">亚洲免费激情</a>| <a href="http://zzmzit.com" target="_blank">久久久精品动漫</a>| <a href="http://340996.com" target="_blank">欧美一区1区三区3区公司</a>| <a href="http://avicpharm.com" target="_blank">欧美 亚欧 日韩视频在线</a>| <a href="http://yd3399.com" target="_blank">亚洲欧美日本精品</a>| <a href="http://173168.com" target="_blank">欧美风情在线</a>| <a href="http://555yye.com" target="_blank">午夜视频在线观看一区二区三区</a>| <a href="http://carboarm.com" target="_blank">免费看成人av</a>| <a href="http://lymzdd.com" target="_blank">久久亚洲精品伦理</a>| <a href="http://www25sds.com" target="_blank">国产精品午夜在线观看</a>| <a href="http://739822.com" target="_blank">亚洲激情电影在线</a>| <a href="http://9927tv.com" target="_blank">激情五月婷婷综合</a>| <a href="http://balqueen.com" target="_blank">亚洲欧美在线观看</a>| <a href="http://szywsj.com" target="_blank">亚洲亚洲精品三区日韩精品在线视频</a>| <a href="http://dddd30.com" target="_blank">性做久久久久久久久</a>| <a href="http://xuanxuan88.com" target="_blank">日韩亚洲精品视频</a>| <a href="http://qq666qq.com" target="_blank">另类春色校园亚洲</a>| <a href="http://9797690.com" target="_blank">久久久av网站</a>| <a href="http://sxhrsmjj.com" target="_blank">国产精品综合av一区二区国产馆</a>| <a href="http://epiegame.com" target="_blank">亚洲电影在线看</a>| <a href="http://konwoosh.com" target="_blank">国产一区二区三区四区hd</a>| <a href="http://sanlans888.com" target="_blank">亚洲免费成人av电影</a>| <a href="http://sdjinchuan.com" target="_blank">亚洲人成人77777线观看</a>| <a href="http://cczm4.com" target="_blank">欧美一激情一区二区三区</a>| <a href="http://06le.com" target="_blank">亚洲精品国精品久久99热</a>| <a href="http://ccc982.com" target="_blank">久久婷婷激情</a>| <a href="http://www34523.com" target="_blank">欧美成人中文字幕在线</a>| <a href="http://wallypanel.com" target="_blank">狠狠色狠色综合曰曰</a>| <a href="http://hnluvlux.com" target="_blank">欧美一乱一性一交一视频</a>| <a href="http://412342.com" target="_blank">亚洲一区二区三区中文字幕</a>| <a href="http://9113i.com" target="_blank">欧美久久久久免费</a>| <a href="http://by3787.com" target="_blank">亚洲成人在线免费</a>| <a href="http://maisuper.com" target="_blank">久久精品一区</a>| <a href="http://9niuw.com" target="_blank">亚洲一区在线免费观看</a>| <a href="http://www149aa.com" target="_blank">日韩亚洲欧美在线观看</a>| <a href="http://www909059.com" target="_blank">麻豆国产精品一区二区三区 </a>| <a href="http://xmt86.com" target="_blank">久久精品免费看</a>| <a href="http://luoliguo.com" target="_blank">国产无遮挡一区二区三区毛片日本</a>| <a href="http://236664.com" target="_blank">亚洲天堂网在线观看</a>| <a href="http://710477.com" target="_blank">亚洲欧美日韩国产一区二区三区 </a>| <a href="http://www-663345.com" target="_blank">在线观看久久av</a>| <a href="http://epiegame.com" target="_blank">老牛嫩草一区二区三区日本</a>| <a href="http://dh03.com" target="_blank">欧美www视频</a>| <a href="http://zhijiasd.com" target="_blank">亚洲日本中文字幕</a>| <a href="http://77777gao.com" target="_blank">欧美人交a欧美精品</a>| <a href="http://3b6f.com" target="_blank">亚洲作爱视频</a>| <a href="http://9924338.com" target="_blank">欧美一区二区视频在线观看2020</a>| <a href="http://xb989.com" target="_blank">国产女精品视频网站免费</a>| <a href="http://sdtricoop.com" target="_blank">欧美亚洲综合另类</a>| <a href="http://cdcpt.com" target="_blank">欧美二区在线看</a>| <a href="http://329374.com" target="_blank">亚洲小视频在线观看</a>| <a href="http://arielteam.com" target="_blank">国产欧美日韩精品a在线观看</a>| <a href="http://0999555.com" target="_blank">欧美伊人久久</a>| <a href="http://92ebook.com" target="_blank">亚洲国产日韩欧美在线99</a>| <a href="http://ggg4444.com" target="_blank">日韩视频中文</a>| <a href="http://elpezomaha.com" target="_blank">国产精品视频</a>| <a href="http://060607.com" target="_blank">久久婷婷久久</a>| <a href="http://qq666qq.com" target="_blank">av成人免费</a>| <a href="http://nebnb89.com" target="_blank">卡通动漫国产精品</a>| <a href="http://aqd072.com" target="_blank">一区二区三区国产精华</a>| <a href="http://www433ad.com" target="_blank">国产伦精品一区二区三区高清</a>| <a href="http://387www.com" target="_blank">午夜一区在线</a>| <a href="http://www-13978.com" target="_blank">欧美国产日韩在线</a>| <a href="http://739822.com" target="_blank">午夜在线精品偷拍</a>| <a href="http://987kt.com" target="_blank">亚洲国产影院</a>| <a href="http://2424ddd.com" target="_blank">国产日本欧美一区二区</a>| <a href="http://176sfsf.com" target="_blank">欧美99在线视频观看</a>| <a href="http://chuangke168.com" target="_blank">日韩一级欧洲</a>| <a href="http://666675com.com" target="_blank">老司机午夜精品视频在线观看</a>| <a href="http://diao66.com" target="_blank">99re6这里只有精品视频在线观看</a>| <a href="http://2220004.com" target="_blank">国产精品久久久久999</a>| <a href="http://xjj733.com" target="_blank">免费观看久久久4p</a>| <a href="http://638179.com" target="_blank">亚洲一区精品在线</a>| <a href="http://060969.com" target="_blank">免费人成网站在线观看欧美高清 </a>| <a href="http://haomscq.com" target="_blank">亚洲欧美日韩视频二区</a>| <a href="http://012488.com" target="_blank">黑人巨大精品欧美一区二区</a>| <a href="http://xiaofan123.com" target="_blank">欧美日韩成人精品</a>| <a href="http://aass123.com" target="_blank">久久久久在线</a>| <a href="http://www-88899.com" target="_blank">亚洲一区国产视频</a>| <a href="http://9931111.com" target="_blank">亚洲狼人综合</a>| <a href="http://www101804.com" target="_blank">欧美激情视频一区二区三区在线播放 </a>| <a href="http://958997.com" target="_blank">亚洲欧美另类国产</a>| <a href="http://739822.com" target="_blank">亚洲人成绝费网站色www</a>| <a href="http://y65o.com" target="_blank">国产午夜精品全部视频在线播放</a>| <a href="http://jm-comic3.com" target="_blank">欧美成人一区二区三区片免费</a>| <a href="http://543199.com" target="_blank">亚洲男人av电影</a>| <a href="http://97sgg.com" target="_blank">亚洲精品一区二区三区不</a>| <a href="http://er65.com" target="_blank">久久亚洲影音av资源网</a>| <a href="http://wanyoulipin.com" target="_blank">亚洲欧美高清</a>| <a href="http://59jf.com" target="_blank">亚洲视频精品在线</a>| <a href="http://www-440447.com" target="_blank">亚洲精品乱码</a>| <a href="http://woshinannan741.com" target="_blank">尤物视频一区二区</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>