Использование CEF в DLL

Хочу использовать CEF в игре в качестве пользовательского интерфейса, собрал свой проект и поместил в него библиотеки и каталоги CEF. Но столкнулся с проблемой, не могу понять как мне создать окно содержащее в себе CEF и показать его в игре.

Сейчас я создал только обычное WinApi окно внутри процесса:

#include "Header.h" //всё необходимое подключено здесь.

HINSTANCE   DllModule;

HWND        DllWindow;
HWND        GameWindow;

LRESULT CALLBACK DLLWindowProc(HWND, UINT, WPARAM, LPARAM);

BOOL RegisterDLLWindowClass(const wchar_t szClassName[])
{
    WNDCLASSEX wc;

    wc.hInstance = DllModule;
    wc.lpszClassName = (LPCWSTR)szClassName;
    wc.lpfnWndProc = DLLWindowProc;
    wc.style = CS_DBLCLKS;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;

    if (!RegisterClassEx(&wc))
        return 0;

    return 1;
}

DWORD WINAPI MainThread(LPVOID lpParam)
{
    wchar_t* WindowName = reinterpret_cast<wchar_t*> (lpParam);
    const wchar_t WindowClassName[] = L"WinApp";

    RegisterDLLWindowClass(WindowClassName);
    GameWindow = FindWindow(NULL, L"Window name");
    
    DllWindow = CreateWindowEx(0, WindowClassName, WindowName, WS_EX_TOPMOST | WS_EX_LAYERED | WS_POPUP | WS_VISIBLE, 100, 100, 300, 300, GameWindow, NULL, DllModule, NULL);

    ShowWindow(DllWindow, SW_SHOW);
    UpdateWindow(DllWindow);

    MSG messages = { 0 };
    
    while (GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    
    return 0;
}

LRESULT CALLBACK DLLWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_DESTROY:

        PostQuitMessage(0);
        break;
        
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {

    switch (ul_reason_for_call) {

    case DLL_PROCESS_ATTACH:

        if (!lpReserved)
        {
            DllModule = hModule;
            CreateThread(0, NULL, MainThread, (LPVOID)L"Window", NULL, NULL);
        }

        break;

    case DLL_THREAD_ATTACH:

        break;

    case DLL_THREAD_DETACH:

        break;

    case DLL_PROCESS_DETACH:

        break;
    }
    return TRUE;
}

Код из Header.h:

#include "windows.h"

#include "include/base/cef_bind.h"
#include "include/cef_app.h"
#include "include/cef_parser.h"

#include "include/views/cef_browser_view.h"
#include "include/views/cef_window.h"

#include "include/wrapper/cef_closure_task.h"
#include "include/wrapper/cef_helpers.h"
#include "include/cef_browser.h"

#include "include/cef_command_line.h"
#include "include/views/cef_browser_view.h"
#include "include/views/cef_window.h"

#include "include/wrapper/cef_helpers.h"
#include "include/cef_client.h"

Ответы (0 шт):