4、定义DISPATCH映射
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog) //在MyDHTMLDialog.cpp文件中
END_DISPATCH_MAP()
5.定义一个方法 //MyDHTMLDialog.h的类声明中
afx_msg void Func1();
6、编写具体的方法
BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog)
DISP_FUNCTION(CMyDHTMLDialog, "Func1", Func1, VT_EMPTY, VTS_NONE) //每个方法都需要在这里添加映射
END_DISPATCH_MAP()
void CMyDHTMLDialog::Func1()
{
MessageBox(_T("Hello!"));
}
7.重载CanAccessExternal
virtual BOOL CanAccessExternal();////在MyDHTMLDialog.h文件中
BOOL CWebUIAppDlg::CanAccessExternal() //在MyDHTMLDialog.cpp文件中
{
return TRUE;
}
8、测试
修改资源中的MyDHTMLDialog.htm文件
添加一个按钮,
<INPUT id="Button1" type="button" value="Button1" name="Button1" onclick="external.Func1();">
注意:所有暴露出去的方法都是在external.中提供,而这个external就是对话框自己,就是SetExternalDispatch中所传递的参数。
总结:上面所做的所有工作,无非就是将一个IDispatch接口指针传递给浏览器,浏览器中的脚本引擎就可以通过external这个对象句柄来访问我们自定义的方法。