ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

ÓÐЧµÄʹÓúÍÉè¼ÆCOMÖÇÄÜÖ¸Õë¨DÌõ¿î4£ºÀí½âATLµÄCComPtrÌᳫ¼òµ¥(Ò»)
2014-11-23 23:18:06 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:2´Î
Tags£ºÓÐЧ ʹÓà Éè¼Æ COM ÖÇÄÜ Ö¸Õë Ìõ¿î Àí½â ATL CComPtr Ìᳫ ¼òµ¥

Ìõ¿î4£ºÀí½âATLµÄCComPtrÌᳫ¼òµ¥£¬¸ßЧ
΢ÈíÍÆ³öCOM SDKºóºÜ¿ì¾ÍÒâʶµ½Ö±½ÓʹÓÃSDK¿ª·¢COMÊÇÒ»¼þºÜÀ§ÄѵÄÊÂÇé¡£ÓÚÊÇËûËù×öµÄµÚÒ»¼þÊÂÇéÊǽ«COM¼¯³Éµ½MFCÖÐÈ¥¡£µ«ÊÇËæ×ÅInternetµÄ·¢Õ¹£¬·Ö²¼Ê½×é¼þÒªÇóCOMÄÜÔÚÍøÂçÉÏ´«Ê䣬µ«ÕâÈ´¸øMFC¿ª·¢COM×é¼þ´øÀ´ÁËÏ൱´óµÄÕϰ­¡ª¡ªMFCÓ·Öס¢ÅÓ´ó¶øÇÒ»¹ÒªÒÀÀµºÜ¶àDLLÎļþ¡£ÔÚÕâÖÖÇé¿öÏÂATLµ®ÉúÁË¡£

ATL¡¾2¡¿ÊÇActiveX Template Library µÄËõд¡£²»Í¬ÓÚMFC£¬ATL²ÉÓÃÁËÈç¶à¼Ì³ÐºÍÄ£°æÕâÁ½ÖÖC++µÄ¸ß½×±à³Ì¼¼ÇÉ¡£¿ª·¢ÈËÈËÔ±²»½öÄܹ»¿ìËٵؿª·¢³ö¸ßЧ¡¢¼ò½àµÄ´úÂ루Effective and Slim code£©£¬¶øÇÒ¿ª·¢³öµÄ×é¼þ¸ü¼ÓµÄÇá±ãСÇÉ¡£µ«ÓÉÓÚÄ£°æºÍ¶à¼Ì³ÐµÄ¼ÓÈ룬ѧϰATLÒ²¸ü¼Ó¸´ÔÓһЩ¡£

¶øCComPtrÊÇATLΪÁ˽â¾öCOMÒýÓüÆÊý´øÀ´µÄÎÊÌ⣬ÌṩµÄÒ»¸öÀàÄ£°æ¡£Òò´ËÄã¿ÉÄÜÃ÷°×ÁË¡£ÖÇÄÜÖ¸ÕëÐèҪͨ¹ýÄ£°æÀ´ÊµÏÖ£¨´ó¶àÊýÖÇÄÜÖ¸Õ뿼Âǵ½Í¨ÓÃÐÔ¶¼ÊÇÕâôÉè¼Æ£¬Ò²ÓÐÉÙÊýÀýÍ⣩¡£Òò´ËÄãËÆºõÃ÷°×ÁË¡°ÖÇÄÜÖ¸Õ롱ֻÊÇÕâÖÖÌØ¶¨Ä£°æµÄÒ»¸ö½ÏΪͨË×Ò×¶®µÄ±ðÃû¡£Ëü²»»áÈÃÈËÓÐÖÖ£¬ÒòΪʹÓÃÁËÄ£°æÕâÀà¸ß¼¶µÄC++±à³Ì¼¼Çɶø²úÉú¸ß²»¿ÉÅʵĸоõ¡£Í¬Ê±ÔÚʹÓúÍËüµÄÐÐΪÉÏÒ²¸ü¼ÓÀàËÆÓÚÒ»¸ö½Ó¿ÚÖ¸Õë¡£

