ÓÐЧµÄʹÓúÍÉè¼ÆCOMÖÇÄÜÖ¸Õë¨D¨DÌõ¿î2£ºÒýÓüÆÊýµÄÊÇÓë·Ç

2014-11-23 23:11:45 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 5

Ìõ¿î2£ºÒýÓüÆÊýµÄÊÇÓë·Ç
ʹÓÃCOM×ö¿ª·¢µÄ³ÌÐòÔ±ÍùÍù»á±»½Ó¿ÚÒýÓüÆÊýËù´øÀ´µÄÎÊÌâ¸ãµÃÍ·ÆÆÑªÁ÷¡£ÒýÓüÆÊýÕâ¸öÀÏ´óÄÑÎÊÌâ´æÔÚµÄÔ­ÒòÒ²Ï൱¼òµ¥£ºÔÚCOM¿ª·¢ÖУ¬¿Í»§½ö½öÖªµÀ×é¼þµÄ½Ó¿Ú¡£µ±Ê¹ÓÃÍêÒ»¸ö½Ó¿Ú¶øÒªÊ¹ÓÃÁíÍâÒ»¸ö½Ó¿Úʱ£¬ÓÉÓÚ¿Í»§²¢²»ÖªµÀÁ½¸ö½Ó¿ÚÊÇ·ñÖ¸Ïòͬһ×é¼þ£¬Òò´Ë¿Í»§ÎÞ·¨Ö±½Ó½«×é¼þÊÍ·Å¡£COM×é¼þµÄÉúÃüÖÜÆÚÒ²Òò´ËÎÞ·¨±»¿Í»§·½±ãµÄ¿ØÖÆ¡£

ÓÚÊÇΪÁ˽â¾öÕâÒ»ÎÊÌ⣬COM×齨ʹÓÃÁËÒýÓüÆÊý¡£Ã¿¸ö×é¼þ¸ù¾ÝÒýÓüÆÊýµÄÊýÖµ¾ö¶¨ºÎʱÊÍ·Å×ÔÉíËùÕ¼ÓõÄ×ÊÔ´¡£µ±¿Í»§´Óij¸ö×é¼þ²éѯ³öÒ»¸ö½Ó¿Úʱ£¬´ËÒýÓüÆÊýÖµ½«Ôö1¡£µ±¿Í»§Ê¹ÓÃÍê´Ë½Ó¿Úʱ£¬´ËÒýÓÃÖµ¼õ1¡£Èç¹ûij¸ö×é¼þµÄÒýÓüÆÊýÖµ½µÖÁ0ʱºò£¬×é¼þÔò»á½«×Ô¼º´ÓÄÚ´æÖÐɾ³ý¡£

ͨ¹ýÒýÓüÆÊýȷʵ¿ÉÒԺܺÏÀíµÄ¹ÜÀí×é¼þµÄÉúÃüÖÜÆÚ£¬µ«Ò²ÑϸñÒªÇ󿪷¢ÈËÔ±×ñÑ­ÏÂÃæÕâÈýÌõ¼òµ¥¹æÔò¡¾1¡¿£º

1.ÔÚ·µ»ØÖ®Ç°µ÷ÓÃAddRef¡£¶ÔÓÚÄÇЩ·µ»Ø½Ó¿ÚÖ¸ÕëµÄº¯Êý£¬ÔÚ·µ»ØÇ°Ó¦ÓÃÏàÓ¦µÄÖ¸Õëµ÷ÓÃAddRef¡£ÕâЩº¯Êý°üÀ¨QueryInterface¼°CreateInstance¡£ÕâÑùµ±¿Í»§´ÓÕâÖÖº¯ÊýµÃµ½Ò»¸ö½Ó¿Úºó£¬Ëû½«ÎÞÐèµ÷ÓÃAddRef¡£

2.ʹÓÃÍê½Ó¿ÚÖ®ºóµ÷ÓÃRelease¡£ÔÚʹÓÃÍêij¸ö½Ó¿ÚÖ®ºóÓ¦µ÷Óô˽ӿڵÄReleaseº¯Êý¡£

