встроенный хром — CEF не отображается в окне c ++

Я работаю над окном в winapi, которое отображает браузер cef. Мой код компилируется без ошибок и не сталкивается ни с какими ошибками во время выполнения, но пока отображается мое окно, моя веб-страница cef этого не делает (мое окно полностью пустое). Я потратил на это около 6 часов, но мне все еще нечем заняться.

У меня есть окно в отдельном классе от моей основной функции, и я думаю, что это может быть причиной моих проблем, так как мой g_handler может быть передан неправильно.

Спасибо за вашу помощь!

Я удалил весь свой Windows API-код моих примеров (так как он работал нормально), чтобы мои примеры кода были короткими.

Вот мой код:

WinMain:

#include "trackboxWrapper.h"#include <stdexcept>
#include <thread>
#include "include\cef_app.h"
CefRefPtr<trackboxCefHandler> g_handler;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
try
{
CefMainArgs main_args(hInstance);
int exitCode = CefExecuteProcess(main_args, NULL);
if (exitCode >= 0) {
return exitCode;
}

CefSettings settings;
CefRefPtr<CefApp> cefApplication;
CefInitialize(main_args, settings, cefApplication);

trackboxWrapper window(g_handler);

CefRunMessageLoop();
CefShutdown();
}
catch (std::exception& e)
{
MessageBoxA(0, (std::string("Trackox Internal Error \n\n") + e.what()).c_str(), "=(", 0);
}
}

trackboxWrapper (показаны только соответствующие детали cef):
Заголовок (trackboxWrapper.h):

[code]#include <windows.h>

#include "include\cef_app.h"#include "include\cef_base.h"#include "include\cef_browser.h"#include "include\cef_client.h"
class trackboxWrapper
{
public:
CefRefPtr<trackboxCefHandler> & g_handler;

trackboxWrapper(CefRefPtr<trackboxCefHandler> g_handler_pointer);
~trackboxWrapper();
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
}

CPP (trakcboxWrapper.cpp):

trackboxWrapper::trackboxWrapper(CefRefPtr<trackboxCefHandler> g_handler_pointer) : g_handler(g_handler_pointer) {}

LRESULT CALLBACK trackboxWrapper::WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
trackboxWrapper *window = reinterpret_cast<trackboxWrapper*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
if (!window) return DefWindowProc(hwnd, msg, wparam, lparam);

switch (msg)
{
case WM_CREATE:
{
window->g_handler = new trackboxCefHandler();
RECT trackboxCefRect;
GetClientRect(hwnd, &trackboxCefRect);
CefWindowInfo info;
CefBrowserSettings settings;
info.SetAsChild(hwnd, trackboxCefRect);
CefBrowserHost::CreateBrowser(info, window->g_handler.get(), L"http://www.google.com", settings);

}
}

trackboxCefHandler.h:

#ifndef TRACKBOXCEFHANDLER_H_
#define TRACKBOXCEFHANDLER_H_

#include "include/cef_client.h"
class trackboxCefHandler : public CefClient {

public:
trackboxCefHandler() {}
~trackboxCefHandler() {}

IMPLEMENT_REFCOUNTING(trackboxCefHandler);
IMPLEMENT_LOCKING(trackboxCefHandler);
};

#endif

0

Решение

Вы создаете g_handler в трех местах, это может быть вашей проблемой.

Один находится в файле с вашим Winmain (первый фрагмент кода, где вы объявляете эту переменную).

CefRefPtr<trackboxCefHandler> g_handler;

Другой находится в trackboxWrapper.h.

class trackboxWrapper
{
public:
CefRefPtr<trackboxCefHandler> g_handler;
....

И третий находится в trackboxWrapper.cpp:

case WM_CREATE:
{
CefRefPtr<trackboxCefHandler> g_handler = new trackboxCefHandler();

Это три разные переменные, потому что они полностью объявлены в каждом из этих мест, поэтому они также затеняют друг друга (хотя одна в заголовочном файле инициализируется с аргументом в конструкторе, который оставляет две).

Вам определенно не нужно создавать его в третьем фрагменте, потому что вы уже объявили g_handler в своем заголовке:

case WM_CREATE:
{
window->g_handler = new trackboxCefHandler();

будет достаточно.

Таким образом, вы должны иметь один и тот же объект везде.

1

Другие решения

Других решений пока нет …