如题所述
èæ¬è¯è¨åç¼è¯åè¯è¨ä¹é´è¿è¡éä¿¡æ¯éè¿IDispatchæ¥å£æ¥è¡çï¼è¿éæ对åæ¥å£çç论就ä¸è¿è¡è®¨è®ºï¼ç´æ¥ççå¦ä½ç¨WTL代ç æ¥å®ç°ã
é¦å å®ä¹å¦ä¸çä¸ä¸ªIDispatchå®ç°ï¼
1 class CExternalDisp:
2 public CComObjectRoot,
3 public IDispatch
4 {
5 public:
6 CExternalDisp(void);
7 ~CExternalDisp(void);
8
9 BEGIN_COM_MAP(CExternalDisp)
10 COM_INTERFACE_ENTRY(IDispatch)
11 END_COM_MAP()
12
13 HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
14 /* [out] */ UINT *pctinfo)
15 {
16 return E_NOTIMPL;
17 }
18
19 HRESULT STDMETHODCALLTYPE GetTypeInfo(
20 /* [in] */ UINT iTInfo,
21 /* [in] */ LCID lcid,
22 /* [out] */ ITypeInfo **ppTInfo)
23 {
24 return E_NOTIMPL;
25 }
26
27 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
28 /* [in] */ REFIID riid,
29 /* [size_is][in] */ LPOLESTR *rgszNames,
30 /* [in] */ UINT cNames,
31 /* [in] */ LCID lcid,
32 /* [size_is][out] */ DISPID *rgDispId)
33 {
34 CComBSTR bsName(*rgszNames);
35 if (bsName == L"abc")
36 {
37 *rgDispId = 2535;
38 return S_OK;
39 }
40 return E_NOTIMPL;
41
42 }
43
44 virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
45 /* [in] */ DISPID dispIdMember,
46 /* [in] */ REFIID riid,
47 /* [in] */ LCID lcid,
48 /* [in] */ WORD wFlags,
49 /* [out][in] */ DISPPARAMS *pDispParams,
50 /* [out] */ VARIANT *pVarResult,
51 /* [out] */ EXCEPINFO *pExcepInfo,
52 /* [out] */ UINT *puArgErr)
53 {
54 if (dispIdMember == 2535)
55 {
56 for (int i = 0; i < pDispParams->cArgs; ++i)
57 {
58 if( pDispParams->rgvarg[i].vt == VT_INT)
59 i = i;
60 else
61
62 i = i;
63
64 }
65
66
67 MessageBox(NULL, L"sdjlkf", L"sdl", MB_OK);
68 return S_OK;
69 }
70 return E_NOTIMPL;
71 }
72
73 };
以ä¸ä»£ç ä¸å®ä¹äºä¸ä¸ªCExternalDispçç»ä»¶ï¼å®ç°äºIDispatchæ¥å£ï¼å½jsèæ¬è¯è¨è°ç¨å¯¹è±¡çæ个æ¹æ³æ¶ï¼ä¼è½¬æéè¿IDispatchçInvokeå½æ°æ¥è°ç¨ï¼ä¸åçå½æ°å¯¹åºä¸åçdispIdMember,èè¿ä¸ªæ°ååæ¯éè¿GetIDsOfNamesæ¥å¾å°çã
æäºCExternalDispè¿ä¸ªç»ä»¶ï¼è¿éè¦å°å ¶æ³¨åæ为IEçexteranl对象ãå¨IEæ§ä»¶çåå§åé¨åè¿è¡è®¾ç½®ï¼ä»£ç å¦ä¸ï¼
1 CComPtr<IWebBrowser2> spWeb;
2 HRESULT hr = m_view.QueryControl(IID_IWebBrowser2, (void**)&spWeb );
3 CComObject<CExternalDisp> *obj;
4 CComObject<CExternalDisp>::CreateInstance(&obj);
5 CComPtr<IDispatch> spDisp;
6 obj->QueryInterface(IID_IDispatch, (void**)&spDisp);
7 m_view.SetExternalDispatch(spDisp);
è¿æ ·ï¼JSèæ¬ä¸ç代ç å°±å¯ä»¥è®¿é®window.external对象ä¸å¾æ¹æ³äºãä¸é¢æ¯htmlä¸jsè°ç¨exteranl.abcç代ç 段ï¼
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 8.0">
<TITLE></TITLE>
<script type="text/javascript">
window.external.abc(1, 'ljw', 2.3);
</script>
</HEAD>
<BODY>
</BODY>
</HTML>
å¯ä»¥çå°å¨é¡µé¢å è½½æ¶è°ç¨äºwindow.external.abc(1, 'ljw', 2.3);è¿ä¸ªæ¹æ³ï¼è¿ä¼ éäºåæ°ã å½jsçæ§è¡å¼æ解éè¿ä¸ªè¯å¥æ¶ï¼ä¼å å»è®²abcè¿ä¸ªå符串éå°GetIDsOfNamesä¸å»ï¼è·å¾å¯¹åºçDISPIDï¼ ç¶åç¨è¿ä¸ªDISPIDå¨è°ç¨Invokeå½æ°ãæ们å¨invokeå½æ°å¯¹è¿ä¸ªabcæ¹æ³å¯¹åºçdispidè¿è¡äºå¤çï¼å°±è½å¤ç»jsè¿è¡ç»æåé¦ãéè¿å®éªï¼jså½æ°ä¸å¾åæ°æ¯æ¾å¨DISPPARAMSä¸ä¼ å ¥Invokeçï¼èä¸å¥½åæ¯æå³è¾¹çåæ°æå å ¥æ ã
é¦å å®ä¹å¦ä¸çä¸ä¸ªIDispatchå®ç°ï¼
1 class CExternalDisp:
2 public CComObjectRoot,
3 public IDispatch
4 {
5 public:
6 CExternalDisp(void);
7 ~CExternalDisp(void);
8
9 BEGIN_COM_MAP(CExternalDisp)
10 COM_INTERFACE_ENTRY(IDispatch)
11 END_COM_MAP()
12
13 HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
14 /* [out] */ UINT *pctinfo)
15 {
16 return E_NOTIMPL;
17 }
18
19 HRESULT STDMETHODCALLTYPE GetTypeInfo(
20 /* [in] */ UINT iTInfo,
21 /* [in] */ LCID lcid,
22 /* [out] */ ITypeInfo **ppTInfo)
23 {
24 return E_NOTIMPL;
25 }
26
27 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
28 /* [in] */ REFIID riid,
29 /* [size_is][in] */ LPOLESTR *rgszNames,
30 /* [in] */ UINT cNames,
31 /* [in] */ LCID lcid,
32 /* [size_is][out] */ DISPID *rgDispId)
33 {
34 CComBSTR bsName(*rgszNames);
35 if (bsName == L"abc")
36 {
37 *rgDispId = 2535;
38 return S_OK;
39 }
40 return E_NOTIMPL;
41
42 }
43
44 virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
45 /* [in] */ DISPID dispIdMember,
46 /* [in] */ REFIID riid,
47 /* [in] */ LCID lcid,
48 /* [in] */ WORD wFlags,
49 /* [out][in] */ DISPPARAMS *pDispParams,
50 /* [out] */ VARIANT *pVarResult,
51 /* [out] */ EXCEPINFO *pExcepInfo,
52 /* [out] */ UINT *puArgErr)
53 {
54 if (dispIdMember == 2535)
55 {
56 for (int i = 0; i < pDispParams->cArgs; ++i)
57 {
58 if( pDispParams->rgvarg[i].vt == VT_INT)
59 i = i;
60 else
61
62 i = i;
63
64 }
65
66
67 MessageBox(NULL, L"sdjlkf", L"sdl", MB_OK);
68 return S_OK;
69 }
70 return E_NOTIMPL;
71 }
72
73 };
以ä¸ä»£ç ä¸å®ä¹äºä¸ä¸ªCExternalDispçç»ä»¶ï¼å®ç°äºIDispatchæ¥å£ï¼å½jsèæ¬è¯è¨è°ç¨å¯¹è±¡çæ个æ¹æ³æ¶ï¼ä¼è½¬æéè¿IDispatchçInvokeå½æ°æ¥è°ç¨ï¼ä¸åçå½æ°å¯¹åºä¸åçdispIdMember,èè¿ä¸ªæ°ååæ¯éè¿GetIDsOfNamesæ¥å¾å°çã
æäºCExternalDispè¿ä¸ªç»ä»¶ï¼è¿éè¦å°å ¶æ³¨åæ为IEçexteranl对象ãå¨IEæ§ä»¶çåå§åé¨åè¿è¡è®¾ç½®ï¼ä»£ç å¦ä¸ï¼
1 CComPtr<IWebBrowser2> spWeb;
2 HRESULT hr = m_view.QueryControl(IID_IWebBrowser2, (void**)&spWeb );
3 CComObject<CExternalDisp> *obj;
4 CComObject<CExternalDisp>::CreateInstance(&obj);
5 CComPtr<IDispatch> spDisp;
6 obj->QueryInterface(IID_IDispatch, (void**)&spDisp);
7 m_view.SetExternalDispatch(spDisp);
è¿æ ·ï¼JSèæ¬ä¸ç代ç å°±å¯ä»¥è®¿é®window.external对象ä¸å¾æ¹æ³äºãä¸é¢æ¯htmlä¸jsè°ç¨exteranl.abcç代ç 段ï¼
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 8.0">
<TITLE></TITLE>
<script type="text/javascript">
window.external.abc(1, 'ljw', 2.3);
</script>
</HEAD>
<BODY>
</BODY>
</HTML>
å¯ä»¥çå°å¨é¡µé¢å è½½æ¶è°ç¨äºwindow.external.abc(1, 'ljw', 2.3);è¿ä¸ªæ¹æ³ï¼è¿ä¼ éäºåæ°ã å½jsçæ§è¡å¼æ解éè¿ä¸ªè¯å¥æ¶ï¼ä¼å å»è®²abcè¿ä¸ªå符串éå°GetIDsOfNamesä¸å»ï¼è·å¾å¯¹åºçDISPIDï¼ ç¶åç¨è¿ä¸ªDISPIDå¨è°ç¨Invokeå½æ°ãæ们å¨invokeå½æ°å¯¹è¿ä¸ªabcæ¹æ³å¯¹åºçdispidè¿è¡äºå¤çï¼å°±è½å¤ç»jsè¿è¡ç»æåé¦ãéè¿å®éªï¼jså½æ°ä¸å¾åæ°æ¯æ¾å¨DISPPARAMSä¸ä¼ å ¥Invokeçï¼èä¸å¥½åæ¯æå³è¾¹çåæ°æå å ¥æ ã
温馨提示:答案为网友推荐,仅供参考