3.ÔÚ¸³ÖµÖ®ºóµ÷ÓÃAddRef¡£½«Ò»¸ö½Ó¿ÚÖ¸Õ븳ֵ¸øÁíÍâÒ»¸ö½Ó¿ÚÖ¸Õëʱ£¬Ó¦µ÷ÓÃAddRef¡£»»¾ä»°Ëµ£¬ÔÚ½¨Á¢½Ó¿ÚµÄÁíÍâÒ»¸öÒýÓÃÖ®ºóÓ¦Ôö¼ÓÏàÓ¦×é¼þµÄÒýÓüÆÊý¡£

¸ù¾ÝÈçÉÏÈýÌõÔ­ÔòÎÒÃÇÐèÒª±àд³öÁËÐÎÈçÏÂÀýµÄ´úÂ룺

view plaincopy to clipboardprint void SomeApp( IHello * pHello )
{

IHello* pCopy = pHello;
pCopy->AddRef();
OtherApp();
pCopy->Hello();
pCopy->Release();
}
void SomeApp( IHello * pHello )
{

IHello* pCopy = pHello;
pCopy->AddRef();
OtherApp();
pCopy->Hello();
pCopy->Release();
}

ÕâÈýÌõ¹æÔò¿´ËƼòµ¥£¬µ«ÊdzÌÐòÔ±ÈôÔÚijһʱ¿ÌÒÅ©µôÆäÖеÄijÌõ¹æÔò£¬Ôò»áʹµÃÒýÓüÆÊýÏÝÈë»ìÂÒ¡£³ö´íºó£¬×îÀÖ¹ÛµÄÇé¿öÊdzÌÐòÓÉÓÚ·ÃÎÊÁËÒѾ­±»ÊͷŵÄ×ÊÔ´£¬¶øÖ±½Ó±ÀÀ£¡£Èç¹ûÔËÆø²»ÊÇÌØ±ðºÃ£¬ÄÇô×ÊԴй¶ÔòÇÄÎÞÉùÏ¢µÄ·¢ÉúÁË¡£

¿ÉÒÔ¿´³öÓÉÓÚÒýÓüÆÊýµÄÒýÈ룬COM×é¼þµÄÉúÃüÖÜÆÚ¿ÉÒÔ×ÔÐйÜÀí£¬µ«Í¬Ê±Ò²Ê¹µÃCOMµÄʹÓñäµÃ·Ç³£Î£ÏÕ¡£ÒòΪʹÓùý³ÌÖÐÐèҪÿһ¸öʹÓÃÕß¶¼ÒªÑϸñ²¢ÇÒÕýÈ·µÄµ÷ÓÃAddRef()ºÍRelease()£¬Ò»µ©³öÏÖÎÊÌ⣬¾Í»áÔì³É¶ÔÏó²»Äܱ»Õý³£ÊÍ·Å£¬»òÕß¶ÔÏó±»Öظ´É¾³ý£¬Ôì³É³ÌÐò±ÀÀ£¡£ËùÒÔʹÓÃCOM½Ó¿Ú£¬±ØÐëСÐÄÒíÒí²ÅÐС£

ÎÒÃÇÊÔ×ÅÓÃÖÇÄÜÖ¸Õë¸ÄдÉÏÊö´úÂë¡£ÕâÀïÒÔCComPtrΪÀý£¬¸ü¶à¹ØÓÚËüµÄ½éÉÜÎÒÃǷŵ½ºóÐøÌõ¿îÖС£ÉÏÊöº¯Êý½«»á±ä³ÉÈçÏÂÕâÖÖÐÎʽ£º

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

ÖÇÄÜÖ¸Õë¸øÎÒ´øÀ´ÁËÒýÓüÆÊýµÄ°ë×Ô¶¯»¯´¦Àí£¨Ö®Ëùһ˵Êǰë×Ô¶¯»¯£¬ÊÇÒòΪÓÐЩµØ·½ÈÔÈ»ÐèÒªÊÖ¶¯¹ÜÀíÒýÓüÆÊý£©¡£AddRef()ºÍRelease()²Ù×÷²»¼ûÁË£¬´úÂë¼ò½àÁ˲»ÉÙ£¬¶ø¸üÖØÒªµÄÊÇËü»¹½«´øÀ´¸ü¶àµÄ±ãÀûÌõ¼þ¡£ÎÒÃÇÔÚÖ®ºóµÄÌõ¿îÖÐ»á½øÒ»²½ÌÖÂÛ¡£

×÷Õß¡°liuchang5µÄרÀ¸¡±