ATL³ýÁËÌṩCComPtr»¹ÌṩÁËÒ»¸öÃûΪCComQiPtrµÄÖÇÄÜÖ¸Õë¡£Á½¸öÖÇÄÜÖ¸ÕëµÄÄ£°æÀàÓÃÓÚʵÏÖ¶ÔCOM½Ó¿ÚÒýÓüÆÊýµÄ×Ô¶¯¹ÜÀí£¬ÇÒ¶¼ÔÚÖÐÉùÃ÷¡£

ÕâÁ½¸öÄ£°æÀà¶¼¼Ì³Ð×ÔCComPtrBase£¬²»Í¬Ö®´¦ÔÚÓÚCComQiPtrÄÜÔÚ±ØÒªµÄʱºò×Ô¶¯µÄ¶ÔËùÐè½Ó¿Ú½øÐвéѯ£¨È磺¶ÔÓë´ËÖÇÄÜÖ¸Õë²ÎÊý»¯ÀàÐͲ»Í¬µÄÖ¸Õ븳ֵʱ£¬»á×Ô¶¯²éѯÊÇ·ñÓÐËùÐèµÄ½Ó¿Ú£©¡£CComPtrBaseÀà·â×°ÁËCComPtrºÍCComQiPtrÖй«¹²µÄ´ó¶àÊýº¯Êý£¬´Ó¶øÊµÏÖ´úÂëµÄ¸´Óá£ÏÂͼÏÔʾÁËÕâ3¸öÄ£°æÀàµÄ¼Ì³Ð¹ØÏµ£º

ÖµµÃ×¢ÒâµÄÊÇÈç¹ûÄãµÄVC±àÒëÆ÷°æ±¾¹ýÓÚÀϾɣ¨±ÈÈçvc6.0£©ÔòÔÚATLÖÐÎÞ·¨Ê¹Óõ½CComQiPtr£¬Ò²¿´²»µ½CComPtrBaseÕâ¸ö»ùÀà¡£½ö½öÓÐCComPtr¹ÂÁãÁãµÄ´ôÔÚÕâ¸öÍ·ÎļþÖС£ÕâÊÇÒòΪÔÚÔçÆÚµÄATLÖУ¬Éè¼ÆÕßÖ»ÊÇÉè¼ÆÁËCComPtrÕâôһ¸öÄ£°æÀà¡£¶øºóÆÚΪÁ˼ÓÈëÐµĹ¦ÄܲŽ«CComPtrºÍCComQiPtrµÄ´úÂë³é³öÀ´·ÅÈëµ½CComPtrBaseÕâ¸ö»ùÀàÖÐÈ¥¡£

Òò´Ë±¾ÎĽöÌÖÂÛCComPtrÒÔ¼°Æä»ùÀàCComPtrBase£¬¶ø²»Éæ¼°¹ØÓÚCComQiPtrµÄÄÚÈÝ£¨ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ²éÔÄMSDN»òÔĶÁATLÔ´ÂëÁ˽âÆäÖеÄϸ½Ú£©¡£ÔÚCComPtrÖгýÁ˹¹Ô캯ÊýºÍ¸³ÖµÔËËã·ûÖ®ÍâµÄ´ó¶àÊýº¯Êý¶¼Ô´×ÔÓÚCComPtrBase£¬ÎªÁË·½±ãÔĶÁºÍÀí½â£¬±¾ÎĻὫÕâÁ½¸öÀàÖеijÉÔ±º¯Êý·ÅÔÚÒ»ÆðÌÖÂÛ¡£

ÈÃÎÒÃÇÔÙÀ´¿´Ò»´ÎCComPtrµÄʹÓ㬻òÐí½ø¹ýÒ»·¬½éÉÜÒÔºó£¬Äã»á¶ÔËûÄÚ²¿ÈçºÎ¹ÜÀíÒýÓüÆÊýÓиü¼ÓÉî¿ÌµÄÀí½â£º

