cef内核下,js调用mfc代码有很多种方式,本文只记录其中一种方式(重写CefV8Handler)。
第一步,创建类CSimpleV8Handler继承自CefV8Handler,并重写虚函数Execute,代码如下
#pragma once
#include "include/cef_v8.h"
class CSimpleV8Handler : public CefV8Handler
{
public:
CSimpleV8Handler();
~CSimpleV8Handler();
public:
virtual bool Execute(const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments,
CefRefPtr<CefV8Value>& retval, CefString& exception) OVERRIDE;
private:
IMPLEMENT_REFCOUNTING(CSimpleV8Handler);
};
#include "stdafx.h"
#include "simple_v8handler.h"
#include "WebBrowse/elecmapvideo.h"
CSimpleV8Handler::CSimpleV8Handler(){}
CSimpleV8Handler::~CSimpleV8Handler(){}
bool CSimpleV8Handler::Execute(const CefString& name, CefRefPtr<CefV8Value> object, const CefV8ValueList& arguments,
CefRefPtr<CefV8Value>& retval, CefString& exception)
{
if (name == CefString("JSCallCpp")){ //JSCallCpp这个名字就是网页上回调的函数名字
if (arguments.size() ==3 ){ //3表示网页上JSCallCpp函数的参数为3个
CefString chnstr = arguments[1]->GetStringValue();
//做自己的操作
return true;
}
}
return false;
}
第二步,修改simple_app.h文件,SimpleApp类继承自CefApp和CefRenderProcessHandler,完整代码如下
#ifndef CEF_TESTS_CEFSIMPLE_SIMPLE_APP_H_
#define CEF_TESTS_CEFSIMPLE_SIMPLE_APP_H_
#include "include/cef_app.h"
class SimpleApp : public CefApp, public CefRenderProcessHandler {
public:
SimpleApp();
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() OVERRIDE{ return this; }
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
virtual void OnBeforeCommandLineProcessing(const CefString& process_type, CefRefPtr<CefCommandLine> command_line) {
command_line->AppendSwitch("no-proxy-server"); //去掉代理-避免由于代理加载网页慢
}
private:
// Include the default reference counting implementation.
IMPLEMENT_REFCOUNTING(SimpleApp);
};
#endif
对应的cpp文件实现代码如下
#include "simple_app.h"
#include "simple_handler.h"
#include "simple_v8handler.h"
#include "include/cef_browser.h"
#include "include/cef_command_line.h"
#include "include/wrapper/cef_helpers.h"
SimpleApp::SimpleApp(){}
void SimpleApp::OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
{
// The var type can accept all object or variable
CefRefPtr<CefV8Value> pV8 = context->GetGlobal();
// bind function
CefRefPtr<CSimpleV8Handler> pJsHandler(new CSimpleV8Handler());
CefRefPtr<CefV8Value> pFunc = CefV8Value::CreateFunction(CefString("JSCallCpp"), pJsHandler); //这里的JSCallCpp就是网页上的回调函数名字
pV8->SetValue(CefString("JSCallCpp"), pFunc, V8_PROPERTY_ATTRIBUTE_NONE);
}
至此,在网页上js中调用JSCallCpp,就会在Execute中执行。