锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久亚洲AV片无码下载蜜桃,国产精品久久久久久久久久免费,久久精品a亚洲国产v高清不卡http://www.shnenglu.com/gracelee/category/4816.htmlzh-cnWed, 13 May 2009 15:16:21 GMTWed, 13 May 2009 15:16:21 GMT60鐢–瀹炵幇鐨勪竴涓熀鏈珻OM鎺ュ彛IFoo錛堟潵鑷狢OM Programmer's Cookbook錛夆斺擟瀹炵幇COM鎺ュ彛緋誨垪2http://www.shnenglu.com/gracelee/archive/2009/05/11/82582.html灝忚懕铇擱叡灝忚懕铇擱叡Mon, 11 May 2009 08:28:00 GMThttp://www.shnenglu.com/gracelee/archive/2009/05/11/82582.htmlhttp://www.shnenglu.com/gracelee/comments/82582.htmlhttp://www.shnenglu.com/gracelee/archive/2009/05/11/82582.html#Feedback0http://www.shnenglu.com/gracelee/comments/commentRss/82582.htmlhttp://www.shnenglu.com/gracelee/services/trackbacks/82582.html鍦?a href="http://www.shnenglu.com/gracelee/archive/2009/04/29/81414.html">C瀹炵幇COM鎺ュ彛緋誨垪1涓疄鐜扮殑com鎺ュ彛IFoo涓庝嬌鐢ㄥ畠鐨勫鎴瘋﹀悎鍦ㄤ竴璧鳳紝娌℃湁瀹炵幇鍦ㄥ悇鑷垎紱葷殑妯″潡錛屽洜姝や笉絎﹀悎妯″潡鍖栫紪紼嬫濇兂銆傛湰鏈熸坊鍔犵被鍘傛敮鎸侊紝浠ヤ嬌鎺ュ彛鐨勫疄鐜頒笌鎺ュ彛鐨勪嬌鐢ㄧ浉鍒嗙銆?/p>

---------------------------------------------------
綾誨巶鐨勪綔鐢ㄥ埌搴曟槸浠涔堬紵
灝嗘帴鍙g殑瀹炵幇涓庡鎴蜂嬌鐢ㄥ垎紱誨紑鏉ュ悧錛?/p>

涓嶅敖鐒躲備嬌鐢–oCreateInstance錛屽鎴峰彲浠ュ畬鍏ㄤ笉蹇呯煡閬撶被鍘傜殑瀛樺湪錛岃屽垱寤虹粍浠訛紝鑾峰彇緇勪歡瀹炵幇鐨勬帴鍙e茍浣跨敤銆?/p>

鍗矯OM搴撳彲浠ュ畬鍏ㄦ姏寮綾誨巶鐨勬蹇碉紝鑰屾槸鎻愪緵涓涓繖鏍風殑鍑芥暟鍘熷瀷錛?br>CoCreateObject(REFID rclsid,...,REFID riid,void **ppItf);
鐢ㄦ埛鍦ㄨ皟鐢ㄧ殑鏃跺欏彲浠ュriid鎻愪緵IID_Unknown鎴栬呯壒瀹氫簬璇ュ璞$殑涓涓帴鍙o紝鐩存帴鑾峰彇璇ュ璞$殑IUnknown鎴栫壒瀹氱殑鎺ュ彛鎸囬拡銆?/p>

鍙互鐪嬪埌錛岃繖姝f槸CoCreateInstance鎵浣滅殑浜嬫儏銆?/p>

1 綾誨巶鎻愪緵浜嗛棿鎺ュ垱寤虹被瀵硅薄鐨勬柟寮忥細鐢ㄦ埛鍙互鍏堣幏鍙栧茍鎸佹湁綾誨巶鎺ュ彛鎸囬拡錛岄氳繃璇ユ寚閽堟墍鎸囧悜鐨勭被鍘傛帴鍙e垱寤虹被瀵硅薄銆傞傜敤浜庨渶瑕佸垱寤哄涓紙鎴栭噸澶嶅垱寤猴級綾誨璞$殑鍦版柟錛屽噺灝戜簡姣忔閮借瀹氫綅瀵硅薄搴撳茍鎶婂璞″簱瑁呭叆鍐呭瓨鐨勫紑閿銆?br>2 綾誨巶鎻愪緵浜嗕繚璇佺粍浠跺簱鐣欏湪鍐呭瓨涓嶈鍗歌澆鍑哄幓鐨勫彟涓縐嶆柟娉曪細綾誨巶鎺ュ彛鍑芥暟LockServer銆傜粍浠跺簱緇存姢涓涓簱鑼冨洿璁℃暟鍣紝鍙湁璇ヨ鏁板櫒涓?鏃訛紝緇勪歡搴撴墠鍏佽鑷繁琚嵏杞藉嚭鍐呭瓨銆傦紙涓庢鐩稿錛屽紩鐢ㄨ鏁版槸綾誨璞¤寖鍥寸殑錛岄氳繃璇ョ被瀹炵幇鐨勫悇涓帴鍙f潵緇存姢銆傚鏋滀竴涓被瀵硅薄鐨勫紩鐢ㄨ鏁拌揪鍒?錛岄偅涔堣瀵硅薄鍗犳湁鐨勫唴瀛樺氨琚噴鏀撅紝璇ュ璞′笂鐨勬帴鍙f寚閽堜篃涓嶅啀鏈夋晥銆傦級
闄や簡璋冪敤LockServer閿佸畾緇勪歡搴撲互澶栵紝褰撳垱寤虹殑緇勪歡涓暟澶т簬0鏃訛紝緇勪歡搴撲篃涓嶈兘琚嵏杞姐備篃鍙互璇達紝璋冪敤涓嬈ockServer()鐨勪綔鐢ㄧ浉褰撲簬鍒涘緩浜嗕竴涓粍浠躲?/p>

-----------------------------------------------------------------------
瀹㈡埛涓渚э細
1 浣跨敤涓涓帴鍙i渶瑕佺煡閬撳摢浜涗俊鎭紵
澶囬夛細
鎺ュ彛IID
綾誨璞★紙綾誨巶錛塁LSID錛堟垨ProgID錛?br>鎺ュ彛鍑芥暟鍘熷瀷錛堝弬鏁頒釜鏁幫紝綾誨瀷錛岃繑鍥炲鹼級
瀹炵幇鎺ュ彛緇勪歡鐨勭嚎紼嬫ā鍨嬶紙榪涚▼鍐呫佽繘紼嬪銆佽繙紼嬶級錛?br>綾誨瀷搴搕ypelib淇℃伅錛?/p>

