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

TOP

ÓÐЧµÄʹÓúÍÉè¼ÆCOMÖÇÄÜÖ¸Õë¨DÌõ¿î5£ºÁ˽â_com_ptr_t µÄÉè¼Æ±³ºó(Ò»)
2014-11-23 23:18:06 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1´Î
Tags£ºÓÐЧ ʹÓà Éè¼Æ COM ÖÇÄÜ Ö¸Õë Ìõ¿î Á˽â _com_ptr_t ±³ºó

Ìõ¿î5£ºÁ˽â_com_ptr_t Éè¼Æ±³ºóµÄÀúÊ·Ô­Òò
_com_ptr_tÊÇ΢ÈíÔÚVCÖеÄÒ»¸öרÓÐÄ£°æÀà¡£Ëü·â×°Á˶ÔIUnknownµÄQueryInterface()¡¢AddRef()ºÍRelease()µÄ²Ù×÷£¬²¢Ìṩ×Ô¼ºµÄһЩ³ÉÔ±º¯Êý´Ó¶ø¶ÔCOM½Ó¿ÚÖ¸Õë½øÐвÙ×÷¡£Í¬Ê±_com_ptr_t»¹¼ò»¯ÁËCOM½Ó¿Ú¶ÔÒýÓüÆÊýµÄ²Ù×÷ÒÔ¼°²»Í¬½Ó¿Ú¼äµÄ²éѯ²Ù×÷¡£

ҪʹÓÃ_com_ptr_tÕâ¸öÖÇÄÜÖ¸Õ룬Ê×ÏÈÐèÒªÓÃ_COM_SMARTPTR_TYPEDEFÕâ¸öºêÀ´ÉùÃ÷ÌØÒ컯(Specialization)°æ±¾µÄ_com_ptr_t Àà±ð¡£Ö®ºóÔò¿ÉÒÔʹÓÃÐÎÈç¡°½Ó¿ÚÃû³Æ+Ptr¡±ÕâÑùµÄÃû³ÆÀ´¶¨Òå´ËÖÖ½Ó¿ÚÀàÐ͵ÄÖÇÄÜÖ¸Õë¡£ÀýÈ磺