ÒÔIHello*ΪÀý£¬½«³ÌÐòÖÐËùÓнӿÚÖ¸ÕëÀàÐÍ£¨³ýÁ˲ÎÊý£©£¬¶¼Ê¹ÓÃCComPtr ´úÌæ¼´¿É¡£¼´³ÌÐòÖгýÁ˲ÎÊýÖ®Í⣬ÔÙÒ²²»ÒªÊ¹ÓÃIHello*£¬È«²¿ÒÔCComPtr´úÌæ¡£

ÈçÏ£º

view plaincopy to clipboardprint void SomeApp( IHello * pHello )
{
CComPtr pCopy = pHello;
OtherApp();
pCopy->Hello();
}
void SomeApp( IHello * pHello )
{
CComPtr pCopy = pHello;
OtherApp();
pCopy->Hello();
}

×îºóÖµµÃÒ»ÌáµÄÊÇ£¬ËäÈ»CComPtrµÄÓ÷¨ºÍÆÕͨCOM½Ó¿ÚÖ¸ÕëÀàËÆ£¬µ«ÊÇ»¹ÊÇÒªÖ÷ÒªÈçϼ¸¸öÎÊÌ⣺

1. CComPtrÒѾ­±£Ö¤ÁËAddRefºÍReleaseµÄÕýÈ·µ÷Óã¬ËùÒÔ²»ÐèÒª£¬Ò²²»Äܹ»ÔÙµ÷ÓÃAddRefºÍRelease¡£

2. Èç¹ûÒªÊÍ·ÅÒ»¸öÖÇÄÜÖ¸Õ룬ֱ½Ó¸øËü¸³NULLÖµ¼´¿É¡£

3. CComPtr±¾ÉíÎö¹¹µÄʱºò»áÊÍ·ÅCOMÖ¸Õë¡£

4. µ±¶ÔCComPtrʹÓÃ&ÔËËã·û£¨È¡Ö¸ÕëµØÖ·£©µÄʱºò£¬ÒªÈ·±£CComPtrΪNUL¡££¨ÒòΪͨ¹ýCComPtrµÄµØÖ·¶ÔCComPtr¸³ÖµÊ±£¬²»»á×Ô¶¯µ÷ÓÃAddRef£¬Èô²»ÎªNULL£¬ÔòÇ°ÃæµÄÖ¸Õë²»ÄÜÊÍ·Å£¬CComPtr»áʹÓÃassert±¨¾¯£©

ATL×·ÇóµÄÊǼò½àÓë¸ßЧ£¬Òò´ËÔÚ½â¾öÒ»¸öÎÊÌâ֮ʱ£¬CComPtr²»»á½«½â¾öÎÊÌâµÄ·½Ê½×öµ½ÃæÃæ¾ãµ½¡£ÀýÈçÈç¹ûÓÃÒ»ÖÖ·½·¨Äܹ»½â¾öÕâÒ»ÎÊÌ⣬ATL¾¡¿ÉÄܲ»»á²ÉÓõڶþÖÖ·½·¨£¨³ý·ÇÕâÁ½ÖÖ·½·¨È·ÊµÓв»Í¬Ö®´¦£©¡£