鏈嶅姟涓渚э細
2 瀹炵幇涓涓粍浠跺拰鎺ュ彛浠ヤ緵瀹㈡埛璋冪敤錛岄渶瑕佹彁渚涘摢浜涗笢瑗匡紵
澶囬夛細
鎵鏈夊鎴蜂嬌鐢ㄧ粍浠跺拰鎺ュ彛鎵闇鐨勫唴瀹?br>棰濆鐨勮繕鏈夛細


--------------------------------------------------------------------
涓篸ll娣誨姞.def鏂囦歡涓庣洿鎺ュ湪闇瑕佸鍑虹殑鍑芥暟瀹氫箟澶勬寚瀹歘declspec( dllexport )鏈夊尯鍒悧錛熷鏋滄湁鏄粈涔堝尯鍒紵

鎴戝彂鐜板湪outdll.c涓繖鏍鋒寚瀹氾細
__declspec( dllexport ) HRESULT DllGetClassObject (REFCLSID rclsid, REFIID riid, void **ppv)
浼氫駭鐢熺紪璇戦敊璇細
1>------ Build started: Project: outside, Configuration: Debug Win32 ------
1>Compiling...
1>outdll.c
1>d:\outside-cf\outside\outdll.c(19) : error C2375: 'DllGetClassObject' : redefinition; different linkage
1>        c:\program files\microsoft visual studio 8\vc\platformsdk\include\objbase.h(833) : see declaration of 'DllGetClassObject'
1>Build log was saved at "file://d:\outside-cf\outside\Debug\BuildLog.htm"
1>outside - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

c2375鐨勮В閲婃剰鎬濇槸鍑洪敊鐨勫嚱鏁頒嬌鐢ㄧ殑閾炬帴鎸囩ず絎︿笌涔嬪墠澹版槑鐨勪笉鍚屻?br>Compiler Error C2375
'function' : redefinition; different linkage

The function is already declared with a different linkage specifier.

objbase.h涓0鏄庝簡DllGetClassObject()鍑芥暟錛?br>STDAPI  DllGetClassObject(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv);

鑰屼嬌鐢?def鏂囦歡灝辨病鏈夐棶棰樸?/p>

-----------------------------------------------------------------------------
鍒濇鎵ц緇撴灉錛?/p>

闂灝辨槸鎬繪湁涓涓垎閰嶇殑鍐呭瓨娌℃湁閲婃斁錛?/p>

 


鏍規嵁鎵撳嵃鍑烘潵鐨勫唴瀛樺湴鍧鍙互鍒ゆ柇錛屽簲璇ユ槸鍏堝垱寤虹殑綾誨巶瀵硅薄鐨勫唴瀛樻病鏈夐噴鏀俱?br>媯鏌ヤ唬鐮侊紝main()涓茍娌℃湁蹇樿璋冪敤Release(pCF)閲婃斁綾誨巶瀵硅薄銆傛墦鍗癛elease(pCF)鐨勮繑鍥炲鹼紝鍙戠幇鏄?錛屽嵆鍦ㄧ被鍘傛帴鍙f寚閽堜笂灝戣皟鐢ㄤ簡涓嬈elease錛岄偅涔堬紝絀剁珶鏄摢閲屽皯鐨勫憿錛?/p>

main()鍑芥暟涓湁鍏崇被鍘傚璞″紩鐢ㄨ鏁扮殑鍦版柟灝辨槸CoGetClassObject鍜孯elease錛圕reateInstance璺熺被鍘傝嚜宸辯殑寮曠敤璁℃暟鏃犲叧錛夛紝榪欐槸涓瀵瑰鍔犲紩鐢ㄨ鏁板拰鍑忓皯寮曠敤璁℃暟鐨勫搴旀搷浣滐紝鎵浠?main()涓簲璇ユ病鏈夐棶棰樸?/p>

閭d箞錛屽氨鍙湁鍒涘緩綾誨巶瀵硅薄鐨勬椂鍊欎簡銆備笅闈㈢湅涓涓嬬被鍘傚璞℃槸濡備綍鍒涘緩鐨勩?br>棣栧厛錛宮ain璋冪敤CoGetClassObject錛岃鍑芥暟灝辮皟鐢╠ll涓殑DllGetClassObject銆傜敱浜庢槸絎竴嬈¤皟鐢紙涓嶈冭檻鍏朵粬瀹㈡埛浣跨敤璇ll鐨勬儏鍐碉級錛岀▼搴忔墽琛屽埌CreateClassFactory(...),璇ュ嚱鏁版墽琛屽畬鍚庯紝綾誨巶瀵硅薄鐨勫紩鐢ㄨ鏁版槸1銆?/p>

鐢變簬鍒涘緩鎴愬姛錛屽洜姝ょ戶緇悜涓嬫墽琛屽埌QueryInterface,姝ゆ椂錛岀被鍘傚璞$殑寮曠敤璁℃暟鍙樻垚浜?銆傜劧鍚庯紝DllGetClassObject榪斿洖錛宑om搴撳嚱鏁癈oGetClassObject涔熷簲璇ヨ繑鍥炪傛敞鎰忥紝姝ゆ椂鐨勭被鍘傚璞″紩鐢ㄨ鏁板凡緇忔槸2浜嗭紒

鍥犳錛岄棶棰樺氨鍑哄湪榪欓噷銆俶ain璋冪敤涓嬈oGetClassObject鍚庯紝綾誨巶瀵硅薄鐨勫紩鐢ㄨ鏁版槸2錛岃屼笉鏄垜鎯沖悜涓殑1銆備簬鏄紝鍚庨潰璋冪敤涓嬈elease涔熷氨褰撶劧鏃犳硶閲婃斁鎺夌被鍦哄璞′簡銆?/p>

 

 

 1 HRESULT DllGetClassObject (REFCLSID rclsid, REFIID riid, void **ppv)
 2 {
 3     *ppv = 0;
 4     if (IsEqualCLSID (rclsid, &CLSID_Outside))
 5     {
 6 
 7         if (!vpcfOutside)
 8 
 9         {
10 
11             HRESULT hr = CreateClassFactory (&CLSID_Outside, CreateOutside,
12                                              &IID_IClassFactory, &vpcfOutside);
13 
14                 if (hr != NOERROR)
15 
16                     return hr;
17         }
18 
19         return QueryInterface (vpcfOutside, riid, ppv);
20 
21     }
22 
23     return E_FAIL;
24 }

 

 


