Использование 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"