libCEF中C++与JavaScript的交互调用【编程语言】

来源:互联网 发布:人机界面简单编程实例 编辑:程序博客网 时间:2024/05/01 14:56

前言 前一篇文章介绍过CEF在WIN32程序中嵌入chrome内核浏览器的例子:http://blog.csdn.net/mfcing/article/details/43973377

AddFun是自己添加的一个函数页面div重构,用来把一个函数和气对应的回调地址存储到这个V8对象中,页面div重构因此用了一个成员变量typedef map<CefString,web切图报价 JS_CALLBACK_FUN> FunctionMap符合w3c标准,调用函数时V8引擎有一个接口Execute,符合w3c标准在这里我们调用函数的名称到map中去查找,手机网页制作找到了其对应的回调地址调用函数div页面,这就是JS调用C++的过程了.

这里介绍的是嵌入浏览器后,div页面网页的JS脚本函数与C++代码的交互网页重构报价,这个很多地方都用得到.比如:音乐播放器里网页上的播放,div+css报价客户端资源中心里的资源下载……

//JS函数页面div重构,在其他进程中调用 static bool JsSetAppState(const CefV8ValueList& argList,页面div重构 CefRefPtr<CefV8Value>& retValue); static bool JsOneKeyInstall(const CefV8ValueList& argList承接网页制作, CefRefPtr<CefV8Value>& retValue); static bool JsDownloadFile(const CefV8ValueList& argList,承接网页制作 CefRefPtr<CefV8Value>& retValue); vCefV8ValueList是一个参数列表div切图排版,看它的定义typedef std::vector<CefRefPtr<CefV8Value> > CefV8ValueList,html切图retValue当然就是函数的返回值了div页面,有的JS需要根据返回值做相应的处理的.

我们的函数都是定义在window对象中的(不知道JS中这个是不是叫对象),div页面根据注视我们需要GetGlobal获取这个对象.

CCefV8Handler::CCefV8Handler() { } bool CCefV8Handler::Execute( const CefString& name网页重构报价, CefRefPtr<CefV8Value> object,网页重构报价 \ const CefV8ValueList& arguments页面div重构, CefRefPtr<CefV8Value>& retval,html静态页面制作 CefString& exception ) { FunctionMap::iterator itor = m_fun.find(name); if ( itor == m_fun.end() ) return false; itor->second(arguments承接网页制作, retval); return true; } bool CCefV8Handler::AddFun( const CefString& strName,承接网页制作 JS_CALLBACK_FUN pFun ) { if ( strName.empty() ) return false; m_fun.insert(std::pair<CefStringdiv切图排版, JS_CALLBACK_FUN>(strName,手机网页制作 pFun)); return true; }

总结 要想使用CEFdiv页面,最好还是仔细阅读头文件里面的注释,网页切图价格很详细.

CefRefPtr<CefV8Handler> myV8handle = new CCefV8Handler(); CefRefPtr<CefV8Value> myFun = CefV8Value::CreateFunction(L"SetAppState"网页重构报价, myV8handle); static_cast<CCefV8Handler*>(myV8handle.get())->AddFun(L"SetAppState",网页重构报价 &CChromeJsCallback::JsSetAppState); pObjApp->SetValue(L"SetAppState"页面div重构, myFun,页面div重构 V8_PROPERTY_ATTRIBUTE_NONE); 创建一个V8对象指针承接网页制作,但是new 的是一个CCefV8Handler,psd转html这个是需要自己扩展下的.我是这样做的:

C++代码中div切图排版,这三个函数是这样写的:

//定义JS回调函数指针 typedef bool(* JS_CALLBACK_FUN)(const CefV8ValueList& ,手机网页制作 CefRefPtr<CefV8Value>& ); typedef map<CefStringdiv页面, JS_CALLBACK_FUN> FunctionMap; class CCefV8Handler : public CefV8Handler { public: CCefV8Handler(); virtual bool Execute(const CefString& name,div页面 CefRefPtr<CefV8Value> object网页重构报价, \ const CefV8ValueList& arguments,div+css报价 CefRefPtr<CefV8Value>& retval页面div重构, CefString& exception); bool AddFun(const CefString& strName,页面div重构 JS_CALLBACK_FUN pFun); private: FunctionMap m_fun; // Include the default reference counting implementation. IMPLEMENT_REFCOUNTING(CCefV8Handler); };

这里要注意:CEF可以使用单进程和多进程模式承接网页制作,我程序里使用的是多进程模式,承接网页制作因此V8引擎的执行是在渲染引擎里的div切图排版,不要尝试在这里直接去对界面进行处理.界面进程和渲染进程是分开的,html切图数据的话用共享内存来做div页面,界面更新发消息来做.

创建函数对象,div页面并将JS函数绑定到C++函数指针上面的过程是重点详细介绍下