鎵懼埌浜嗗師鍥狅紝鏀規灝卞緢瀹規槗浜嗐傝繖閲屾垜瑙夊緱闇瑕佹妸DllGetClassObject浣滃涓嬩慨鏀癸細

 1 HRESULT DllGetClassObject (REFCLSID rclsid, REFIID riid, void **ppv)
 2 {
 3     *ppv = 0;
 4     if (IsEqualCLSID (rclsid, &CLSID_Outside))
 5     {
 6 
 7         if (!vpcfOutside)
 8 
 9         {
10 
11             HRESULT hr = CreateClassFactory (&CLSID_Outside, CreateOutside,
12                                              &IID_IClassFactory, &vpcfOutside);
13 
14                 if (hr != NOERROR)
15 
16                     return hr;
17 
18     if(IsEqualIID(riid,&IID_IClassFactory))
19     {
20      *ppv = vpcfOutside;// Set *ppv to vpcfOutside directly instead of QueryInterface if first time creation
21      return NOERROR;
22     }
23     else
24     {
25      Release(vpcfOutside);// Any interface requested (riid) other than IID_ClassFactory and IID_Unknown not support by class factory,
26                           // call Release to free the memory.
27      return E_FAIL;
28     }
29 
30         }
31 
32         return QueryInterface (vpcfOutside, riid, ppv);
33 
34     }
35 
36     return E_FAIL;
37 }

 

淇敼鍚庡湪鎵ц錛屽唴瀛橀兘姝e父閲婃斁浜嗐?/p>

-------------------------------------------------------------------------------------------
CreateClassFactory浠g爜璇存槑

 1 HRESULT CreateClassFactory (REFCLSID rclsid,
 2     HRESULT (*pfnCreate)(IUnknown *, REFIID, void **), 
 3     REFIID riid, void **ppv)
 4 {
 5     ClassFactory *this;
 6     HRESULT hr;
 7     
 8     *ppv = 0;
 9     if (hr = Alloc (sizeof (ClassFactory), &this))
10     return hr;
11 
12     this->icf.lpVtbl = &vtblClassFactory;
13     this->cRef = 1;  // After this call, cRef==1
14 
15     this->pfnCreate = pfnCreate;
16     
17     hr = QueryInterface (&this->icf, riid, ppv);  // After this call, cRef==2
18     Release (&this->icf);  // Corresponds to "this->cRef = 1", ater this call, cRef==1
19 
20     return hr;
21 }

 

鍙互鐪嬪埌錛屼袱琛屼唬鐮佺殑鏁堟灉鏄寮曠敤璁℃暟澧?鍙婂噺1錛岃繖涓よ浠g爜鎵ц鍚庯紝瀵瑰紩鐢ㄨ鏁扮殑褰卞搷浜掔浉鎶墊秷錛岀瓑浜庢病鏈夋敼鍙樺紩鐢ㄨ鏁般傞偅涔堬紝鎶婅繖涓よ鍚屾椂娉ㄩ噴鎺夛紝鏄笉鏄彲浠ュ憿錛?br>鎴戠殑鍥炵瓟鏄細鍦ㄦ湰渚嬩腑鍙互銆傚洜涓鴻繖涓よ浠g爜涔嬮棿鐨凲ueryInterface鎬繪槸鍙互鎵ц鎴愬姛鐨勶紙鍥犱負鏄敤IDD_ClassFactory鏉ヨ皟鐢ㄨ鍑芥暟鐨勶級銆傛墍浠ワ紝鍗充究鎶婅繖涓よ浠g爜鍚屾椂娉ㄩ噴鎺夛紝CreateClassFactory鎵ц緇撴潫鍚庯紝綾誨巶瀵硅薄鐨勫紩鐢ㄨ鏁頒篃澧炰簡1錛屼互鍚庤皟鐢≧elease灝卞彲浠ラ噴鏀炬帀綾誨巶瀵硅薄鍗犵敤鐨勫唴瀛樸?br>浣嗘槸錛屽鏋淐FQueryInterface鐨勪唬鐮佺紪鍐欎腑闄や簡閿欒錛屾瘮濡傦紝鍍忚繖鏍峰啓錛?br>

 1 static HRESULT CFQueryInterface (IClassFactory *pcf, REFIID riid, void **ppv)
 2 {
 3     ClassFactory *this = IMPL (ClassFactory, icf, pcf);
 4 
 5     if (IsEqualIID (riid, &IID_IUnknown) ||
 6 //            IsEqualIID (riid, &IID_IClassFactory))   // Comment out this condition to create an error
 7         *ppv = &this->icf;
 8     else
 9     {
10         *ppv = 0;
11         return E_NOINTERFACE;
12     }
13 
14     AddRef ((IClassFactory *)*ppv);
15 
16     return NOERROR;
17 }


閭d箞錛岃繖涓よ浠g爜涔嬮棿鐨凲ueryInterface灝變細鎵ц鍑洪敊錛岄偅涔堢被鍘傚璞″崰鐢ㄧ殑鍐呭瓨灝辨案榪滄病鏈夋満浼氶噴鏀句簡銆?br>涔熷氨鏄錛孉ddRef鍜孯elease铏界劧鍦ㄤ綔鐢ㄤ笂瀵瑰紩鐢ㄨ鏁版潵璇寸浉浜掓姷娑堬紝浣哛elease鍑芥暟鎻愪緵浜嗛噴鏀懼璞″唴瀛樼殑鏈轟細錛堝綋寮曠敤璁℃暟涓?鏃訛級錛屽鏋滀笉鎴愬鐨勮皟鐢ㄤ粬浠紝涔熷氨澶卞幓浜嗙鐞嗗璞″唴瀛橈紙閲婃斁瀵硅薄鍗犵敤鐨勫唴瀛橈級鐨勬満浼氥?/p>

---------------------------------------------------------------------------
緇勪歡搴搊utside鏂囦歡璇存槑錛?br> IFoo.h      IFoo鎺ュ彛澹版槑
 outside.c   緇勪歡瀵硅薄銆両Foo鎺ュ彛瀹炵幇
 cf.c        綾誨巶瀵硅薄銆両ClassFactory鎺ュ彛瀹炵幇
 outdll.c    緇勪歡搴撳鍑哄嚱鏁板疄鐜?br> outside.def 緇勪歡搴撴ā鍧楀畾涔夋枃浠訛紝瀵煎嚭鍑芥暟澹版槑
 outside.reg 緇勪歡搴撴敞鍐屾枃浠?/p> ----------------------------------------------------------------------------
婧愮爜錛?outside-cf

]]>
鐢–瀹炵幇鐨勪竴涓熀鏈珻OM鎺ュ彛IFoo錛堟潵鑷狢OM Programmer's Cookbook錛夆斺擟瀹炵幇COM鎺ュ彛緋誨垪1http://www.shnenglu.com/gracelee/archive/2009/04/29/81414.html灝忚懕铇擱叡灝忚懕铇擱叡Wed, 29 Apr 2009 04:08:00 GMThttp://www.shnenglu.com/gracelee/archive/2009/04/29/81414.htmlhttp://www.shnenglu.com/gracelee/comments/81414.htmlhttp://www.shnenglu.com/gracelee/archive/2009/04/29/81414.html#Feedback2http://www.shnenglu.com/gracelee/comments/commentRss/81414.htmlhttp://www.shnenglu.com/gracelee/services/trackbacks/81414.html鐢–瀹炵幇鐨勪竴涓熀鏈珻OM鎺ュ彛IFoo錛堟潵鑷狢OM Programmer's Cookbook錛?/p>