view plaincopy to clipboardprint _COM_SMARTPTR_TYPEDEF(ICalculator, __uuidof(ICalculator));
_COM_SMARTPTR_TYPEDEF(ICOMDebugger,__uuidof(ICOMDebugger));
HRESULT Calculaltor()
{
ICOMDebuggerPtr spDebugger = NULL;
ICalculatorPtr spCalculator (CLSID_CALCULATOR); //¹¹Ô캯Êý¿É´´½¨COM×é¼þ
int nSum = 0;
spCalculator->Add(1, 2, &nSum);

spDebugger = spCalculator; //×Ô¶¯µ÷ÓÃQueryInterface²éѯËùÐèÒªµÄ½Ó¿Ú
spDebugger->GetRefCount();

return S_OK;
£ý//ÎÞÐèÊÖ¶¯µ÷ÓÃRelease()£¬½Ó¿Ú»áÔÚÖÇÄÜÖ¸ÕëÎö¹¹Ê±×Ô¶¯µ÷ÓÃRelease()¡£
_COM_SMARTPTR_TYPEDEF(ICalculator, __uuidof(ICalculator));
_COM_SMARTPTR_TYPEDEF(ICOMDebugger,__uuidof(ICOMDebugger));
HRESULT Calculaltor()
{
ICOMDebuggerPtr spDebugger = NULL;
ICalculatorPtr spCalculator (CLSID_CALCULATOR); //¹¹Ô캯Êý¿É´´½¨COM×é¼þ
int nSum = 0;
spCalculator->Add(1, 2, &nSum);

spDebugger = spCalculator; //×Ô¶¯µ÷ÓÃQueryInterface²éѯËùÐèÒªµÄ½Ó¿Ú
spDebugger->GetRefCount();

return S_OK;
£ý//ÎÞÐèÊÖ¶¯µ÷ÓÃRelease()£¬½Ó¿Ú»áÔÚÖÇÄÜÖ¸ÕëÎö¹¹Ê±×Ô¶¯µ÷ÓÃRelease()¡£

_COM_SMARTPTR_TYPEDEFÕâ¸öºê£¬Ò»°ã·ÅÖÃÓÚµ¥¶ÀµÄÍ·ÎļþÖС£ÕâÑù£¬Ö»ÒªincludeÁË´ËÍ·ÎļþµÄÏà¹ØÎļþ£¬¶¼ÄÜʹÓÃÃû³ÆÎª¡°½Ó¿ÚÃû+Ptr¡±ÕâÖÖÀàÐ͵ÄÖÇÄÜÖ¸Õë¡£

ÕâʹµÃ_com_ptr_tÕâÌ×ÖÇÄÜÖ¸ÕëʹÓÃÆðÀ´Ïà¶Ô±È½Ï¼òµ¥£¬±àд´úÂëʱ²»´æÔÚÒ»´ó¶ÑÕë¶ÔÄ£°æµÄÀàÐͲÎÊý»¯¹ý³Ì¡£Ê¹ÓÃÕßÒ²¸Ð¾õ²»µ½Ä£°æµÄ´æÔÚ£¬ÓÃÀàËÆ½Ó¿ÚÖ¸ÕëµÄ·½Ê½¼´¿ÉʹÓôËÖÇÄÜÖ¸Õë¡£

Èç¹ûÏë̽¾¿_com_ptr_tÕâÌ×ÖÇÄÜÖ¸ÕëµÄÌØÒ컯¹ý³ÌÊÇÈçºÎÍê³ÉµÄ£¬ÎÒÃÇ¿ÉÒÔ½«ÌØÒ컯ʱºòËùÓõ½µÄ_COM_SMARTPTR_TYPEDEFÕâ¸öºêÕ¹¿ª£º

view plaincopy to clipboardprint typedef _com_ptr_t<_com_IIID> IMyInterfacePtr;
typedef _com_ptr_t<_com_IIID> IMyInterfacePtr;
ÆäÖÐ_com_IIID µÄÔ­ÐÍΪ£º

view plaincopy to clipboardprint template
class _com_IIID
template
class _com_IIID
¿ÉÒÔ¿´³ö_com_IIDÕâ¸öÀàÄ£°æµÄ¹¦ÄÜÊǶÔIIDºÍ¾ßÌåµÄÀàÐͽøÐзâ×°£¬²¢°ÑËûÃǰó¶¨ÔÚÒ»Æð¡£_com_ptr_tÔòÔٻὫ´Ë_com_IID²ÎÊý»¯Ö®ºóµÄÀàÐÍ×÷ΪÀàÐͲÎÊýµÄʵ²Î£¬´Ó¶ø¹¹ÔìÒ»¸öÌØÒ컯°æ±¾µÄÖÇÄÜÖ¸ÕëÀàÐÍ¡£

ÁíÍâÖµµÃÒ»ÌáµÄÊÇ£¬Èç¹ûÏ£ÍûʹÓÃ__uuidofÕâ¸övcרÓõĹؼü×Ö£¬ÔòÐèÒªÔÚ½Ó¿ÚÉùÃ÷µÄʱºò¼ÓÉÏÐÎÈ磺

view plaincopy to clipboardprint __declspec(uuid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"))
__declspec(uuid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"))
ÕâÑùµÄÓï·¨¡£ÈçÏÂÊÇICalculator½Ó¿ÚµÄÉùÃ÷£º

view plaincopy to clipboardprint interface __declspec(uuid("994D80AC-A5B1-430a-A3E9-2533100B87CE")) ICalculator : IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Add(
const int nNum1,
const int nNum2,
int *pnSum
) const = 0;

virtual HRESULT STDMETHODCALLTYPE Sub(
const int nMinuend,
const int nSubtrahend,
int *pnQuotient
) const = 0;
};
interface __declspec(uuid("994D80AC-A5B1-430a-A3E9-2533100B87CE")) ICalculator : IUnknown
{
virtual HRESULT STDMETHODCALLTYPE Add(
const int nNum1,
const int nNum2,
int *pnSum
) const = 0;

virtual HRESULT STDMETHODCALLTYPE Sub(
const int nMinuend,
const int nSubtrahend,
int *pnQuotient
) const = 0;
};
ÔÚ_com_ptr_t Öзâ×°Á˸ü¶àµÄ¹¦ÄÜÐÔº¯Êý£¨Èç¿ÉÒÔÔÚ¹¹ÔìÖÇÄÜÖ¸ÕëµÄʱºò´´½¨COM×é¼þ£©£¬²¢¿ÉÒÔͨ¹ý¸³ÖµÔËËã·û½øÐнӿڵIJéѯ¡£»òÐíÄã»áÎÊΪʲôCComPtr²»ÌṩÀàËÆµÄ²Ù×÷¡£Õâ¸öÒéÌâÉæ¼°µ½ÖÇÄÜÖ¸ÕëÉè¼ÆÔ­ÔòÉϵÄÎÊÌâ¡£ÎÒÃÇ»áÔÚ¡°ÔÚÉè¼ÆÔ­ÔòÖÐÕå×ÃÈ¡Éᡱ½øÐÐÉîÈëµÄÌÖÂÛ¡£

¿´Íê_com_ptr_tµÄһЩ»ù´¡Ó÷¨ºó£¬ÈÃÎÒÃÇÔÙÀ´ÉèÏëÒ»ÖÖÇé¿ö£ºÈç¹ûÎÒÃÇÓÐÒ»¸öCOM×é¼þ£¬µ«È´Äò»µ½ËûµÄÍ·Îļþ£¬ÄÇôÔÚVCÖÐÓ¦¸ÃÈçºÎ²Ù×÷ËûÃÇÄØ£¿»òÐíÄãÈÏΪÄò»µ½Í·ÎļþÈ´Òªµ÷Óú¯ÊýµÄÇé¿ö²»Ì«¿ÉÄÜ·¢Éú£¬ÒòΪÕâÑù×öÄãµÄ´úÂëÎÞ·¨Í¨¹ý±àÒë¡£µ«ÊÂʵÊÇ£¬È±ÉÙC/C++Í·ÎļþÕâÒ»ÏÖÏóÈ´´æÔÚÓÚ´óÁ¿µÄCOM×é¼þÖ®ÖС£

ÕâЩCOMµÄÉè¼ÆÕß²¢·ÇûÓÐÕչ˵½C/C++µÄ³ÌÐòÔ±£¨ºÜ´ó³Ì¶ÈÉÏ£¬

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

ÆÀÂÛ

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