ActiveX¿Ø¼þµÄMFCÉè¼ÆÖ®ÂÃ

}

//ÕâÈý¸öº¯ÊýÊÇÐÂÌí¼ÓµÄ½Ó¿ÚʵÏֵĺ¯Êý£¬Ò»°ãʵÏÖ»¹Êǵ÷ÓÃÔ­½Ó¿ÚµÄº¯Êý£¬ÕâÀï¼ÓÉÏÒ»¸öÃèÊö£¬±íʾÊÇ´ÓvtableÖе÷Óõġ£

STDMETHODIMP CTDualCtrl::XTDual::put_Hello(BSTR newText) {

METHOD_PROLOGUE(CTDualCtrl, TDual)

// MFC automatically converts from Unicode BSTR to // Ansi CString, if necessary... CString str = newText;

pThis->m_hello = \ pThis->OnHelloChanged(); return NOERROR; }

STDMETHODIMP CTDualCtrl::XTDual::get_Hello(BSTR* ret) {

METHOD_PROLOGUE(CTDualCtrl, TDual)

// MFC automatically converts from Ansi CString to // Unicode BSTR, if necessary... pThis->m_hello.SetSysString(ret); return NOERROR; }

STDMETHODIMP CTDualCtrl::XTDual::SayHello(BSTR strHello) {

METHOD_PROLOGUE(CTDualCtrl, TDual)

// MFC automatically converts from Ansi CString to // Unicode BSTR, if necessary... CString str = strHello;

str = \ pThis->SayHello(str); return NOERROR; }

4.Á¬½ÓеĽӿڵ½MFCµÄQueryInterface½Ó¿Ú±í»úÖÆ£¬Ê¹Äܹ»Í¨¹ýQueryInterface»ñµÃITDual½Ó¿Ú¡£

ÔÚ.h ÖÐÌí¼Ó public:

///////////////////////////////////////////////////////////////////////////// // Double Interface Part

DECLARE_INTERFACE_MAP()

BEGIN_DUAL_INTERFACE_PART(TDual, ITDual)

STDMETHOD(put_Hello)(THIS_ BSTR newText); STDMETHOD(get_Hello)(THIS_ BSTR FAR* ret); STDMETHOD(SayHello)(THIS_ BSTR strHello); END_DUAL_INTERFACE_PART(TDual)

ÔÚ.cppÖÐÌí¼Ó

///////////////////////////////////////////////////////////////////////////// // Event map

BEGIN_EVENT_MAP(CTDualCtrl, COleControl) //{{AFX_EVENT_MAP(CTDualCtrl)

// NOTE - ClassWizard will add and remove event map entries

// DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_EVENT_MAP END_EVENT_MAP()

//½«ÐµĽӿÚÁ¬½Óµ½QueryInterface»úÖÆ

BEGIN_INTERFACE_MAP(CTDualCtrl, COleControl)

INTERFACE_PART(CTDualCtrl, IID_IDispatch, Dispatch) INTERFACE_PART(CTDualCtrl, DIID__DTDual, Dispatch) INTERFACE_PART(CTDualCtrl, IID_ITDual, TDual) END_INTERFACE_MAP()

5.Õâʱ±àÒëµÄ»°£¬»áÌáʾ´íÎó£¬ÒòΪûÓÐITDual½Ó¿ÚÉùÃ÷ºÍһЩIIDµÄ¶¨Òå¡£µã»÷TDual.odlÓÒ¼ü£¬µ¯³öÉèÖò˵¥£¬Ñ¡Ôñ Setting²Ëµ¥ÏÔÚOutput header file nameÖмüÈëÄãÏëÒªÊä³öµÄ½Ó¿Ú.hÎļþÃû£¬ÕâÀïÓõÄÊÇITDual.h£¬È»ºó½«ITDual.h°üÀ¨ÔÚstdafx.hÖУ¬ÒÔ±ã¿ÉÒÔÔÚ¸÷´¦Óõ½¡£

½ÓÏÂÀ´Ð½¨Ò»¸öinitIIDs.cppÎļþ£¬¼ÓÉÏÏÂÃæ´úÂë #include #include #include \

Õâ¸öinitIIDs.cppûʲôÓô¦£¬Ö»ÊÇÓÃÀ´ÊµÏÖÒªÓõ½µÄ¼¸¸öIIDµÄ£¬²»¹ýÒªÔÚProject-SettingÖÐ°Ñ initIIDs.cppµÄPrecompiled HeadersÉèÖÃΪNot using precompiled headers¡£ ±àÒëÒ»ÏÂTDual.odl£¬OKÁË

6.Ìí¼ÓÒì³£´¦ÀíºÍ×Ô¶¯»¯´íÎó½Ó¿Ú£¬Õⲿ·Ö±¾ÀýδÌṩ£¬ÓÐÐËȤµÄ¿ÉÒԲο¼acdualÀý×Ó¡£

7.н¨Ò»¸öÆÕͨµÄMFC¶Ô»°¿òexe¹¤³Ìtestdual£¬ÔÚ¹¤³ÌÖÐÒýÈëTDual.ocx£¬ÕâÀïÓõķ½·¨ÊÇÔÚstdafx.hÖмÓÈë#import \¡£

ΪCTestdualDlgÌí¼Ó³ÉÔ±±äÁ¿CWnd m_wnd£¬ÏìÓ¦WM_CREATEÏûÏ¢£¬Ìí¼ÓÈçÏ´úÂë CRect rect(10, 10, 100, 100);

BOOL b = m_wnd.CreateControl(__uuidof( TDual ), NULL, WS_CHILD | WS_VISIBLE, rect, this, 1);

if(!b){

AfxMessageBox(\ return 0; }

LPUNKNOWN pukn = m_wnd.GetControlUnknown(); if(!pukn){

AfxMessageBox(\ return 0;

}

ITDual* pdual = NULL;

pukn->QueryInterface(__uuidof(ITDual), (void**)&pdual); if(!pdual){

AfxMessageBox(\ return 0; }

CString str = \

pdual->SayHello(str.AllocSysString()); pdual->put_Hello(str.AllocSysString()); pdual->Release();

±àÒëÔËÐУ¬¾ßÌå½á¹û¾Í²»ËµÁË£¬Ò»¿´±ãÖª¡£

ÒòΪ±¾ÎÄÖ÷Òª½²ÊöÈçºÎ×ö£¬ÖÁÓÚΪʲôҪÈç´Ë×ö¾Í²»ËµÁË£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔ×Ô¼ºÑо¿£¬ÕâÀïÌṩ¼¸¸öÍøÖ·£¬½ö¹©²Î¿¼

http://www.microsoft.com/china/m ... /visualc/atlmfc.asp

http://blog.csdn.net/RedStar81/archive/2003/04/03/19761.aspx

ÏÂÃæÊÇacdualÀý×ÓÖеÄһЩºê¶¨Òå´úÂë

#define BEGIN_DUAL_INTERFACE_PART(localClass, baseClass) \\ BEGIN_INTERFACE_PART(localClass, baseClass) \\

STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo); \\

STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo); \\

STDMETHOD(GetIDsOfNames)(REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, LCID lcid, DISPID FAR* rgdispid); \\

STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr); \\

///////////////////////////////////////////////////////////////////// // END_DUAL_INTERFACE_PART is just like END_INTERFACE_PART. It // is only added for symmetry...

#define END_DUAL_INTERFACE_PART(localClass) \\ END_INTERFACE_PART(localClass) \\

/////////////////////////////////////////////////////////////////////

// DELEGATE_DUAL_INTERFACE expands to define the standard IDispatch // methods for a dual interface, delegating back to the default // MFC implementation

#define DELEGATE_DUAL_INTERFACE(objectClass, dualClass) \\

STDMETHODIMP_(ULONG) objectClass::X##dualClass::AddRef() \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\ return pThis->ExternalAddRef(); \\ } \\

STDMETHODIMP_(ULONG) objectClass::X##dualClass::Release() \\

{ \\

METHOD_PROLOGUE(objectClass, dualClass) \\ return pThis->ExternalRelease(); \\ } \\

STDMETHODIMP objectClass::X##dualClass::QueryInterface( \\ REFIID iid, LPVOID* ppvObj) \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\

return pThis->ExternalQueryInterface(&iid, ppvObj); \\ } \\