鎶婅鏂囦腑瀹炵幇鐨勪唬鐮佹暣鐞嗘眹鎬誨埌涓涓」鐩腑銆傜洰鍓嶅彧鏄疄鐜板埌涓涓腑闂撮樁孌碉紝閲嶇偣鍦ㄨ鏄嶤OM鎺ュ彛鐨勫疄鐜板師鐞嗭紝榪樻病鏈夊寘鍚被鍘傜殑閮ㄥ垎銆備互鍚庤繕闇闄嗙畫娣誨姞綾誨巶絳夐珮綰у姛鑳姐?/p>

鏂囦歡緇勬垚錛?br>ifoo.h         COM鎺ュ彛IFoo,鎺ュ彛ID IID_IFoo 澹版槑鏂囦歡銆?br>outside.c      COM鎺ュ彛瀹炵幇銆傝繖閲屽疄鐜癐Foo鐨勬槸涓涓粨鏋勪綋COutside.
util.h         涓浜涘畯瀹氫箟銆佸叏灞鍑芥暟銆佸彉閲忓0鏄庢枃浠躲?br>main.c         絎旇呬負瀹炵幇欏圭洰娣誨姞鐨勬枃浠躲傛彁渚沵ain鍑芥暟銆佸唴瀛樼鐞嗗嚱鏁癆lloc,Free鐨勫疄鐜幫紙灝佽C榪愯搴撳嚱鏁癿alloc鍜宖ree.錛夈佹帴鍙D瀹氫箟銆?/p>

COM鎺ュ彛鍒板簳鏄粈涔堬紵
COM鎺ュ彛鏄竴涓寚鍚戣櫄鍑芥暟琛ㄧ殑鎸囬拡銆傞氳繃榪欎釜鎸囬拡鍙互璁塊棶鍐呭瓨涓煇澶勭殑鍚勪釜鍔熻兘鍧楋紝鎵ц棰勫畾涔夌殑鍔熻兘錛屽畬鎴愮敤鎴風殑浠誨姟銆傝繖浜涘姛鑳藉潡浠ュ嚱鏁扮殑褰㈠紡瀛樺湪錛堟兂涓嶅嚭榪樻湁鍏朵粬褰㈠紡:)錛夊茍琚皟鐢ㄣ傚畠浠湁涓涓叡鍚岀偣錛氶兘鍖呭惈涓涓寚閽堝弬鏁幫紝鎸囧悜榪欎簺鍔熻兘瑕佹搷浣滅殑鏁版嵁鍦板潃銆傚湪C++涓紝榪欎釜鍦板潃灝辨槸瀵硅薄鐨勯鍦板潃錛屼篃灝辨槸綾繪垚鍛樺嚱鏁頒腑闅愬惈鐨則his鎸囬拡銆傚湪C鍑芥暟涓茍娌℃湁榪欑鐜版垚鐨勪究鍒╋紝鍥犳浠g爜瀹炵幇涓湪鎺ュ彛瀹氫箟鏃朵粛浣跨敤浜嗘帴鍙f寚閽堬紙HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **)錛夛紝鑰屽湪鎺ュ彛鍑芥暟瀹炵幇鏃舵牴鎹粨鏋勪綋甯冨眬緇撴瀯錛屼粠榪欎釜鎺ュ彛鎸囬拡鎺ㄧ畻寰楀埌瀵硅薄瀹炰緥鎸囬拡銆?/p>

typedef struct IFoo
{
 struct IFooVtbl * lpVtbl;
} IFoo;
typedef struct IFooVtbl IFooVtbl;
struct IFooVtbl
{
 
 HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **) ;
 ULONG (__stdcall * AddRef)    (IFoo * This) ;
 ULONG (__stdcall * Release)   (IFoo * This) ;

 HRESULT (__stdcall * SetValue)         (IFoo * This,  int) ;
 HRESULT (__stdcall * GetValue)         (IFoo * This,  int *) ;
};

COM鎺ュ彛鐨勮姹傦細

姣忎竴涓狢OM鎺ュ彛錛堟寚鍚戠殑铏氬嚱鏁拌〃錛夌殑澶翠笁涓嚱鏁板繀欏繪槸IUnknown鎺ュ彛鐨勫嚱鏁幫細QueryInterface,AddRef鍜孯elease銆傚湪C++涓紝縐頒負浠嶪Unknown鎺ュ彛緇ф壙銆?br>瀵逛簬璋冪敤QueryInterface鍝嶅簲鏌ヨIID_IUnknwon寰楀埌鐨勬帴鍙f寚閽堝鹼紝鍚屼竴涓璞″疄鐜扮殑鎵鏈夋帴鍙e繀欏葷浉鍚屻傝繖鏄垽鏂袱涓狢OM瀵硅薄鏄惁鏄悓涓涓璞$殑鏍囧噯銆?/p>

 

瀹忓畾涔?#8220;#define IUNK_VTABLE_OF(x) ((IUnknownVtbl *)((x)->lpVtbl))“璇存槑

