, , . C++ ( C++), ( Java Visual Basic). , , , - . , . , HTML ( , Visual Basic Script, JavaScript), Web- Web- . HTML, " ", HTML. - , - HTML- ( , - , Web- ). (runtime engine) . , .
Visual Basic Script JavaScript, , . IDispatch :
[object, uuid(00020400-0000-0000-C000-000000000046)] interface IDispatch : IUnknown { // structure to model a list of named parameters // typedef struct tagDISPPARAMS { [size_is(cArgs)] VARIANTARG * rgvarg; [size_is(cNamedArgs)] DISPID * rgdispidNamedArgs; UINT cArgs; UINT cNamedArgs; } DISPPARAMS; // can the object describe this interface? // ? HRESULT GetTypeInfoCount([out] UINT * pctinfo); // return a locale-specific description of this interface // HRESULT GetTypeInfo( [in] UINT itInfo, // reserved, m.b.z. // , [in] LCID lcid, // locale ID // [out] ITypeInfo ** ppTInfo); // put it here! // ! // resolve member/parameter names to DISPIDs // / DISPID HRESULT GetIDsOfNames( [in] REFIID riid, // reserved, must be IID_NULL // , IID_NULL [in, size_is(cNames)] LPOLESTR * rgszNames, // method+params // + [in] UINT cNames, // count of names // [in] LCID lcid, // locale ID // ID [out, size_is(cNames)] DISPID * rgid // tokens of names // ); // access member via its DISPID // DISPID HRESULT Invoke( [in] DISPID id, // token of member // [in] REFIID riid, // reserved, must be IID_NULL // , IID_NULL [in] LCID lcid, // locale ID // ID [in] WORD wFlags, // method, propput, or propget? // propput propget? [in,out] DISPPARAMS * pDispParams, // logical parameters // [out] VARIANT * pVarResult, // logical result // [out] EXCEPINFO * pExcepInfo, // IErrorInfo params // IErrorInfo [out] UINT * puArgErr // used for type errors // );
, QueryInterface IDispatch . QueryInterface, . IDispatch , GetIDsOfNames . DISPID (parsed) , . / IDispatch::Invoke . , IDispatch::Invoke VARIANT DISPPARAMS, VARIANT.
IDispatch ( dispinterface , ) . . , . . , . , , , . , ( ).
IDL dispinterface:
[uuid(75DA6450-DD0F-11d0-8C58-0880C73925BA)] dispinterface DPrimeManager { properties: [id(1), readonly] long MinPrimeOnMachine; [id(2)] long MinPrime; methods: [id(3)] long GetNextPrime([in] long n); }
; , IDispatch. , . , , , , (dual interface).
, IDispatch. IDispatch , . , . IDL- DPrimeManager:
[object, dual, uuid(75DA6450-DD0F-11d0-8C58-0080C73925BA)] interface DIPrimeManager : IDispatch { [id(1), propget] HRESULT MinPrimeOnMachine( [out, retval] long *pval); [id(2), propput] HRESULT MinPrime([in] longval); [id(2), propget] HRESULT MinPrime([out, retval] long *pval); [id(3)] long GetNextPrime([in] long n); }
, IDispatch, IUnknown. , [dual]. , , . [dual] [oleautomation] RegisterTypeLib.
, IDispatch . , IDispatch. , :
class PrimeManager : DIPrimeManager { LONG m_cRef; // reference count // ITypeInfo *m_pTypeInfo; // ptr. to type desc. // // IUnknown methods... // IUnknown... // IDispatch methods... // IDispatch... // IPrimeManager methods... // IPrimeManager... PrimeManager(void) : m_cRef(0) { ITypeLib *ptl = 0; HRESULT hr = LoadRegTypeLib(LIBID_PrimeLib, 1, 0, 0, &ptl); assert(SUCCEEDED(hr)); hr = ptl->GetTypeInfoOfGuid(IID_DIPrimeManager, &m_pTypeInfo); ptl->Release(); } virtual PrimeManager(void) { m_pTypeInfo->Release(); } };
, GetTypeInfo :
STDMETHODIMP PrimeManager::GetTypeInfo (UINT it, LCID lcid, ITypeInfo **ppti) { assert(it == 0 && ppti != 0); (*ppti = m_pTypeInfo)->AddRef(); return S_OK; }
, LCID, , . GetTypeInfoCount :
STDMETHODIMP PrimeManager::GetTypeInfoCount(UINT *pit) { assert(pit != 0); *pit = 1; // only 0 or 1 are allowed // 0 1 return S_OK; }
( , ) ( , ). , .
GetTypeInfo GetTypeInfoCount . IDispatch GetIDsOfNames Invoke. GetIDsOfNames , :
STDMETHODIMP PrimeManager::GetIDsOfNames(REFIID riid, OLECHAR **pNames, UINT cNames, LCID lcid, DISPID *pdispids) { assert(riid == IID_NULL); return m_pTypeInfo->GetIDsOfNames(pNames, cNames, pdispids); }
DISPID, . Invoke :
STDMETHODIMP PrimeManager::Invoke(DISPID id, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pd, VARIANT *pVarResult, EXCEPINFO *pe, UINT *pu) { assert(riid == IID_NULL); void *pvThis = static_cast<DIPrimeManager*>(this); return m_pTypeInfo->Invoke(pvThis, id, wFlags, pd, pVarResult, pe, pu); }
ITypeInfo::Invoke . , , . (call stack), . . 7.6 , .