cef内核中js调用mfc代码

本文记录了cef内核下js调用mfc代码的一种方式,即重写CefV8Handler。先创建类CSimpleV8Handler继承自CefV8Handler并重写Execute函数,再修改simple_app.h文件,让SimpleApp类继承自CefApp和CefRenderProcessHandler,完成后网页js调用JSCallCpp会在Execute中执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值