鍦ㄩ澶勭悊杈撳嚭鏂囦歡main.i涓彲浠ユ壘鍒癐UnknownVtbl鍜孖FooVtbl鐨勫0鏄庯細
    typedef struct IUnknownVtbl
    {
       
       
        HRESULT ( __stdcall *QueryInterface )(
            IUnknown * This,
             const IID * const riid,
             void **ppvObject);
       
        ULONG ( __stdcall *AddRef )(
            IUnknown * This);
       
        ULONG ( __stdcall *Release )(
            IUnknown * This);
       
       
    } IUnknownVtbl;
   
    struct IUnknown
    {
         struct IUnknownVtbl *lpVtbl;
    };   
   

struct IFooVtbl
{
 
 HRESULT (__stdcall * QueryInterface)   (IFoo * This,  const IID * const, void **) ;
 ULONG (__stdcall * AddRef)    (IFoo * This) ;
 ULONG (__stdcall * Release)   (IFoo * This) ;

 HRESULT (__stdcall * SetValue)         (IFoo * This,  int) ;
 HRESULT (__stdcall * GetValue)         (IFoo * This,  int *) ;
};

璇ュ畯瀹氫箟鐨勪綔鐢ㄥ氨鏄妸IFoo鎺ュ彛涓殑IFooVtbl綾誨瀷鐨勬寚閽堟嬁鍑烘潵錛?x)->lpVtbl)錛夛紝騫跺己鍒惰漿鎹紙(IUnknownVtbl *)錛夋垚IUnknownVtbl銆?br>“寮哄埗杞崲”鐨勭粨鏋滄槸浠涔堝憿錛熸槸鎬庝箞鍋氬埌鐨勫憿錛?br>寰堟槑鏄撅紝緇撴灉灝辨槸寰楀埌鐨勬寚閽堜笉鍐嶆槸IFooVtbl *綾誨瀷錛岃屾槸鍙樻垚浜咺UnknownVtbl *綾誨瀷銆傝嚦浜庡仛娉曪紝緋葷粺搴旇璁板綍姣忎竴涓彉閲忋佽〃杈懼紡鐨勭被鍨嬨傚綋榪涜寮哄埗綾誨瀷杞崲鏃訛紝灝憋紙涓存椂鍦幫級淇敼鍏剁被鍨嬩負杞崲鍒扮殑綾誨瀷銆?br>鍚岀悊錛孮ueryInterface, AddRef, Release瀹忓畾涔変腑鐨?IUnknown *)涔熸槸榪欑鐢ㄦ硶銆?/p>

鍙互鐪嬪埌錛屽畯“IUNK_VTABLE_OF“鐨勪綔鐢ㄦ槸渚涘畯QueryInterface,瀹廇ddRef錛屽畯Release寮曠敤錛屾妸IFooVtbl *綾誨瀷杞崲涓篒UnknownVtbl *綾誨瀷錛屾渶緇堣揪鍒拌皟鐢↖UnknownVtbl涓畾涔夌殑涓変釜QueryInterface,AddRef,Release鍑芥暟銆?/p>

閭d箞錛岃繖縐嶅ぇ璐瑰懆绔犵殑鐩殑鏄粈涔堝憿錛熶負浠涔堜笉浠FooVtbl涓笁涓嚱鏁扮殑瀹氫箟褰㈠紡錛堜笉閫氳繃寮哄埗杞崲鏉ヨ漿鎹㈡垚蹇呴』鐨勭被鍨嬶級錛岀洿鎺ヨ皟鐢↖FooVtbl涓畾涔夌殑鍑芥暟鍛紵铏界劧寮哄埗杞崲鍦ㄥ弬鏁板間笂騫朵笉浼氶犳垚鏀瑰彉錛屾渶緇堣皟鐢ㄧ殑涔熸槸IFooVtbl瀹氫箟鐨勫嚱鏁幫紙FooQueryInterface,FooAddRef,FooRelease錛夈?/p>

涓轟粈涔堜竴瀹氳閫氳繃IUnknown鎺ュ彛鎸囬拡璋冪敤榪欎笁涓嚱鏁板憿錛熶慨鏀筈ueryInterface瀹忓畾涔夊涓嬶細
#define QueryInterface(pif, iid, pintf) \
 (((pif)->lpVtbl)->QueryInterface(pif, iid, (void **)(pintf)))
鍗抽氳繃IFoo鎺ュ彛鎸囬拡鏉ヨ皟鐢ㄧ敱IUnknown寮曞叆鐨勫嚱鏁幫紝鏈変粈涔堜笉瀵圭殑鍦版柟鍚楋紵

璇曢獙琛ㄦ槑錛屽皢QueryInterface瀹忓畾涔夊涓嬩篃鍙互緙栬瘧閫氳繃錛屾墽琛岃搗鏉ヤ篃娌℃湁鍑虹幇浠諱綍寮傚父銆?br>#define QueryInterface(pif, iid, pintf) \
 (((pif)->lpVtbl)->QueryInterface(pif, iid, (void **)(pintf)))

 

瀵逛簬IUnknown鎺ュ彛鐨勪笁涓嚱鏁幫紝璋冪敤鏃朵紶閫掔殑鍙傛暟鏄疘Unknown *綾誨瀷錛堣QueryInterface, AddRef, Release瀹忓畾涔夛級錛岃屽嚱鏁板畾涔変腑錛團ooQueryInterface, FooAddRef, FooRelease錛夊0鏄庣殑鍙傛暟鏄疘Foo *綾誨瀷錛岃繖縐嶄笉涓鑷寸殑鎯呭喌鏄庝箞鍑虹幇鐨勶紵榪欑涓嶄竴鑷翠笉浼氭湁闂鍚楋紵

榪欑涓嶄竴鑷寸殑浜х敓鏄敱浜庝粠涓嶅悓鐨勮搴︾湅寰呭紩璧風殑銆傚鏋滀粠IUnknown鎺ュ彛鏉ョ湅錛岄偅涔堟帴鍙e嚱鏁頒腑鐨勭涓涓弬鏁扮被鍨嬪氨鏄疘Unknown *;濡傛灉浠嶪Foo鏉ョ湅錛岄偅涔堢涓涓弬鏁扮殑綾誨瀷灝辨槸IFoo *銆?/p>

