Можно аккуратно вызвать содержащее приложение из Javascript HTML-страницы. На уровне Javascript интерфейс MSHTML, который выполняет фактическую работу CHtmlView, предоставляет «внешний» объект, который действует как обратный путь к вызывающему приложению.
Предположим, мы хотим добавить метод "someCall ()", который можно вызывать из Javascript, и что метод принимает строку в качестве аргумента. В JavaScript мы бы назвали это чем-то вроде
external.someCall("An example string");
В приложении MFC нам нужно написать производный объект CCmdTarget, который будет действовать как реализация «внешнего» объекта в виде COM-объекта на основе диспетчеризации, что-то вроде:
class TestExternal : public CCmdTarget
{
public:
TestExternal()
{
EnableAutomation();
}
void SomeCall(LPCWSTR str)
{
// This is where we get called when the Javascript runs...
}
private:
DECLARE_DISPATCH_MAP()
};
BEGIN_DISPATCH_MAP(TestExternal,CCmdTarget)
DISP_FUNCTION(TestExternal,"someCall",SomeCall,VT_EMPTY,VTS_WBSTR)
END_DISPATCH_MAP()
Чтобы связать эту реализацию "external" с представлением HTML, в классе, производном от CHtmlView, вам нужно перегрузить OnGetExternal () и указать на экземпляр TestExternal, который живет по крайней мере столько же, сколько CHtmlView
class TestHtmlView : public CHtmlView
{
// Usual implementation stuff goes here...
public:
HRESULT OnGetExternal(LPDISPATCH *lppDispatch)
{
*lppDispatch = m_external.GetIDispatch(TRUE);
return S_OK;
}
private:
TestExternal m_external;
};
Обратите внимание, что я на самом деле не проверял это, но, похоже, прямо по памяти ...