STDMETHODIMP objectClass::X##dualClass::GetTypeInfoCount( \\ UINT FAR* pctinfo) \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\

LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); \\ ASSERT(lpDispatch != NULL); \\

return lpDispatch->GetTypeInfoCount(pctinfo); \\ } \\

STDMETHODIMP objectClass::X##dualClass::GetTypeInfo( \\ UINT itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\

LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); \\ ASSERT(lpDispatch != NULL); \\

return lpDispatch->GetTypeInfo(itinfo, lcid, pptinfo); \\ } \\

STDMETHODIMP objectClass::X##dualClass::GetIDsOfNames( \\ REFIID riid, OLECHAR FAR* FAR* rgszNames, UINT cNames, \\ LCID lcid, DISPID FAR* rgdispid) \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\

LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); \\ ASSERT(lpDispatch != NULL); \\

return lpDispatch->GetIDsOfNames(riid, rgszNames, cNames, \\ lcid, rgdispid); \\ } \\

STDMETHODIMP objectClass::X##dualClass::Invoke( \\

DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, \\ DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, \\ EXCEPINFO FAR* pexcepinfo, UINT FAR* puArgErr) \\ { \\

METHOD_PROLOGUE(objectClass, dualClass) \\

LPDISPATCH lpDispatch = pThis->GetIDispatch(FALSE); \\ ASSERT(lpDispatch != NULL); \\

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)