Ìõ¿î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
OtherApp();
spHello->Hello();
}
void SomeApp( IHello * pHello )
{
CComPtr
OtherApp();
spHello->Hello();
}
ÖÇÄÜÖ¸Õë¸øÎÒ´øÀ´ÁËÒýÓüÆÊýµÄ°ë×Ô¶¯»¯´¦Àí£¨Ö®Ëùһ˵Êǰë×Ô¶¯»¯£¬ÊÇÒòΪÓÐЩµØ·½ÈÔÈ»ÐèÒªÊÖ¶¯¹ÜÀíÒýÓüÆÊý£©¡£AddRef()ºÍRelease()²Ù×÷²»¼ûÁË£¬´úÂë¼ò½àÁ˲»ÉÙ£¬¶ø¸üÖØÒªµÄÊÇËü»¹½«´øÀ´¸ü¶àµÄ±ãÀûÌõ¼þ¡£ÎÒÃÇÔÚÖ®ºóµÄÌõ¿îÖÐ»á½øÒ»²½ÌÖÂÛ¡£
×÷Õß¡°liuchang5µÄרÀ¸¡±