Javascript 如何从c++;?

Javascript 如何从c++;?,javascript,c++,callback,chromium-embedded,Javascript,C++,Callback,Chromium Embedded,最近我一直在尝试将我的应用程序绑定到CEF,过程很慢,但在过去的几天里我取得了一些进展。然而有一件事我就是不能去工作 我想要实现的是: 1.在Javascript中注册回调函数(当我的应用程序中发生事件时将调用这些函数) 2.保存回调。 3.事件发生时,执行已注册的回调 现在我有了第一步和第二步,但第三步就是问题所在。 我首先通过注册一个回调来测试它,然后用Javascript中的executeCallback()函数调用它,它成功了。但是,每当我试图在C++中执行回调时,它就不起作用。 我在o

最近我一直在尝试将我的应用程序绑定到CEF,过程很慢,但在过去的几天里我取得了一些进展。然而有一件事我就是不能去工作

我想要实现的是: 1.在Javascript中注册回调函数(当我的应用程序中发生事件时将调用这些函数) 2.保存回调。 3.事件发生时,执行已注册的回调

现在我有了第一步和第二步,但第三步就是问题所在。 我首先通过注册一个回调来测试它,然后用Javascript中的executeCallback()函数调用它,它成功了。但是,每当我试图在C++中执行回调时,它就不起作用。 我在onContextCread()中创建setEventCallback

我知道会调用该事件(因为我第一次遇到由于类链接错误而导致的nullpointer异常,现在已经修复),但Javascript回调不会被调用

有人知道我做错了什么吗


提前感谢。

您可以使用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);