error C2039: “HandlerSet”: 不是“CefMessageRouterBrowserSide”的成员
时间: 2023-09-22 19:07:56 浏览: 40
这个错误是因为在使用CefMessageRouterBrowserSide时,没有包含正确的头文件或者没有链接正确的库文件。
如果您使用的是Visual Studio开发环境,可以尝试以下解决办法:
1. 确认您是否包含了正确的头文件。在使用CefMessageRouterBrowserSide时,需要包含以下头文件:
```
#include "include/cef_message_router.h"
```
2. 确认您是否链接了正确的库文件。在使用CefMessageRouterBrowserSide时,需要链接以下库文件:
```
libcef.lib
libcef_dll_wrapper.lib
```
另外,还需要将这些库文件所在的目录添加到Visual Studio的库目录中。可以在Visual Studio的项目属性中进行设置。
如果以上解决办法都无法解决问题,建议您检查一下CefMessageRouterBrowserSide的版本是否与您使用的CEF版本匹配。如果版本不匹配,也可能会导致出现类似的错误。
相关问题
使用cef向html发送数据并进行加载,请给出完整的代码示例
以下是一个使用CEF向HTML发送数据并进行加载的完整代码示例:
```cpp
#include "include/cef_app.h"
#include "include/cef_client.h"
#include "include/views/cef_browser_view.h"
#include "include/views/cef_window.h"
#include "include/wrapper/cef_helpers.h"
#include "include/wrapper/cef_message_router.h"
class MyClient : public CefClient, public CefMessageRouterBrowserSide::Handler {
public:
MyClient() {}
CefRefPtr<CefBrowser> GetBrowser() {
return m_Browser;
}
virtual CefRefPtr<CefMessageRouterBrowserSide> GetMessageRouterBrowserSide() override {
return m_MessageRouterBrowserSide;
}
virtual bool OnProcessMessageReceived(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefProcessId source_process, CefRefPtr<CefProcessMessage> message) override {
return m_MessageRouterBrowserSide->OnProcessMessageReceived(browser, frame, source_process, message);
}
virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
m_Browser = browser;
m_MessageRouterBrowserSide = CefMessageRouterBrowserSide::Create(m_MessageHandler);
m_MessageRouterBrowserSide->AddHandler(this, false);
}
virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) override {
m_MessageRouterBrowserSide->OnBeforeClose(browser);
m_Browser = nullptr;
}
IMPLEMENT_REFCOUNTING(MyClient)
private:
CefRefPtr<CefBrowser> m_Browser;
CefRefPtr<CefMessageRouterBrowserSide> m_MessageRouterBrowserSide;
CefMessageRouterBrowserSide::HandlerSet m_MessageHandler;
};
class MyHandler : public CefMessageRouterBrowserSide::Handler {
public:
MyHandler() {}
virtual bool OnQuery(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, int64 query_id, const CefString& request, bool persistent, CefRefPtr<Callback> callback) override {
if (request == "getData") {
CefRefPtr<CefProcessMessage> message = CefProcessMessage::Create("sendData");
message->GetArgumentList()->SetString(0, "Hello, HTML!");
browser->GetMainFrame()->SendProcessMessage(PID_RENDERER, message);
callback->Success("");
return true;
}
return false;
}
IMPLEMENT_REFCOUNTING(MyHandler)
};
class MyRenderProcessHandler : public CefRenderProcessHandler {
public:
virtual void OnContextCreated(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context) override {
CefRefPtr<CefMessageRouterRendererSide> messageRouterRendererSide = CefMessageRouterRendererSide::Create();
messageRouterRendererSide->AddHandler(new MyHandler(), false);
frame->SetMessageRouter(messageRouterRendererSide);
}
};
class MyBrowser : public CefBrowserProcessHandler {
public:
virtual void OnContextInitialized() override {
CefMessageRouterConfig messageRouterConfig;
messageRouterConfig.js_query_function = "query";
messageRouterConfig.js_cancel_function = "cancel";
CefMessageRouterBrowserSide::Create(messageRouterConfig);
}
virtual CefRefPtr<CefRenderProcessHandler> GetRenderProcessHandler() override {
return new MyRenderProcessHandler();
}
};
int main(int argc, char** argv) {
CefMainArgs main_args(argc, argv);
CefRefPtr<MyBrowser> browser(new MyBrowser());
int exit_code = CefExecuteProcess(main_args, browser.get(), nullptr);
if (exit_code >= 0) {
return exit_code;
}
CefSettings settings;
settings.multi_threaded_message_loop = true;
CefInitialize(main_args, settings, browser.get(), nullptr);
CefRefPtr<MyClient> client(new MyClient());
CefBrowserView::CreateBrowserView(client, "about:blank")->GetBrowser()->GetMainFrame()->LoadURL("file:///path/to/your/html/file.html");
CefRunMessageLoop();
CefShutdown();
return 0;
}
```
这个示例使用了 CEF(Chromium Embedded Framework),它是一个嵌入式浏览器框架,让你可以将 Chromium 引擎嵌入到你的应用程序中。这个示例中,我们创建了一个 CEF 客户端(`MyClient`)和一个 CEF 处理程序(`MyHandler`),并在渲染进程中使用它们。
`MyClient` 类是一个继承自 `CefClient` 的类,它实现了 `CefMessageRouterBrowserSide::Handler` 接口。在 `OnAfterCreated` 方法中,我们创建了一个 `CefMessageRouterBrowserSide` 对象,并将 `MyHandler` 添加到它的处理程序列表中。在 `OnBeforeClose` 方法中,我们将 `CefMessageRouterBrowserSide` 对象从处理程序列表中移除。
`MyHandler` 类同样继承自 `CefMessageRouterBrowserSide::Handler` 接口,并实现了其中的 `OnQuery` 方法。当 HTML 页面通过 JavaScript 调用 `query` 函数并传递参数 `"getData"` 时,我们将创建一个名为 `"sendData"` 的 `CefProcessMessage`,并将 `"Hello, HTML!"` 作为参数发送给 HTML 页面。最后,我们调用 `callback->Success("")` 表示处理成功,并返回一个空字符串。
`MyRenderProcessHandler` 类继承自 `CefRenderProcessHandler` 接口,在 `OnContextCreated` 方法中创建了一个 `CefMessageRouterRendererSide` 对象,并将 `MyHandler` 对象添加到它的处理程序列表中。这样,在 HTML 页面中就可以通过 JavaScript 调用 `query` 函数并传递参数 `"getData"` 来触发 `MyHandler::OnQuery` 方法。
最后,在 `main` 函数中,我们先调用 `CefExecuteProcess` 函数,如果返回值大于等于 0,则说明当前进程是子进程,直接返回即可。否则,我们初始化 CEF,并创建一个 `MyClient` 对象,将其传递给 `CefBrowserView::CreateBrowserView` 函数,从而创建一个浏览器窗口,并加载 HTML 文件。最后,我们调用 `CefRunMessageLoop` 函数进入消息循环,直到应用程序退出。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)