Javascript 如何从c++;?
最近我一直在尝试将我的应用程序绑定到CEF,过程很慢,但在过去的几天里我取得了一些进展。然而有一件事我就是不能去工作 我想要实现的是: 1.在Javascript中注册回调函数(当我的应用程序中发生事件时将调用这些函数) 2.保存回调。 3.事件发生时,执行已注册的回调 现在我有了第一步和第二步,但第三步就是问题所在。 我首先通过注册一个回调来测试它,然后用Javascript中的executeCallback()函数调用它,它成功了。但是,每当我试图在C++中执行回调时,它就不起作用。 我在onContextCread()中创建setEventCallback 我知道会调用该事件(因为我第一次遇到由于类链接错误而导致的nullpointer异常,现在已经修复),但Javascript回调不会被调用 有人知道我做错了什么吗Javascript 如何从c++;?,javascript,c++,callback,chromium-embedded,Javascript,C++,Callback,Chromium Embedded,最近我一直在尝试将我的应用程序绑定到CEF,过程很慢,但在过去的几天里我取得了一些进展。然而有一件事我就是不能去工作 我想要实现的是: 1.在Javascript中注册回调函数(当我的应用程序中发生事件时将调用这些函数) 2.保存回调。 3.事件发生时,执行已注册的回调 现在我有了第一步和第二步,但第三步就是问题所在。 我首先通过注册一个回调来测试它,然后用Javascript中的executeCallback()函数调用它,它成功了。但是,每当我试图在C++中执行回调时,它就不起作用。 我在o
提前感谢。您可以使用html代码中的任何函数进行回调 渲染器:
bool SimpleApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
std::string message_name = message->GetName();
if( message_name == "FUNC")
{
//AfxMessageBox("stop");
//browser->GetMainFrame()->ExecuteJavaScript("super_test('works!');", browser->GetMainFrame()->->GetURL(), 0);
CefRefPtr<CefV8Value> object = m_context->GetGlobal();
CefRefPtr<CefV8Context> v8context = browser->GetMainFrame()->GetV8Context();
v8context->Enter();
CefRefPtr<CefV8Value> func_test = object->GetValue("super_test");
if(func_test == NULL)
{
v8context->Exit();
return false;
}
CefV8ValueList arguments;
CefRefPtr<CefV8Value> test = CefV8Value::CreateString("hello from c++");
arguments.push_back(test);
CefRefPtr<CefV8Value> retval = func_test->ExecuteFunction(NULL, arguments);
v8context->Exit();
return true;
}
return false;
}
bool SimpleApp::OnProcessMessageReceived(CefRefPtr浏览器,
CefProcessId源程序,
CefRefPtr消息)
{
std::string message_name=message->GetName();
如果(消息名称=“FUNC”)
{
//AfxMessageBox(“停止”);
//浏览器->GetMainFrame()->ExecuteJavaScript(“super_test('works!');”,浏览器->GetMainFrame()->->GetURL(),0);
cefreftr object=m_context->GetGlobal();
CefRefPtr v8context=browser->GetMainFrame()->GetV8Context();
v8context->Enter();
CefRefPtr func_测试=对象->获取值(“超级_测试”);
if(func_test==NULL)
{
v8context->Exit();
返回false;
}
CEFv8值列表参数;
cefreftr test=CefV8Value::CreateString(“来自c++的你好”);
参数。推回(测试);
CefRefPtr retval=func_test->ExecuteFunction(NULL,参数);
v8context->Exit();
返回true;
}
返回false;
}
jScript:
<script>
function super_test(resp)
{
alert(resp);
return "7777";
}
功能超级测试(resp)
{
警报(resp);
返回“7777”;
}
浏览器:
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("FUNC");
SimpleHandler::GetInstance()->GetBrowser()->SendProcessMessage(PID_RENDERER, message);
cefreftr message=CefProcessMessage::Create(“FUNC”);
SimpleHandler::GetInstance()->GetBrowser()->SendProcessMessage(PID_渲染器,消息);
是您的行cefreftr retval=func->ExecuteFunction(NULL,callArgs)实际上正在调用SimplexHandler::executeCallback()
中的code>,还是找不到回调?
bool SimplixHandler::notifyDirectoryChanged(std::string directory) {
CefRefPtr<CefListValue> list = CefListValue::Create();
list->SetSize(1);
list->SetString(0, directory);
return executeCallback("onDirectoryChange", list);
}
function dirChange(dir) {
document.getElementById("filename").innerHTML = "It's something";
}
simplix.setEventCallback("onDirectoryChange", dirChange);
bool SimpleApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
CefProcessId source_process,
CefRefPtr<CefProcessMessage> message)
{
std::string message_name = message->GetName();
if( message_name == "FUNC")
{
//AfxMessageBox("stop");
//browser->GetMainFrame()->ExecuteJavaScript("super_test('works!');", browser->GetMainFrame()->->GetURL(), 0);
CefRefPtr<CefV8Value> object = m_context->GetGlobal();
CefRefPtr<CefV8Context> v8context = browser->GetMainFrame()->GetV8Context();
v8context->Enter();
CefRefPtr<CefV8Value> func_test = object->GetValue("super_test");
if(func_test == NULL)
{
v8context->Exit();
return false;
}
CefV8ValueList arguments;
CefRefPtr<CefV8Value> test = CefV8Value::CreateString("hello from c++");
arguments.push_back(test);
CefRefPtr<CefV8Value> retval = func_test->ExecuteFunction(NULL, arguments);
v8context->Exit();
return true;
}
return false;
}
<script>
function super_test(resp)
{
alert(resp);
return "7777";
}
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("FUNC");
SimpleHandler::GetInstance()->GetBrowser()->SendProcessMessage(PID_RENDERER, message);