ÕâÒ»µã´ÓATLµÄ¹¹Ô캯Êý¿ÉÒÔ¿´³ö£¬ËûÖ»ÓÐ4¸ö¹¹Ô캯Êý£º1¸ö±ØÒªµÄĬÈϹ¹Ô캯Êý£¬1¸ö±ØÒªµÄ¿½±´¹¹Ô캯Êý¡£»¹ÓÐ2¸öΪÁËÂú×ãÖ¸ÕëÓï·¨¶ø´æÔÚµÄת»»¹¹Ô캯Êý¡£ÕâÑù¡°Ç¡µ±ºÃ´¦¡±¾Í×ã¹»ÁË¡£ÖÁÓÚ×é¼þµÄ´´½¨¹ý³Ì£¬½Ó¿ÚµÄ²éѯ¹ý³Ì£¬ATLÈÏΪÕâЩ¶«Î÷¶¼¿ÉÒÔͨ¹ý¹¹ÔìºÃÖ®ºóµÄÖÇÄÜÖ¸ÕëÀ´Íê³É¡£ÈçÏ£º

view plaincopy to clipboardprint CComPtr spCalculator= NULL;
hrRetCode = spCalculator.CoCreateInstance(CLSID_CALCULATOR);
KG_COM_ASSERT_EXIT(hrRetCode);
hrRetCode = spCalculator->Add(1, 2, &nSum);
KG_COM_ASSERT_EXIT(hrRetCode);
CComPtr spCalculator= NULL;
hrRetCode = spCalculator.CoCreateInstance(CLSID_CALCULATOR);
KG_COM_ASSERT_EXIT(hrRetCode);
hrRetCode = spCalculator->Add(1, 2, &nSum);
KG_COM_ASSERT_EXIT(hrRetCode);

ÉÏÊö´úÂëÖÐÄã¿ÉÄܻỳÒÉÖÇÄÜÖ¸ÕëûÓÐÂú×ãRAII£¬µ«ÊÇËûȷʵÂú×ãÁË¡£RAII²¢Ã»ÓÐÒªÇó×ÊÔ´¹ÜÀí¶ÔÏóÓë×ÊԴͬÉùÃ÷ÖÜÆÚ¡£ËûÖ»ÊÇÐèÒª×ÊÔ´ÔÚ»ñȡ֮´¦¾ÍÓëÒ»¸ö×ÊÔ´¹ÜÀí¶ÔÏó°ó¶¨ÆðÀ´¡£ATLÈÏΪÕâÑù×ö×î¹»ÁË£¬¶øÇÒ´úÂëÇåÎú¼òµ¥£¬ÄÇôËûÕâÑù×öÁË¡£

ÔÙÀ´¿´¿´CComPtrµÄ¸³ÖµÔËËã·û£¬Ëû²¢Ã»ÓÐ×ö×Ô¶¯µÄ½Ó¿Ú²éѯ¹¤×÷£¨ÐèҪ˵Ã÷µÄÊÇ£¬CComPtrÔÚºóÐø°æ±¾ÖÐΪ²¿·Ö¸³ÖµÔËËã·û¼ÓÈëÁË´ËÖÖ²Ù×÷£©¡£ATLÈÏΪÓÐÁËQueryInterfaceÕâÌ×½Ó¿Ú£¬Ôò¿ª·¢ÈËÔ±¾ÍÄÜ·½±ãµÄÍê³É½Ó¿Ú²éѯ¹¤×÷ÁË¡£ÈçÏ£º

view plaincopy to clipboardprint ICalculator* pCalculator = NULL;
CComPtr spIUnknown = NULL;
hrRetCode = spIUnknown.CoCreateInstance(CLSID_CALCULATOR);
KG_COM_ASSERT_EXIT(hrRetCode);
hrRetCode = spIUnknown.QueryInterface(&pCalculator);//ͨ¹ý´Ëº¯Êý²éѯ½Ó¿Ú
KG_COM_ASSERT_EXIT(hrRetCode);
hrRetCode = pCalculator->Add(1, 2, &nSum);
KG_COM_ASSERT_EXIT(hrRetCode);
ICalculator* pCalculator = NULL;
CComPtr spIU

Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºÓÐЧµÄʹÓúÍÉè¼ÆCOMÖÇÄÜÖ¸Õë¨DÌ.. ÏÂһƪ£ºCÓïÑÔÑ­»·µÄСÒÕÊõ

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ: