鐢ˋTL鍜孧FC鏉ュ垱寤篈ctiveX鎺т欢
鍙戝竷: 2008-6-26 14:29 | 浣滆: admin | 鏌ョ湅: 119娆
绋嬪簭杩愯鏁堟灉鎴浘:

鏈枃鍋囧畾浣犵啛鎮塎FC, ATL, and COM
闅惧害绾у埆 3
--------------------------------------------------------------------------------
鎽樿鐩墠MFC鍜孉TL浠h〃浜嗕袱绉嶆鏋讹紝鍒嗗埆闈㈠悜涓嶅悓绫诲瀷鐨勫熀浜嶹indows鐨勫紑鍙戙侻FC浠h〃浜嗗垱寤虹嫭绔嬬殑Windows搴旂敤鐨勪竴绉嶇畝鍗曘佷竴鑷寸殑鏂规硶锛汚TL鎻愪緵浜嗕竴绉嶆鏋舵潵瀹炵幇鍒涘缓COM瀹㈡埛鏈哄拰鏈嶅姟鍣ㄦ墍蹇呴』鐨勬牱鏉挎枃浠朵唬鐮併傝繖涓ょ妗嗘灦鍦ㄥ畠浠浜庡紑鍙慉ctiveX鐨勭敤閫斾笂浼氬悎浜嗐傛垜浠皢鐪嬬湅杩欎袱绉嶆鏋舵槸濡備綍閫傜敤浜庡垱寤篈ctiveX鎺т欢鐨勨曗曠獊鍑哄叾浼樼己鐐癸紝浜茶嚜缁忓巻鍒涘缓涓涓帶浠剁殑杩囩▼鈥曗曚互渚夸綘鑳藉鍐冲畾浣曟椂浣跨敤涓绉嶆鏋讹紝浣曟椂浣跨敤鍙︿竴绉嶃
--------------------------------------------------------------------------------
濡傛灉浣犲笇鏈涚敤C++鏉ュ啓ActiveX®鎺т欢锛屾湁涓や釜娴佽鐨勬鏋讹紝涓涓槸Microsoft® Foundation Classes (MFC)锛屽彟涓涓槸ATL銆傛垜灏嗘繁鍏ョ殑瑙i噴杩欎袱绉嶆鏋跺寮鍙慉ctiveX鎺т欢鎵鎻愪緵鐨勬敮鎸侊紝甯姪浣犳洿濂界殑鍐冲畾鍝妯″瀷鏈閫傚悎浣犵殑寮鍙戠幆澧冨拰闇姹傘
ActiveX鎺т欢鐨勫畬鍏ㄥ舰鎬
ActiveX鎺т欢鍩轰簬鏋勪欢瀵硅薄妯″瀷COM锛屼娇寰桝ctiveX鎺т欢鎴愪负鍙兘鐨凜OM鐨勫熀鏈師鍒欐槸涓涓璞$殑鎺ュ彛鍜屽叾瀹炵幇鑳藉鑰屼笖搴旇鍒嗗紑瀵瑰緟銆傚彧瑕丆OM鐨勫璞″拰瀹冪殑瀹㈡埛鏂逛唬鐮佸氨鎺ュ彛缁嗚妭杈炬垚浜嗕竴鑷达紝濡備綍瀹炵幇灏变笉鎴愬叾闂銆侫ctiveX鎺т欢灞曠ず浜嗗ぇ閲廇ctiveX鎺т欢鍖呭鍣ㄧ悊瑙g殑鎺ュ彛銆傚洜涓哄鎴锋柟浠g爜鍜屾帶浠惰鍙繖浜涙帴鍙g殑澶栧湪琛ㄧ幇锛屼綘鍙互缂栧啓涓涓狝ctiveX鎺т欢鐒跺悗绠鍗曠殑灏嗗畠鏀惧叆鍖呭鍣ㄤ腑銆傚寘瀹瑰櫒灏嗛氳繃鑹ソ瀹氫箟鐨勬帴鍙f潵椹卞姩鎺т欢锛岃岃繖浜涙帶浠跺皢浠ヨ嚜宸辩殑鏂瑰紡鍋氬嚭鍚堥傜殑鍝嶅簲銆傚湪鏇撮珮鐨勫眰娆′笂锛屼竴涓狝ctiveX鎺т欢鏄疄鐜颁簡鍑犱釜涓昏ActiveX鎶鏈殑涓涓狢OM瀵硅薄锛屽寘鎷氬父鐨勫紩鍏OM鎺ュ彛锛孫LE宓屽叆鍗忚锛岃繛鎺ョ偣鍜屽睘鎬ч〉銆傚湪杈冧綆鐨勭紪绋嬪眰娆′笂锛孉ctiveX鎺т欢鍙槸瀹炵幇浜嗘煇浜涚被鍨嬫帴鍙g殑COM绫汇傚綋涓浜涘鎴锋柟浠g爜鎴愬姛鐨勬煡璇㈠埌杩欎簺鎺ュ彛涔嬩竴鏃讹紝瀹冨氨鐭ラ亾濡備綍浣跨敤涓涓狝ctiveX鎺т欢浜嗐
涓涓狝ctiveX鎺т欢鏆撮湶鐨勬帴鍙d富瑕佸垎涓3绫汇傜涓锛孉ctiveX鎺т欢鏄彲宓屽叆鐨勫璞★紱灏辨槸璇达紝瀹冧滑瀹炵幇浜嗗ぇ澶氭暟鐨凮LE鏂囨。銆乮n-place婵娲诲拰宓屽叆鍗忚銆侫ctiveX鎺т欢瀹炵幇浜嗗涓嬬殑鎺ュ彛锛
IOleObject, IPersistStorage, IDataObject, IOleInPlaceActiveObject, IOleInPlaceObject, IViewObject2鍜孖RunnableObject (杩欎竴涓緢灏戠敤鍒). 绗簩ActiveX鎺т欢閫氬父閮芥敮鎸佸睘鎬ч〉锛岃繖鏍峰鎴锋柟灏卞彲浠ヤ慨鏀规帶浠剁殑灞炴т簡銆傛渶鍚庯紝ActiveX鎺т欢閫氬父閮藉埄鐢–OM鐨勮繛鎺ョ偣鎶鏈紝瀹炵幇浜嗗鎴锋柟鑳藉彂鐜扮殑澶栧嚭鎺ュ彛銆
涓轰簡甯姪姣旇緝ATL鍜孧FC妗嗘灦锛屾垜浠潵鐪嬩竴涓嬪啓鍦ㄦ瘡涓绉嶆鏋朵腑鐨勭浉鍚岀殑鎺т欢銆傛鎺т欢鐩戣鍒涘缓瀹冪殑绾跨▼涓婁紶閫掔殑娑堟伅娴併傛秷鎭祦鎺т欢鏄竴涓緢涓嶉敊鐨勪緥瀛愶紝鍥犱负瀹冩紨绀轰簡涓涓狝ctiveX鎺т欢鎵鏈変富瑕佺殑鏂归潰锛屽寘鎷佸叆鎺ュ彛銆佸鍑烘帴鍙o紝灞炴э紝姘镐箙鎬т互鍙婂睘鎬ч〉銆傝鎴戜滑浠庣爺绌惰繖涓や釜妗嗘灦鎻愪緵鐨勬爣鍑嗙殑COM鏀寔寮濮嬪惂銆
MFC鐨勫熀鏈珻OM鏀寔
Microsoft寤虹珛MFC浣垮緱寮鍙慦indows®搴旂敤绋嬪簭姣斾娇鐢⊿DK瀹规槗澶氫簡銆傛湁浜哅FC锛孧icrosoft鎺ョ潃澧炲姞浜嗗鍗冲瓨妗嗘灦鐨凜OM鏀寔銆傝繖鎰忓懗鐫MFC鐨勫紑鍙戣呭湪澧炲姞瓒婃潵瓒婂鐨勫嚱鏁版椂蹇呴』淇濇寔妗嗘灦鐨勫畬鏁淬傚悓鏃讹紝Visual C++®缂栬瘧鍣ㄩ偅鏃惰繕涓嶆敮鎸佹ā鏉匡紝鍥犳锛屽畠浠笉寰椾笉鍊熷姪闈炴ā鏉跨殑鍏跺畠鎵嬫鏉ュ皢COM鍔熻兘鎺哄叆瀹冧滑鐨勭被涓侻icrosoft閫氳繃鍔犲叆涓浜涜櫄鍑芥暟鍒癈cmdTarget绫诲拰涓浜涘畯涓В鍐充簡杩欎釜闂锛屼娇寰楀湪MFC涓疄鐜癈OM鎺ュ彛鏈変簡鍙兘銆
MFC鍐呴儴鐨凜OM鏀寔浠嶤cmdTarget寮濮嬶紝CcmdTarget绫诲疄鐜颁簡Iunknown鎺ュ彛锛岃繕鍖呮嫭浜嗕竴涓敤浜庡紩鐢ㄨ鏁扮殑鎴愬憳鍙橀噺锛坢_dwRef锛変互鍙婄敤浜庡疄鐜癐Unknown 鐨6涓嚱鏁帮細: InternalAddRef, InternalRelease, InternalQueryInterface, ExternalAddRef, ExternalRelease, 鍜 ExternalQueryInterface.銆俀ueryInterface鐨勪袱涓増鏈曗旳ddRef鍜孯elease鏀寔COM鑱氬悎銆侷nternalAddRef, InternalRelease鍜孖nternalQueryInterface瀹屾垚寮曠敤璁℃暟鍜孮ueryInterface鎿嶄綔锛岃孍xternalAddRef, ExternalRelease鍜 ExternalQueryInterface浠g悊鎺у埗鑱氬悎鐨勫璞★紙濡傛灉姝ゅ璞″弬涓庤仛鍚堢殑璇濓級銆
MFC浣跨敤宓屽鐨勭被澶嶅悎绛栫暐鏉ュ疄鐜癈OM鎺ュ彛銆傚湪MFC涓紝鎯冲疄鐜癈OM 鎺ュ彛鐨勭被鏄粠CcmdTarget涓淳鐢熺殑銆傛瘡涓敱CcmdTarget娲剧敓鍑虹殑绫诲疄鐜扮殑鎺ュ彛寰楀埌瀹冭嚜宸辩殑宓屽绫汇侻FC浣跨敤瀹廈EGIN_INTERFACE_PART鍜孍ND_INTERFACE_PART鏉ヤ骇鐢熷祵濂楃被銆
鏈鍚庯紝MFC瀹炵幇浜嗚〃椹卞姩鐨凲ueryInterface銆侻FC鐨勬帴鍙f槧灏勭殑宸ヤ綔鏈虹悊鍚屽畠鐨勬秷鎭槧灏勫熀鏈浉鍚岋細MFC鐨勬秷鎭槧灏勬妸涓涓猈indows娑堟伅鍜屼竴涓狢++绫讳腑鐨勫嚱鏁扮浉鑱旂郴锛汳FC鐨勬帴鍙f槧灏勬妸涓涓帴鍙g殑GUID鍜屼竴涓〃绀烘鎺ュ彛鐨勭壒瀹氱殑vptr鐨勫湴鍧鐩歌仈绯汇傛瘡涓熀浜嶤cmdTarget鐨勭被瀹炵幇COM鎺ュ彛閫氳繃鏇村鐨勫畯锛欴ECLARE_INTERFACE_MAP, BEGIN_INTERFACE_MAP, INTERFACE_PART,鍜 END_INTERFACE_MAP鏉ュ鍔犱竴涓帴鍙f槧灏勩
涓轰簡鐞嗚В杩欎簺瀹忓湪瀹為檯涓槸浠涔堟牱瀛愮殑锛岃鐪嬪浘1锛屽畠璇存槑浜嗗疄鐜癆ctiveX鎺т欢锛孋OleControl 鐨凪FC绫汇傚綋浣犵粏璇讳唬鐮佹椂锛屾敞鎰廋oleControl甯︽湁澶瑰湪涓瀵笲EGIN_INTERFACE_PART 鍜 END_INTERFACE_PART瀹忎箣闂寸殑姣忎釜鎺ュ彛鐨勭鍚嶏紝杩樿娉ㄦ剰ColeControl鐨勬帴鍙f槧灏勮〃鏈22涓潯鐩
闄や簡瀹炵幇浜咺unknown鎺ュ彛锛孧FC杩樺寘鎷琁classFactory鐨勪竴涓爣鍑嗗疄鐜般傚啀涓娆★紝MFC閫氳繃鑻ュ共瀹忔彁渚涗簡姝ゆ敮鎸併侻FC鏈変袱涓畯鏉ユ彁渚涚被瀵硅薄锛欴ECLARE_OLECREATE_EX 鍜 IMPLEMENT_OLECREATE_EX.銆傚湪涓涓熀浜嶤cmdTarget鐨勭被涓娇鐢ㄨ繖浜涘畯澧炲姞涓涓狢oleObjectFactory绫诲瀷鐨勯潤鎬佹垚鍛樺埌璇ョ被涓傚鏋滀綘鐪嬩竴涓婣FXDISP.H涓 ColeObjectFactory鐨勫畾涔夛紝浣犲皢浼氱湅鍒扮敤鍦–OleObjectFactory 涓殑MFC鐨勫祵濂楃被瀹忎负瀹炵幇IClassFactory2瀹氫箟浜嗕竴涓祵濂楃被銆侷ClassFactory::CreateInstance鐨凪FC鐗堟湰浣跨敤MFC鐨勫姩鎬佸垱寤烘満鍒讹紙DECLARE_DYNCREATE 鍜 IMPLEMENT_DYNCREATE瀹忔墦寮姝ゅ姛鑳斤級鏉ュ疄渚嬪寲COM绫伙紝鍥犳涔板叆MFC鐨凜OM鏀寔鍚屾牱鎰忓懗鐫涔板叆瀹冪殑鍔ㄦ佸垱寤烘満鍒躲
鏈鍚庡嚑涓敱MFC鎻愪緵鐨勫湪ActiveX鎺т欢鍐呯殑鍩烘湰COM鏀寔鏄Idispatch鐨勬敮鎸併傜敤Visual C++ 鍜 MFC瀹炵幇涓涓垎鍙戞帴鍙e嚑涔庢槸寰笉瓒抽亾鐨勩傚湪MFC涓疄鐜颁竴涓垎鍙戞帴鍙o紝鍙渶瑕佷娇鐢–lassWizard灏卞彲浠ヤ簡銆侰lassWizard涓殑鑷姩鍒涘缓鏉挎湁涓涓寜閽敤浜庢坊鍔犲睘鎬э紝鍙︿竴涓敤浜庢坊鍔犳柟娉曘傚湪MFC涓紝Idispatch鏀寔鏉ヨ嚜CcmdTarget绫汇侷Dispatch 鐨凪FC鐨勫疄闄呭疄鐜板湪涓涓彨鍋欳OleDispatchImpl 鐨勭被涓紝ColeDispatchImpl娲剧敓鑷狪dispatch锛屽疄鐜颁簡鎵鏈4涓狪dispatch鍑芥暟锛欸etTypeInfoCount, GetTypeInfo, GetIDsOfNames, 鍜 Invoke.銆傜敱CcmdTarget娲剧敓鐨勭被閫氳繃璋冪敤EnableAutomation锛屽皢IDispatch vptr鍔犲叆鍒板畠浠殑鎺ュ彛鏄犲皠涓傚綋瀹㈡埛鍦ㄥ熀浜嶮FC鐨凙ctiveX鎺т欢涓婅皟鐢↖Dispatch 鐨凲ueryInterface鏃讹紝CcmdTarget浜ゅ嚭閾炬帴鍦–oleDispatchImpl涓婄殑vptr銆
姣忔浣犱娇鐢–lassWizard灏嗕竴涓嚜鍔ㄥ睘鎬ф垨鑰呮柟娉曞姞鍏ュ埌涓涓被涓椂锛屼綘鍚屾椂涔熷湪璇ョ被鐨勫垎鍙戞槧灏勮〃涓姞鍏ヤ簡涓椤广備竴涓垎鍙戞槧灏勮〃鏄竴涓皢DISPIDs锛堢敤鏉ヨ皟鐢ㄥ垎鍙戞垚鍛樼殑绗﹀彿锛夊拰瀹冧滑鐨勪緵浜鸿鐨勫悕瀛椾互鍙婂拰瀹為檯瀹屾垚杩欎釜宸ヤ綔鐨勬煇浜汣++浠g爜鑱旂郴璧锋潵鐨勭畝鍗曠殑琛ㄦ牸銆侰oleDispatchImpl鐨勮皟鐢ㄤ互鍙奊etIDsOfNames鍑芥暟閫氳繃鍦ㄧ被鐨勫垎鍙戞槧灏勮〃涓煡鎵惧垎鍙戞垚鍛樺苟鍒嗗彂DISPID鐩稿搴旂殑鍑芥暟鏉ュ伐浣溿侻FC鑳戒负鏌愪簺鍩轰簬COM鐨勯珮绾ф妧鏈OLE鏂囨。銆丱LE鎷栨斁鍜岃嚜鍔ㄦ搷浣滄彁渚涢潪甯稿ソ鐨勬敮鎸侊紝鐒惰岋紝濡傛灉浣犳兂鏇存敼妗嗘灦鈥曗曟瘮濡傝锛屼綘鎯冲皢鍒嗗彂鎺ュ彛缂栫▼鍙屾帴鍙g殑鈥曗曚綘灏卞緱澶у姩鎵嬭剼浜嗐傚彟涓鏂归潰锛孉TL鏇村姞鏄疌OM涓績鐨勩
ATL鐨勫熀鏈殑COM鏀寔
ATL鐨勭洰鏍囨槸浣垮紑鍙戣呬笉蹇呴噸鍐橧Unknown, IDispatch, IclassFactory鍜屽叾瀹冪殑鍒嗘敮浠ュ皢甯歌鐨凞LL鍜孍XE鍙樻垚鍩轰簬COM鐨凞LL鍜孍XE銆備粠杩欎釜瑙掑害璁诧紝ATL鏄竴涓瘮MFC绮剧畝鐨勫鐨勬鏋讹紝瀹冭璁″拰鐢熸垚鏃跺氨鑰冭檻浜咰OM鏀寔銆傚畠浣跨敤鍩轰簬妯℃澘鐨勬柟娉曪紝閫氳繃缁ф壙ATL鎻愪緵鐨勬ā鏉匡紝寮鍙戣呭彲浠ュ姞鍏ュ悇绉岰OM鍔熻兘鐗囨柇銆
ATL鐨勫師濮婥OM鏀寔鏄粠瀵笽unknown鐨勬敮鎸佸紑濮嬬殑銆侫TL鐨処unknown瀹炵幇鍒嗘垚涓や釜閮ㄥ垎锛欳comObjectRootEx绫伙紝鐢ㄦ潵澶勭悊Iunknown閮ㄥ垎鐨勫紩鐢ㄨ鏁帮紱CcomObjectRootBase绫伙紝鐢ㄦ潵澶勭悊QueryInterface銆
CcomObjectRootEx鏄竴涓熀浜庢ā鏉跨殑绫伙紝灏嗙嚎鎬фā鍨嬩綔涓哄叾鍞竴鍙傛暟銆傝繖鏄竴涓湡姝f湁瓒g殑璇存槑ATL鎬庢牱浣跨敤妯℃澘灏嗙畻娉曚綔涓烘ā鏉垮弬鏁颁紶閫掔殑渚嬪瓙銆侫TL鏈変袱涓鐞嗗紩鐢ㄨ鏁扮殑绫伙紝鐢ㄤ簬澶勭悊涓嶅悓鐨勭嚎鎬фā鍨嬶細 CComSingleThreadModel 鍜 CcomMultiThreadModel銆傝繖浜涚被姣忎釜閮芥湁涓涓掑鍜屼竴涓掑噺鍑芥暟銆傚畠浠箣闂寸殑鍖哄埆鏄疌comSingleThreadModel鐢ㄦ爣鍑咰++鎿嶄綔绗︼紙++鍜屸曗曪級瀹炵幇閫掑鍜岄掑噺锛涜孋comMultiThreadModel浣跨敤绾跨▼瀹夊叏鐨処nterlockedIncrement 鍜 InterlockedDecrement鍑芥暟鏉ュ疄鐜拌繖涓や釜鍔熻兘銆傛牴鎹敤鏉ュ疄渚嬪寲CcomObjectRootEx鐨勬ā鏉垮弬鏁帮紝瀹冭兘姝g‘鐨勮繍琛岀粰瀹氱殑缁勪欢绫诲瀷銆備綘寰堝揩灏嗕細鐪嬪埌瀹冪殑鐢ㄦ硶鐨勪竴涓緥瀛愩傝薄MFC锛孉TL浣跨敤鍩轰簬琛ㄧ殑鏌ユ壘鏈哄埗瀹炵幇QueryInterface.銆侰ComObjectRootBase 閫氳繃涓涓帴鍙f槧灏勫鐞嗙被鐨凲ueryInterface鍑芥暟銆侭EGIN_ COM_MAP 鍜 END_COM_MAP 瀹忓畾涔変簡涓涓帴鍙f槧灏勭殑寮濮嬪拰缁撴潫銆傜劧鑰岋紝涓嶅儚MFC锛孉TL鎻愪緵浜17绉嶉斿緞鏉ョ粍鎴愪竴涓帴鍙f槧灏勶紝渚嬪浣跨敤浠嶢TL鐨勫熀浜庢ā鏉跨殑鎺ュ彛瀹炵幇绫诲IOleObjectImpl 鏉ョ殑vptrs銆傝繖鍖呮嫭浜嗛偅浜涗粠tear-off 鐨勭被鎴栬呯敱鑱氬悎鎻愪緵鐨勭被鏉ョ殑vptrs銆
鍦ˋTL閲岋紝C++绫婚氳繃缁ф壙CcomObjectRootEx锛屾寚瀹氬畠浠兂鐢ㄧ殑缁勪欢妯″瀷锛堣浣忥紝MFC鐨処unknown鏀寔鏄唴寤哄湪CcmdTarget涓殑锛夊彉鎴愪簡COM绫汇
ATL鐨勭被瀵硅薄锛堜互鍙奍ClassFactory锛夋敮鎸佷篃鏉ヨ嚜妯℃澘锛岃孧FC鐨勭被瀵硅薄鏀寔閫氳繃ColeObjectFactory鍜屼竴浜涘畯鑰屾湁鏁堛侫TL鐨勭被瀵硅薄鏀寔鏉ヨ嚜CComCoClass/CcomClassFactory绫诲鏃忓拰CcomCreator绫诲鏃忋侰comCoClass鍖呭惈浜嗙被鐨凣UID锛屽畾涔変簡COM绫荤殑閿欒澶勭悊璁炬柦銆侰comCreator绫绘彁渚涗簡CreateInstance鐨勫疄鐜帮紝渚汣comClassFactory浣跨敤銆傚浜嶮FC锛屼綘鍙互閫氳繃鑻ュ共瀹忥紝浣挎墍鏈夎繖绉嶆敮鎸佹湁鏁堛侫TL鍖呮嫭 DECLARE_CLASS_FACTORY, DECLARE_CLASS_ FACTORY2, DECLARE_CLASS_FACTORY_AUTO_THREAD, 浠ュ強 DECLARE_CLASS_FACTORY_SINGLETON绛夊畯鐢ㄦ潵浣垮悇绉嶅叿浣撶殑绫诲伐鍘傛敮鎸佹湁鏁堛
鏈鍚庯紝ATL 瀵笽Dispatch鐨勬敮鎸佽繕鏉ヨ嚜妯℃澘绫伙紝鈥曗曞叾鍚嶅瓧鏄疘DispatchImpl.銆傛瘮璧稭FC鐨処dispatch鏀寔鏉ワ紝ATL瀵笽dispatch鐨勬敮鎸佹洿鍔犳槸COM涓績鐨勩侻FC浣跨敤浜嗕竴绉峢and-rolled 鐨処Dispatch瀹炵幇锛岃孉TL浣跨敤鏇村姞鏍囧噯鐨勬柟娉曟潵鍔犺浇涓涓帴鍙g殑绫诲瀷淇℃伅骞朵唬琛ㄦ爣鍑嗙殑绫诲瀷搴撶紪璇戝櫒銆
鍥2鏄剧ず浜嗕竴涓爣鍑嗙殑鍩轰簬ATL鐨勬帶浠躲傛渶鍊煎緱娉ㄦ剰鐨勪竴鐐规槸MFC鍜孉TL鍚勬槸鎬庢牱寮曞叆瀹炵幇涓涓帶浠舵墍闇鐨勫繀瑕佺殑鍚勭鎺ュ彛鐨勩侻FC瀵规爣鍑嗘帶浠舵帴鍙g殑鏀寔鏄唴寤哄湪ColeControl绫讳腑鐨勩備綘浠嶤oleControl涓淳鐢熷嚭浣犵殑鎺т欢骞朵笖涓娆℃х户鎵挎墍鏈夌殑鍑芥暟璋冪敤銆傛敞鎰廇TL閫氳繃妯℃澘缁ф壙浠ラ浂纰庣殑鏂瑰紡閫愪釜寮曞叆姣忎釜鍔熻兘鐗囨柇銆傝繖鏄竴涓潪甯搁噸瑕佺殑宸紓锛屽洜涓鸿繖鎰忓懗鐫鐢ˋTL浣犲彲浠ュ拷鐣ヤ竴浜涙帴鍙e疄鐜版ā鏉匡紙渚嬪锛屼娇浣犵殑鎺т欢鏇翠负绮剧畝锛夊墺鎺変笉甯屾湜鐨勫姛鑳姐傚MFC锛屼綘涓嶈兘瀹屾垚鍚屾牱鐨勫姩浣溾曗曚笉绠′綘鎯充笉鎯筹紝浣犲皢鑾峰緱鎵鏈夋帴鍙c
鍏充簬渚嬪瓙搴旂敤
杩欓噷鎴戝皢浣跨敤鐨勪緥瀛愭槸涓涓氳繃涓涓垎鏀繃绋嬬洃鎺ф秷鎭祦鐨凙ctiveX鎺т欢锛屽畠瀹炴椂鐨勬樉绀烘秷鎭祦鍥俱傝繖涓や釜鎺т欢瀹為檯涓婃湁鐫鐩稿悓鐨勫姛鑳姐傚畠浠兘鎶婂浘琛ㄦ彁浜ゅ埌灞忓箷銆傚畠浠兘甯︽祦鍏ユ帴鍙d互渚垮寘瀹瑰櫒鑳介氱煡鎺т欢寮濮嬪拰鍋滄璇ュ浘琛ㄣ傚畠浠兘鏀寔鍥捐〃绾跨殑棰滆壊鍜屾秷鎭棿闅旈暱搴︿綔涓哄睘鎬ц屽彲浠ユ案涔呭瓨鍦ㄣ傛渶鍚庯紝瀹冧滑閮芥敮鎸佺己鐪佷簨浠堕泦锛屽皢鍏充簬鍦ㄤ竴涓壒瀹氭椂闂存閲屽鐞嗙殑娑堟伅鐨勬暟閲忛氱煡鍖呭鍣ㄣ備笂鍥炬樉绀轰簡杩欎袱涓帶浠躲
鐢∕FC寮鍙戜竴涓帶浠
鐢∕FC寮鍙戜竴涓狝ctiveX鎺т欢娑夊強鍒板湪Visual Studio®.涓娇鐢ˋctiveX ControlWizard銆備负浜嗗紑濮嬩竴涓柊鐨勬帶浠讹紝浠嶧ile鑿滃崟涓夋嫨New锛岀劧鍚庝粠宸ョ▼绫诲瀷鍒楄〃涓夋嫨MFC ActiveX鎺т欢Wizard銆傞鍏堬紝ControlWizard瑕佹眰浣犲喅瀹氬湪DLL涓寘鎷灏戜釜鎺т欢銆傛帴鐫浣犲氨鍙互閫夋嫨浣犳墦绠楁庢牱瀹炵幇浣犵殑鎺т欢銆
ControlWizard鎻愪緵鐨勭涓鎵归夐」鎬讳綋涓婇傜敤浜庢帶浠剁殑DLL銆傚畠浠寘鎷簡璁稿彲鏀寔銆佹簮鐮佹敞閲婂拰鍦ㄧ嚎甯姪銆傞夋嫨璁稿彲浣垮緱ControlWizard浣跨敤BEGIN_OLEFACTORY鍜孍ND_OLEFACTORY (鑰岄潪DECLARE__OLECREATE).銆侭EGIN_OLEFACTORY 鍜 END_OLEFACTORY瀹忚鐩栦簡VerifyUserLicense鍜孏etLicenseKey锛屽洜鑰屼负浣犵殑鎺т欢鎻愪緵璁稿彲鏀寔銆傝姹侰ontrolWizard鍖呮嫭娉ㄩ噴灏嗘墍鏈夌殑TODO娉ㄩ噴鍔犲叆浠g爜涓傛渶鍚庯紝璇锋眰ControlWizard鍖呮嫭鍦ㄧ嚎甯姪灏嗕负DLL鍒涘缓鏍锋澘HELP鏂囦欢婧愪唬鐮併
涓鏃︿綘閫氳繃浜嗙涓涓璇濇锛孋ontrolWizard灏辨樉绀轰竴涓璇濇鐢ㄦ潵閰嶇疆DLL涓殑鎺т欢銆傝繖浜涢厤缃夋嫨鍖呮嫭浣挎帶浠跺湪杩愯鏃跺彲瑙佺殑閫夐」锛屼娇寰楁帶浠跺湪鍙鏃舵縺娲荤殑閫夐」锛屼娇寰楀璞″彲浠ヨ鎻掑叆鐨勯夐」锛岀粰鎺т欢涓涓狝bout妗嗙殑閫夐」锛屼娇寰楁帶浠跺儚涓涓畝鍗曠殑妗嗘灦鎺т欢閭f牱琛屼负鐨勯夐」銆傚浘4瑙i噴浜嗕笉鍚岀殑閫夐」鏄浣曞奖鍝岰ontrolWizard鐢熸垚鐨勪唬鐮佺殑銆
ControlWizard杩樻湁涓涓皢鎺т欢瀹炵幇涓轰竴涓爣鍑嗙殑Windows鎺т欢鐨勯夐」锛屽氨鍍忎竴涓紪杈戞鎴栬呬竴涓寜閽傝繖鏄竴涓湁瓒g殑閫夐」銆備緥濡傦紝濡傛灉浣犻夋嫨鎸夌収涓涓寜閽皢浣犵殑鎺т欢鍒嗘垚瀛愮被锛屾帶浠剁殑绐楀彛瀹為檯涓婃槸涓涓寜閽傛鏃讹紝PreCreateWindow鎷︽埅鎺т欢鐨勭獥鍙e垱寤猴紝褰撳垱寤烘帶浠剁殑绐楀彛鏃朵娇鐢˙UTTON绐楀彛绫汇侰ontrolWizard浣夸綘鍙互閫夋嫨涓浜涢珮绾х殑閫夐」锛屽寘鎷棤绐楀彛鐨勬縺娲伙紝浣夸綘鐨勬帶浠跺叿鏈夊畬鏁寸殑璁惧涓婁笅鏂囷紝瀹炵幇鏃犳姈鍔ㄧ殑婵娲伙紝浣夸綘鐨勬帶浠跺湪闈炴縺娲荤姸鎬佷篃鎺ュ彈榧犳爣娑堟伅锛屼娇浣犵殑鎺т欢寮傛鐨勫姞杞借嚜宸辩殑灞炴с傝繖閲屾湁涓涓瘡涓夐」濡備綍褰卞搷ControlWizard鐢熸垚鐨勪唬鐮佺殑绾茶銆
鏃犵獥鍙g殑婵娲绘閫夐」瑕嗙洊COleControl::GetControlFlags锛屽皢windowlessActivate鏍囧織闄勫姞鍒版帶浠舵爣蹇椾腑銆備竴鏃︿娇姝ら夐」鏈夋晥锛屽寘瀹瑰櫒灏卞皢杈撳叆娑堟伅閫佷氦鍒版帶浠剁殑IoleInPlaceObjectWindowless鎺ュ彛銆傛鎺ュ彛ColeControl鐨勫疄鐜伴氳繃浣犵殑娑堟伅鏄犲皠鍒嗗彂娑堟伅銆備綘灏辫兘閫氳繃绠鍗曠殑娣诲姞鐩稿簲鐨勫叆鍙e埌娑堟伅鏄犲皠琛紝鍍忓鐞嗕竴鑸瑆indows娑堟伅閭f牱澶勭悊娑堟伅浜嗐
鏃犵渷鐣ョ殑璁惧涓婁笅鏂囬夋嫨浜嗘閫夐」瑕嗙洊COleControl::GetControlFlags锛屽叧闂璫lipPaintDC浣嶏紝浠庤屽湪ColeControl鐨 OnPaint鍑芥暟涓幓鎺変簡IntersectClipRect璋冪敤銆傚鏋滀綘纭畾浣犵殑鎺т欢骞朵笉闇瑕佸湪瀹㈡埛鍖哄閮ㄧ粯鍥撅紝杩欎釜閫夐」灏辨湁鐢ㄤ簡锛屽洜涓轰娇瀵笽ntersectClipRect鐨勮皟鐢ㄥけ鏁堝悗锛屾湁涓涓槑鏄剧殑閫熷害鐨勬彁楂樸
鏃犳姈鍔ㄧ殑婵娲婚夋嫨姝ら夐」瑕嗙洊COleControl::GetControlFlags锛屽皢缂虹渷鎺т欢鏍囧織涓巒oFlickerActivate閫愪綅鐩告垨銆傛帶浠跺湪婵娲荤殑鏃跺欐鏌ユ鏍囧織浠ラ樆姝㈡帶浠跺湪婵娲诲拰闈炴縺娲荤姸鎬佽浆鎹㈡椂琚噸鐢汇傚鏋滀綘鐨勬帶浠跺湪婵娲诲拰闈炴縺娲荤姸鎬佸瑙備竴鏍凤紝閭d箞杩欎釜閫夐」灏辨槸鏈夌敤鐨勩
闈炴縺娲绘椂鐨勯紶鏍囨寚閽堥氱煡杩欎釜閫夐」瑕嗙洊COleControl::GetControlFlags锛岄檮鍔犱簡pointerInactive浣嶃侷pointerInactive鎺ュ彛浣垮緱涓涓璞″ぇ澶氭暟鏃堕棿淇濇寔闈炴縺娲伙紝鐒惰屼粛鐒跺弬鍔犱笌榧犳爣鐨勬煇浜涙搷浣滅殑浜や簰锛屼緥濡傛嫋鏀俱
浼樺寲鐨勭粯鍥剧爜 杩欎釜閫夐」瑕嗙洊COleControl::GetControlFlags锛屾墦寮canOptimizeDraw浣嶏紝鍏锋湁浼樺寲缁樺浘浠g爜鐨勬帶浠舵鏌ヨ繖涓爣蹇楋紙閫氳繃COleControl鈥欑殑IsOptimizedDraw鍑芥暟锛夋潵纭畾鎺т欢鏄惁闇瑕佸湪瀹屾垚缁樼敾鍚庡皢鏃х殑瀵硅薄澶嶅師鍥炶澶囦笂涓嬫枃銆
寮傛鍔犺浇灞炴ф閫夐」灏唖tock ReadyState灞炴у拰stock ReadyStateChange浜嬩欢鍔犲叆鍒版帶浠朵腑鍘汇傝繖灏嗕娇寰楁帶浠跺紓姝ョ殑鍔犺浇鍏跺睘鎬с備緥濡傦紝涓涓姞杞藉ぇ閲忕殑鏁版嵁浣滀负鍏跺睘鎬т箣涓鐨勬帶浠朵細闇瑕佸緢闀跨殑鏃堕棿鏉ュ姞杞斤紝鑰岄攣浣忎簡鎺т欢銆傝繖涓猻tock灞炴у拰浜嬩欢浣垮緱姝ゆ帶浠剁珛鍒诲紑濮嬪姞杞借繃绋嬨傚寘瀹瑰櫒浣跨敤姝や簨浠跺拰灞炴у垽鏂帶浠朵綍鏃跺畬鎴愬姞杞姐
褰揅ontrolWizard瀹屾垚杩欎簺浜嬫儏鍚庯紝浣犲氨寰楀埌浜嗙紪璇戝埌涓涓寘鍚鎺т欢鐨凞LL鐨勬簮浠g爜锛堟墿灞曞悕鏄.OLX锛夈傜敱wizard浜х敓鐨勬簮浠g爜鍖呮嫭涓涓粠ColeControlModule(瀹冩槸浠嶤winApp涓淳鐢熺殑)涓淳鐢熺殑绫汇傝繖涓被鍖呭惈鏁翠釜鎺т欢妯″潡鐨勫垵濮嬪寲浠g爜銆傛帴鐫锛寃izard涓哄熀浜嶤oleControl鐨勮〃绀烘瘡涓帶浠剁殑绫荤敓鎴愭簮浠g爜銆傛渶鍚庯紝wizard鐢熸垚涓浜汷DL浠g爜鐢ㄦ潵寤虹珛绫诲瀷淇℃伅銆
涓鏃izard浜х敓浜嗘帶浠禗LL锛屼綘灏遍潰涓村畬鍠勮繖涓帶浠剁殑浠诲姟浜嗐傝繖鎰忓懗鐫娣诲姞娓叉煋浠g爜锛屽紑鍙戜竴涓紩鍏ユ帴鍙o紙鏂规硶鍜屽睘鎬э級锛宺igging up灞炴ч〉锛屽睍绀烘煇浜涗簨浠躲備絾鏄紝鍦ㄦ垜鍚戜綘璇存槑鎵鏈夎繖浜涢兘鏄浣曞伐浣滀箣鍓嶏紝鎴戜滑鍏堟潵鐪嬩竴涓嬩娇鐢ˋTL鍒涘缓涓涓帶浠堕兘闇瑕佷粈涔堛
鐢ˋTL寮鍙戜竴涓帶浠
鏈変簡鍩轰簬MFC鐨勬帶浠讹紝浣犲氨鍙互鐢ˋTL COM App Wizard寰楀埌涓涓紑鍙戝熀浜嶢TL鐨勬帶浠剁殑瑙﹀彂鍣ㄣ備娇鐢ˋTL鏉ュ垱寤烘帶浠跺彲浠ュ垎涓轰袱姝ャ傝櫧鐒禡FC鐨凜ontrol Wizard瑕佹眰浣犻鍏堢‘瀹氫綘甯屾湜鍦―LL涓寘鍚灏戜釜鎺т欢锛孉TL COM Wizard绠鍗曠殑鍒涘缓DLL鈥曗曚綘鍙互浠ュ悗浣跨敤ATL瀵硅薄閫夐」浠嶪nsert鑿滃崟娣诲姞鎺т欢銆傚綋鍒涘缓涓涓柊鐨勫熀浜嶢TL鐨凞LL鏃讹紝浣犲彲浠ラ夋嫨娣风敤MFC鏀寔銆備綘杩樺彲浠ラ夋嫨鍦ㄦ帶浠剁殑DLL涓悎骞朵换浣昿roxy/stub浠g爜銆傝繖浣垮緱濡傛灉鏈変汉甯屾湜杩滅▼鎺у埗浣犵殑鎺т欢瀹炵幇鐨勪唬鐮侊紝浣犲彧瑕佸彂甯冧竴涓枃浠躲
涓鏃︾敓鎴愪簡鍩轰簬ATL鐨凞LL锛屼綘灏卞彲浠ュ紑濮嬫坊鍔燙OM绫讳簡銆侷nsert New ATL Object鑿滃崟鏉′娇寰楄繖椤瑰伐浣滃彉寰楀崄鍒嗗鏄撱傞夋嫨姝よ彍鍗曢」鏄剧ず涓涓敤鏉ュ垱寤轰换浣曚竴涓狢OM绫荤殑瀵硅瘽妗嗭紝鍖呮嫭鏃犳牸寮忕殑COM瀵硅薄锛孉ctiveX鎺т欢浠ュ強Microsoft浜嬪姟鏈嶅姟鍣ㄧ粍浠讹紙Windows NT Server鐨勪竴閮ㄥ垎锛夈
褰撴坊鍔犲熀浜嶢TL鐨勬帶浠跺埌浣犵殑宸ョ▼鐨勬椂鍊欙紝ATL Object Wizard姣擬FC Object Wizard鎻愪緵浜嗘洿澶ц寖鍥寸殑閫夐」銆傚浜庢柊鎵嬫潵璇达紝ATL浣垮緱浣犲彲浠ラ夋嫨浣跨敤浠讳綍鐜版湁鐨勭嚎鎬фā鍨嬪疄鐜颁綘鐨勬帶浠躲備綘鍙互灏嗕綘鐨勭被鏍囪涓烘垨鑰呭崟绾跨▼鎴栬呭崟鍏冪嚎绋嬬殑銆侫TL Object Wizard闄愬埗浣犲垱寤轰竴涓嚜鐢辩殑鎴栬呮贩鍚堢嚎绋嬬殑鎺т欢锛屽洜涓烘帶浠堕氬父鏄潰鍚慤I鐨勩
濡傛灉浣犲垱寤轰簡涓涓崟绾跨▼鐨勬帶浠讹紝涓涓寘瀹圭殑鎺т欢鐨勫鎴峰皢鎬绘槸灏嗗畠鍔犺浇鍒颁富銆佸崟绾跨▼鐨勫崟鍏冿紙STA锛変腑銆傜粨鏋滐紝鍙湁鍦ㄥ鎴疯繘绋嬬┖闂磋繍琛岀殑鍗曚富绾跨▼鎵嶄細鎺ヨЕ鍒颁綘鐨勫璞★紝杩欐牱灏卞厤闄や簡浣犱繚鎶や綘鐨勬帶浠剁姸鎬佷笉鍙楀苟鍙戣闂共鎵扮殑璐d换銆傚彟澶栵紝鍥犱负浣犵殑瀵硅薄鐨勬墍鏈夊疄渚嬪皢鍙細琚竴涓嚎绋嬫帴瑙︼紝浣犲皢涓嶅繀鎷呭績DLL涓殑鍏ㄥ眬鏁版嵁銆傚鏋滀綘鐨勬帶浠舵槸鍗曞厓绾跨▼鐨勶紝浣犺繕鍏嶉櫎浜嗕繚鎶や綘鐨勬帶浠剁殑鍐呴儴鐘舵佺殑澶ч儴鍒嗚礋鎷呫傜劧鑰岋紝浣犱粛鐒朵笉寰椾笉淇濇姢DLL涓殑鍏ㄥ眬鏁版嵁銆備负浠涔堝憿锛熼鍏堬紝璁炬兂浣犵殑鎺т欢鏄敱瀹㈡埛鐨勫崟绾跨▼鍒涘缓鐨勩傜幇鍦ㄥ亣瀹氬鎴疯瘯鍥惧垱寤鸿鎺т欢鐨勫彟涓浠芥嫹璐濃曗曚絾鏄槸浠庝竴涓簯鍚戝湪褰撳墠杩涚▼鐨勫绾跨▼鐨勫崟鍏冧腑銆傞氳繃灏嗕綘鐨勫璞℃爣璁颁负鍗曞厓绾跨▼鐨勶紝COM琚憡鐭ヤ綘甯屾湜浣犵殑鎺т欢淇濇姢鍏嶉伃骞跺彂璁块棶銆侰OM鍦ㄥ畠鍔犺浇鏃朵负浣犵殑鎺т欢鍒涘缓涓涓柊鐨凷TA銆傜幇鍦ㄥ綋绾跨▼璋冪敤鍒颁綘鐨勫璞℃椂锛屽畠浠彧鑳介氳繃鍗曞厓杈圭晫鏉ヨ闂畠锛岃繙绋嬪眰灏嗗悓姝ュ姝ゅ璞$殑璋冪敤銆傜劧鑰岋紝褰撴煇涓帶浠剁殑鐘舵佽淇濇姢涓嶈骞跺彂璁块棶锛屼綔涓哄湪涓涓猄TA涓殑鍓骇鍝侊紝鐢辨帶浠剁殑瀹炰緥鎵鍏变韩鐨勬暟鎹紙璞″湪DLL涓殑鍏ㄥ眬鏁版嵁涓鏍凤級鏄剢寮辩殑銆傝繖鏄洜涓轰綘鐨勫叏灞DLL鏁版嵁锛堝悓鏃朵负鍑犱釜瀵硅薄鏈嶅姟锛屽垎鍒繍琛屽湪鐙珛鐨勭嚎绋嬩腑锛変細琚偅浜涘绾跨▼鍚屾椂鎺ヨЕ鍒般
铏界劧鍩轰簬MFC鐨凜OM绫绘绘槸鍙仛鍚堢殑锛堝唴缃簡瀵瑰畠鐨勬敮鎸侊級锛孉TL ObjectWizard浣垮緱浣犲彲浠ユ寚瀹氫綘鐨勬帶浠舵敮鎸佽仛鍚堬紝鍙槸鍙仛鍚堢殑锛屾垨鑰呮槸鐙珛鐨勫璞°傛牴鎹綘閫夋嫨鐨勮仛鍚堥夐」锛孉TL ObjectWizard浣跨敤涓涓畯鏉ユ墽琛岃仛鍚堢瓥鐣ャ備緥濡傦紝缂虹渷鐨凜OM绫荤殑瀹炵幇鏄彲鑱氬悎鐨勨曗曞璞″皢鏃㈣繍琛屽湪鐙珛鐨勬ā寮忥紝鍙堜綔涓轰竴涓仛鍚堢殑涓閮ㄥ垎銆傚鏋滀綘浣夸綘鐨凜OM瀵硅薄涓嶅彲鑱氬悎锛孫bjectWizard鎶奃ECLARE_NOT_ AGGREGATABLE瀹忓姞鍒颁綘鐨勭被瀹氫箟涓傚鏋滀綘閫夋嫨浜嗕粎鏄彲鑱氬悎鐨勶紝ObjectWizard鎶奃ECLARE_ ONLY_AGGREGATABLE瀹忓姞鍏ュ埌绫诲畾涔変腑銆
[8] [9] [10] [11]




发表于 2009-1-5 19:48
| 