榪欑涓嶄竴鑷存у彧鏄拡瀵逛簬緙栬瘧鍣ㄥ浜庣被鍨嬬殑緙栬瘧瑕佹眰鏈夋剰涔夌殑錛屽湪鎺ュ彛瀹炵幇鍙婁嬌鐢ㄦ椂錛屼紶閫掔粰lpVtbl->QueryInterface, lpVtbl->AddRef,lpVtbl->Release鐨勭涓涓弬鏁板湪鍊間笂閮芥槸鐩稿悓鐨勶紝閮芥槸瀹炵幇璇ユ帴鍙g殑鍐呭瓨鍦板潃錛堝湪鏈緥涓槸COutside瀵硅薄鐨勯鍦板潃錛夈?/p>

 

涓浜涜娉曠幇璞″洖欏?/p>

鍑芥暟鎸囬拡鍙橀噺瀹氫箟銆佽祴鍊煎強璋冪敤銆?br>HRESULT (__stdcall * pQI)   (IFoo * This,  const IID * const, void **) ;
瀹氫箟涓涓嚱鏁版寚閽堝彉閲弍QI,璇ュ彉閲忔寚鍚?#8220;榪斿洖HRESULT,鍙?涓弬鏁板垎鍒負綾誨瀷IFoo *,const IID * const, void **”鐨勫嚱鏁般?/p>

typedef HRESULT (__stdcall * QIType)   (IFoo * This,  const IID * const, void **) ;
瀹氫箟涓涓嚱鏁版寚閽堢被鍨嬶紝璇ョ被鍨嬬殑鎸囬拡鎸囧悜“榪斿洖HRESULT,鍙?涓弬鏁板垎鍒負綾誨瀷IFoo *,const IID * const, void **”鐨勫嚱鏁般?/p>

HRESULT __stdcall QueryInterface(IFoo * This,  const IID * const, void **) ;//鍑芥暟澹版槑紺轟緥
pQI = 0;   // 鍑芥暟鎸囬拡璧嬪鹼紝0琛ㄧず涓嶆寚鍚戜換浣曞嚱鏁般?br>pQI = QueryInterface;  // 鍑芥暟鎸囬拡璧嬪鹼紝pQI鎸囧悜QueryInterface銆?br>pQI = &QueryInterface; // 涓庝笂闈㈢瓑浠楓?/p>

QueryInterface(&this->ifoo, riid, ppv);  // 浣跨敤鍑芥暟鍚嶇洿鎺ヨ皟鐢?br>pQI(&this->ifoo, riid, ppv);             // 鍑芥暟鎸囬拡璋冪敤
(*pQI)(&this->ifoo, riid, ppv);          // 絎簩縐嶅嚱鏁版寚閽堣皟鐢ㄦ柟寮?/p>


瀹忓畾涔夈佸睍寮瑙勫垯
瀵逛簬瀹忥紝涓鐩存湁涓縐嶉浘閲岀湅鑺辯殑鎰熻錛屼技涔庡緢闅忔剰錛屾庝箞鏉ラ兘琛岋紝姣斿錛?br>#define AddRef(pif) \
 (IUNK_VTABLE_OF(pif)->AddRef((IUnknown *)(pif)))

瀹忓畾涔夊簲璇ユ槸鍙互宓屽鐨勶紝鍗沖畯瀹氫箟鐨?#8220;鍐呭“涓繕鍙互鍖呭惈錛堝祵濂楋級瀹忥紝濡傛湰渚嬶紝“IUNK_VTABLE_OF”灝辨槸宓屽瀹忋傚湪灞曞紑鐨勬椂鍊欙紝灝嗗祵濂楃殑瀹忎篃涓騫跺睍寮錛堟浛鎹㈡垚瀹氫箟鐨勫唴瀹癸級錛岀洿鍒頒笉鍐嶆湁瀹忎負姝€?br>閭d箞灝辨湁涓や釜鐤戦棶錛?br>1銆傚鏋滆宓屽鐨勫畯鍖呭惈錛堢洿鎺ユ垨闂存帴錛夊畾涔夌殑瀹忥紝閭d箞灞曞紑灝辨病瀹屾病浜嗭紝姝誨驚鐜簡銆?br>2銆傚鏋滃畾涔夌殑鍐呭涓湁璺熷畾涔夌殑瀹忓悓鍚嶇殑瀛楃涓詫紙姣斿涓婇潰鐨勪緥瀛怚UNK_VTABLE_OF錛夛紝閭d箞鎬庝箞鍖哄垎榪欏悓鍚嶇殑涓滀笢鏄祵濂楃殑瀹忥紙闇瑕佸睍寮錛夛紝榪樻槸涓鑸殑瀛楃涓詫紙涓嶉渶瑕佸睍寮錛夛紵


鍑芥暟璋冪敤瑙勮寖綰﹀畾銆乵ain鍑芥暟璋冪敤瑙勮寖銆?/p>

涓寮濮嬫妸鍑犱釜鏂囦歡姹囨誨埌欏圭洰閲屾椂錛岀紪璇戦氫笉榪囷紝閿欒鎻愮ず澶ц嚧鎰忔濇槸錛屼笉鑳芥妸涓縐嶈皟鐢ㄨ鑼冪殑鍑芥暟鎸囬拡杞崲鎴愬彟涓縐嶈皟鐢ㄨ鑼冪殑鍑芥暟鎸囬拡銆傚悗鏉ユ妸璋冪敤瑙勮寖鏀逛負   /Gz(__stdcall),緙栬瘧涓猴紙Compile As錛夋敼涓?TC(Compile As C Code)灝卞ソ浜嗐?/p>

鎯蟲潵鏄浜?c鏂囦歡錛岀紪璇戝櫒緙虹渷浣跨敤鐨勬槸__cdecl錛岃孖Foo涓殑鎺ュ彛瀹忓畾涔夊湪win32涓嬪睍寮鎴愪簡__stdcall錛屾墍浠ュ嚭鐜頒簡鐭涚浘銆傝屼嬌鐢?Gz寮哄埗鏈0鏄庤皟鐢ㄨ鑼冪殑鍑芥暟浣跨敤__stdcall錛屽疄鐜板氨涓庡0鏄庝竴鑷翠簡銆?/p>


(size_t)&(((s *)0)->m)