void CChromeBrowserUI::ExecuteJavascript( const wstring& strCode ) { if ( m_pWebBrowser.get() ) { CefRefPtr<CefFrame> frame = m_pWebBrowser->GetMainFrame(); if ( frame.get() ) { CefString strCode(strCode.c_str())网页重构报价, strUrl(L""); frame->ExecuteJavaScript(strCode,网页重构报价 strUrl页面div重构, 0); } } }注意:函数名和参数名需要用单引号分隔.

最上面那段代码中,html静态页面制作我们又添加了三个函数 SetAppState、OneClickInstall、DownLoadFile到window.application对象上面.

我的代码是这样的:

CefRefPtr<CefV8Value> window = context->GetGlobal(); CefRefPtr<CefV8Accessor> myV8Acc = new CCefV8Accessor; CefRefPtr<CefV8Value> val = CefV8Value::CreateString(L"Application"); CefString cefException; myV8Acc->Set(L"name"承接网页制作, window,承接网页制作 valdiv切图排版, cefException); CefRefPtr<CefV8Value> pObjApp = CefV8Value::CreateObject(myV8Acc); window->SetValue(L"Application",手机网页制作 pObjAppdiv页面, V8_PROPERTY_ATTRIBUTE_NONE); CefRefPtr<CefV8Handler> myV8handle = new CCefV8Handler(); CefRefPtr<CefV8Value> myFun = CefV8Value::CreateFunction(L"SetAppState",网页切图价格 myV8handle); static_cast<CCefV8Handler*>(myV8handle.get())->AddFun(L"SetAppState"网页重构报价, &CChromeJsCallback::JsSetAppState); pObjApp->SetValue(L"SetAppState",网页重构报价 myFun页面div重构, V8_PROPERTY_ATTRIBUTE_NONE); myFun = CefV8Value::CreateFunction(L"OneClickInstall",页面div重构 myV8handle); static_cast<CCefV8Handler*>(myV8handle.get())->AddFun(L"OneClickInstall"承接网页制作, &CChromeJsCallback::JsOneKeyInstall); pObjApp->SetValue(L"OneClickInstall",psd转html myFundiv切图排版, V8_PROPERTY_ATTRIBUTE_NONE); myFun = CefV8Value::CreateFunction(L"DownLoadFile",手机网页制作 myV8handle); static_cast<CCefV8Handler*>(myV8handle.get())->AddFun(L"DownLoadFile"div页面, &CChromeJsCallback::JsDownloadFile); pObjApp->SetValue(L"DownLoadFile",div页面 myFun网页重构报价, V8_PROPERTY_ATTRIBUTE_NONE); 所有的JS函数都是在window.Application上的,div+css报价因此需要在window 对象上面创建Application 对象页面div重构,CefV8Value::CreateObject用来创建对象.CefV8Value这个类在JS处理中至关重要,页面div重构要必要好好看看头文件里面的注视承接网页制作,CEF的注视是相当详细的.

// Called immediately after the V8 context for a frame has been created. To // retrieve the JavaScript 'window' object use the CefV8Context::GetGlobal() // method. V8 handles can only be accessed from the thread on which they are // created. A task runner for posting tasks on the associated thread can be // retrieved via the CefV8Context::GetTaskRunner() method. /// /*--cef()--*/ virtual void OnContextCreated(CefRefPtr<CefBrowser> browser,承接网页制作 CefRefPtr<CefFrame> framediv切图排版, CefRefPtr<CefV8Context> context) {}这个接口实在chrome的V8引擎创建后调用的,html切图在这里我们需要将JS里面调用的函数和C++的执行函数关联起来div页面,这样JS就可以“执行”C++代码了.

我的字符串格式化部分:

JS调用C++函数 首先需要重写CefRenderProcessHandler的OnContextCreated接口,div页面为什么呢?学习CEF库的使用必须仔细阅读他的头文件里的注视部分:

C++调用JS函数 C++调用JS函数相对简单多了网页重构报价,因为CEF有接口可以直接使用CefFrame::ExecuteJavaScript,网页重构报价看看注释:

CString strJsCode; strJsCode.Format(L"setInstallStatus('%s'页面div重构,'%s',html静态页面制作'%d');"承接网页制作, lpData->strId.c_str(),承接网页制作 strStatusdiv切图排版, nPercent); 这样,手机网页制作C++就可以调用JS的函数并传入对应的参数了.

// Execute a string of JavaScript code in this frame. The |script_url| // parameter is the URL where the script in question can be founddiv页面, if any. // The renderer may request this URL to show the developer the source of the // error. The |start_line| parameter is the base line number to use for error // reporting. /// /*--cef(optional_param=script_url)--*/ virtual void ExecuteJavaScript(const CefString& code,网页切图价格 const CefString& script_url网页重构报价, int start_line) =0; 首先需要获取到我们的浏览器里的主框架对象,网页重构报价code是JS函数和传入参数的字符串页面div重构,URL可以直接忽略.

0 0
原创粉丝点击