CEF框架:c++和JS互動走過的坑
阿新 • • 發佈:2020-07-29
目錄
網上有許多教你如何進行使用JS呼叫C++的教程,但是大多數都是交代的不是十分清晰,這裡主要講我遇到的坑。主要以cefsimple來講。
我的目錄大致為:
1如何開啟一個多執行緒
只有CEF框架中開啟一個子執行緒,才能完成C++和JavaScript之間的互動,而開啟執行緒只需要呼叫一下這個函式——CefExecuteProcess即可生成一個子執行緒。但是這個函式什麼時候呼叫,和在哪裡呼叫,和怎麼呼叫,網上說的一點也不清晰。
在cefsimple中cefsimple_win.cc中就存在了著這個方法,所以我們只需要修改一下這個方法即可
//大概在48行左右 // CEF applications have multiple sub-processes (render, plugin, GPU, etc) // that share the same executable. This function checks the command-line and, // if this is a sub-process, executes the appropriate logic. //上面的那句話的大概意思是,主要CEF框架有許多子程序,這個方法主要是檢測是否有子程序,如果有子程序,就執行子程序 int exit_code = CefExecuteProcess(main_args, nullptr, sandbox_info);
這個方法——CefExecuteProcess,可以先不看,
CEF_GLOBAL int CefExecuteProcess(const CefMainArgs& args, CefRefPtr<CefApp> application, void* windows_sandbox_info) { const char* api_hash = cef_api_hash(0); if (strcmp(api_hash, CEF_API_HASH_PLATFORM)) { // The libcef API hash does not match the current header API hash. //當前API的hash值和當前程序的頭APIhash不匹配,退出開啟程序。 NOTREACHED(); return 0; } // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING // Unverified params: application, windows_sandbox_info(一個檢測資訊) // Execute int _retval = cef_execute_process(&args, CefAppCppToC::Wrap(application), windows_sandbox_info); // Return type: simple return _retval; }
重要的是這個方法的第二個引數是一個CefApp,也就是我們所要執行子程序物件,所以我們可以先不管它,直接建立子程序物件放上先。大概操作為如下:
CefRefPtr<csubclassHandler> appa(new csubclassHandler);//csubclassHandler這個是我實現了CefApp的類
int exit_code = CefExecuteProcess(main_args, appa.get() , nullptr);
這就完成了開啟執行緒的操作,是不是很簡單,哈哈哈哈
重寫GetRenderProcessHandler()這個方法
//subhandler.h_>
#include "include/cef_app.h"
class csubclassHandler :
public CefApp,
public CefRenderProcessHandler
{
public:
csubclassHandler();
~csubclassHandler();
/****/
//這個方法一定要重寫,不然的話browser物件不能收到JS發來的請求
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() OVERRIDE {
return this;
}
/***/
void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) OVERRIDE;
private:
IMPLEMENT_REFCOUNTING(csubclassHandler);
};
剩下的操作跟著官方文件和部落格都能完成相應的操作。
這是我的小demo:
[email protected]:whllow/C-.git