c++紼嬪簭鍛樹篃璁擱兘鐭ラ亾錛岃闂湴鍧“0”澶勭殑鎴愬憳鏄竴澶у繉錛屼細閫犳垚GP銆傜劧鑰岋紝鍙栧湴鍧“0”澶勭殑鎴愬憳鐨勫湴鍧錛屽嵈鏄釜鍚堟硶鐨勬搷浣溿傝櫧鐒跺湴鍧“0”澶勫茍娌℃湁浠涔堝唴瀹癸紝浣嗘槸錛屽鏋滃湪鍦板潃0澶勫瓨鏀句竴涓唴瀹癸紝閭d箞璇ュ唴瀹逛腑鐨勬垚鍛樹篃鏄湁鍦板潃鐨勩傛湰渚嬩腑姝f槸宸у鍦板埄鐢ㄨ繖縐嶆柟娉曪紝浠庢帴鍙e湴鍧璁$畻寰楀嚭瀹炵幇璇ユ帴鍙g殑瀹炰緥鍦板潃錛岃繘鑰岃闂疄渚嬬殑鍐呴儴鍙橀噺銆?br>
------------------------------------------------------------------------------------
2009騫?鏈?鏃?br>闄勪笂婧愮爜錛?a href="http://www.shnenglu.com/Files/gracelee/outside.zip">/Files/gracelee/outside.zip

浠g爜鎵ц緇撴灉錛?br>



]]>
鑷姩綾誨瀷杞崲鈥斺旀搷浣滅閲嶈澆http://www.shnenglu.com/gracelee/archive/2009/01/16/72176.html灝忚懕铇擱叡灝忚懕铇擱叡Fri, 16 Jan 2009 07:51:00 GMThttp://www.shnenglu.com/gracelee/archive/2009/01/16/72176.htmlhttp://www.shnenglu.com/gracelee/comments/72176.htmlhttp://www.shnenglu.com/gracelee/archive/2009/01/16/72176.html#Feedback0http://www.shnenglu.com/gracelee/comments/commentRss/72176.htmlhttp://www.shnenglu.com/gracelee/services/trackbacks/72176.html
鐪嬩笅闈唬鐮侊細

 1 class CBase {
 2 public:
 3     CBase()
 4     {
 5         cout << "CBase constructor()" << endl;
 6     }
 7     virtual ~CBase()
 8     {
 9         cout << "CBase destructor()" << endl;
10     }
11     
12     operator long()
13     {
14         cout << "CBase::operator long()" << endl;
15         return 0;
16     }
17     
18     operator char()
19     {
20         cout << "CBase::operator char()" << endl;
21         return 'a';
22     }
23 }
24 ;
25 class CDerived:public CBase
26 {
27 public:
28     CDerived()
29     {
30          cout << "CDerived constructor()" << endl;
31     }
32              
33     virtual ~CDerived()
34     {
35         cout << "CDerived destructor()" << endl;
36     }
37              
38     operator long()
39     {
40         cout << "CDerived::operator long()" << endl;
41         //return CBase::operator long();
           return *((CBase *)this);//change the above code to this looks better
42     }
43              
44 };
45 
46 void main()
47 {
48     CDerived d;
49     long lTmp = d;
50     cout << "lTmp=" << lTmp << endl;
51     char cTmp = d;
52     cout << "cTmp=" << cTmp << endl;
53 
54 }


鐢變簬瀹氫箟浜嗘搷浣滅閲嶈澆CDerived::operator long() 鍜孋Base::operator long()錛?9琛屽緱浠ョ紪璇戦氳繃銆傚悓鐞嗭紝瀹氫箟浜咰Base::operator char()錛?1琛屽彲浠ョ紪璇戙?br>
鎵ц緇撴灉涓猴細
CBase constructor()
CDerived constructor()
CDerived::operator long()
CBase::operator long()
lTmp=0
CBase::operator char()
cTmp=a
CDerived destructor()
CBase destructor()

榪欓噷娑夊強鍒扮殑姒傚康涓昏鏈夛細
1 綾繪垚鍛樻搷浣滅閲嶈澆錛堜嬌寰楃敤鎴峰畾涔夌被鍨嬭漿鎹負鍐呭緩綾誨瀷鎴愪負鍙兘銆傚浜庣敤鎴峰畾涔夌被鍨嬩箣闂寸殑杞崲錛岃繕鍙互閫氳繃鏋勯犲嚱鏁扮殑鏂瑰紡榪涜錛?br>2 鑷姩綾誨瀷杞崲銆傝嚜鍔ㄧ被鍨嬭漿鎹㈠彂鐢熺殑鎯呭喌鏈変互涓嬪嚑縐嶏細
鍑芥暟璋冪敤鏃朵紶閫掔殑瀹炲弬綾誨瀷涓庡嚱鏁板0鏄庝腑鎸囧畾鐨勫弬鏁扮被鍨嬩笉鍖歸厤
鍑芥暟榪斿洖鐨勫璞$被鍨嬩笌鍑芥暟澹版槑涓寚瀹氱殑榪斿洖綾誨瀷涓嶅尮閰?br>琛ㄨ揪寮忎腑鎿嶄綔鏁扮殑綾誨瀷涓嶄竴鑷達紙榪欐鏄笂闈緥瀛愪腑鐨勬儏鍐碉級

鏈夋剰鎬濈殑鏄紝鍗充嬌涓嶅畾涔塁Base::operator char()錛屼笂闈㈢殑51琛屼粛鑳介氳繃錛岀湡寰楁劅鍙圭紪璇戝櫒鐨勮仾鏄庢墠鏅轟簡錛屾垨璁稿彧鏄紪璇戝櫒source涓浜嗕竴浜涚殑if{}else{}鍛紵

]]>
VBScript鍐欑殑璁$畻寮傛垨鐨勪竴涓皬宸ュ叿http://www.shnenglu.com/gracelee/archive/2007/08/03/29278.html灝忚懕铇擱叡灝忚懕铇擱叡Fri, 03 Aug 2007 05:05:00 GMThttp://www.shnenglu.com/gracelee/archive/2007/08/03/29278.htmlhttp://www.shnenglu.com/gracelee/comments/29278.htmlhttp://www.shnenglu.com/gracelee/archive/2007/08/03/29278.html#Feedback0http://www.shnenglu.com/gracelee/comments/commentRss/29278.htmlhttp://www.shnenglu.com/gracelee/services/trackbacks/29278.html
'==========================================================================
'
'
'
 NAME: calc_xor.vbs
'
'
 COMMENT: Calculates the result of 'xor' all elements in the input
'
'
==========================================================================

Option Explicit

Dim strInput

'Promt for string to search for in log files
strInput = InputBox("Enter data to calc on.","calc xor","")

if strInput = "" then
    wscript.quit
end If

'MsgBox(Len(strInput))

Dim arrayBytes()
ReDim arrayBytes(Len(strInput)/2)

Dim i,nBytes
Dim chHalf1,chHalf2,chWhole
= 1
nBytes 
= 0

Do While (i < Len(strInput))
'Skip spaces between elements
Do While Asc(Mid(strInput,i,1)) = 32 'space
    i = i + 1
Loop 

    chHalf1 
= Asc(Mid(strInput,i,1))
    chHalf2 
= Asc(Mid(strInput,i+1,1))
    
'Check and convert first half

    
If chHalf1 >= 48 And chHalf1 <= 57 Then
        chHalf1 
= chHalf1 - 48
    
ElseIf chHalf1 >= 65 And chHalf1 <= 70 Then
        chHalf1 
= chHalf1 - 65 + 10
    
ElseIf chhalf1 >= 97 And chHalf1 <= 104 Then
        chHalf1 
= chHalf1 - 97 + 10
    
Else
        
MsgBox("invalid character")
        wscript.quit
    
End If
    
    
' Check and convert the second half
    If chHalf2 >= 48 And chHalf2 <= 57 Then
        chHalf2 
= chHalf2 - 48
    
ElseIf chHalf2 >= 65 And chHalf2 <= 70 Then
        chHalf2 
= chHalf2 - 65 + 10
    
ElseIf chHalf2 >= 97 And chHalf2 <= 104 Then
        chHalf2 
= chHalf2 - 97 + 10
    
Else
        
MsgBox("invalid character")
        wscript.quit
    
End If
    
    
' Combine the first and second halves together to form a whole byte
    chWhole = chHalf1 * 16 + chHalf2
    arrayBytes(nBytes) 
= chWhole
    i 
= i + 2
    nBytes 
= nBytes + 1
Loop

'MsgBox(CStr(nBytes) + " bytes all together")

Dim WshSHell
set WshShell = CreateObject("WScript.Shell")
WshShell.Run(
"calc")
WScript.Sleep(
100)
WshShell.AppActivate(
"Calculator")
WScript.Sleep(
100)

WshShell.SendKeys(
"{F6}"'Change to Decimal
'
WshShell.SendKeys("{F4}") 'Change to single byte
WScript.Sleep(100)
WshShell.SendKeys(
"0")
For i =1 to nBytes
    WshShell.SendKeys(
"{^}")
    WScript.Sleep(
100)
    WshShell.SendKeys(arrayBytes(i
-1))
    WScript.Sleep(
100)
    WshShell.SendKeys(
"{=}")
    WScript.Sleep(
100)
Next

WshShell.SendKeys(
"{F5}"'Change to Hex for easy recognition





]]>
鐢╯printf鏍煎紡鍖栧瓧絎︿覆http://www.shnenglu.com/gracelee/archive/2007/07/31/29085.html灝忚懕铇擱叡灝忚懕铇擱叡Tue, 31 Jul 2007 08:43:00 GMThttp://www.shnenglu.com/gracelee/archive/2007/07/31/29085.htmlhttp://www.shnenglu.com/gracelee/comments/29085.htmlhttp://www.shnenglu.com/gracelee/archive/2007/07/31/29085.html#Feedback2http://www.shnenglu.com/gracelee/comments/commentRss/29085.htmlhttp://www.shnenglu.com/gracelee/services/trackbacks/29085.htmlsprintf(mess,"This is field 1,Field 2,Field 3\n");

褰撹繖鏍風殑鍩熷緢澶氱殑鏃跺欙紝涓琛屾斁涓嶄笅錛屼負浜嗕究浜庨槄璇伙紝闇瑕佹妸瀹冧滑鍒嗘垚鍑犺錛?br>sprintf(mess,"This is filed 1,\
    Field 2,\
    Field 3,\
    ...
    Field n\n");

浣嗘槸錛岃繖鏍峰甫鏉ヤ釜闂錛屽氨鏄牸寮忓寲鍚庣殑mess鐨勫悇涓煙涔嬮棿灝變駭鐢熶簡涓嶆兂瑕佺殑瀛楃錛堝絀烘牸絳夛紝浣跨敤UE鍙互娓呮鐨勭湅鍒幫級錛屽師鍥犳槸鐢變簬浣跨敤浜嗙畫琛岀"\"錛坙ine-continuation character錛夛紝鑰屼笉鐢ㄧ畫琛岀鍙堟棤娉曢氳繃緙栬瘧錛圕2001錛夈?br>
榪欐椂鍙互鐢ㄥ弻寮曞彿鏉ユ妸鍚勪釜鍩熷垎闅斿紑錛岃繖鏍峰氨鏃㈣В鍐充簡鍙鎬х殑闂錛屽張瑙e喅浜嗙紪璇戦棶棰橈細
sprintf(mess,"This is filed 1,"
    "Field 2,"
    "Field 3,"
    ...
    "Field n\n");




]]>
亚洲综合精品香蕉久久网| 欧美精品一区二区精品久久| 久久99精品久久久久久水蜜桃 | 久久亚洲国产成人影院网站| 日本久久中文字幕| 久久久久无码精品国产| 久久久综合香蕉尹人综合网| 久久人人爽人人爽人人片AV不| 97久久超碰国产精品2021| 久久久久这里只有精品| 丰满少妇高潮惨叫久久久| 中文字幕精品久久久久人妻| 丰满少妇高潮惨叫久久久| 伊人久久大香线蕉综合网站| 久久精品国产亚洲欧美| 免费精品久久天干天干| 久久九九免费高清视频| 99re久久精品国产首页2020| 国内精品综合久久久40p| 天天综合久久久网| 久久亚洲精精品中文字幕| 婷婷久久五月天| 久久久久久国产精品无码下载| 九九久久99综合一区二区| 人妻久久久一区二区三区| 伊人精品久久久久7777| 久久精品女人天堂AV麻| 91亚洲国产成人久久精品网址| 久久久久久亚洲Av无码精品专口| 18禁黄久久久AAA片| 久久激情五月丁香伊人| 精品久久综合1区2区3区激情| 国产精品99久久精品| 国产精品无码久久综合| 久久99国产综合精品免费| 日韩AV无码久久一区二区| 久久婷婷五月综合97色一本一本| 久久香综合精品久久伊人| 国内精品久久久久影院薰衣草 | 久久伊人五月天论坛| 久久黄视频|