Ошибка после подключения imgui

Статус
В этой теме нельзя размещать новые ответы.

CatKnight

Известный
Автор темы
146
53
День добрый. Подключил к своему плагину ImGui. Всё работает, но есть одна проблема. Когда на этапе загрузки игры свернуть окно (или выбрать другое окно), то выскакивает следующая ошибка, и игру крашит. Замечал, что у того же мунлоадера или других плагинов с этим всё нормально. Где я сделал что-то не так? Заранее благодарю за помощь.
QNeD5tv.png
C++:
#include <Windows.h>
#include <string>
#include "Shlobj.h"
#include "main.h"
#include "ImGui\imgui.h"
#include "ImGui\imgui_impl_dx9.h"
#include "ImGui\imgui_impl_win32.h"
#include <d3d9.h>
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include <tchar.h>
#include <regex>
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"shell32.lib")

extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

SAMPFUNCS *SF = new SAMPFUNCS();

bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{

    if (SUCCEEDED(SF->getRender()->BeginRender()))
    {
        ImGui_ImplDX9_NewFrame();
        ImGui_ImplWin32_NewFrame();
        ImGui::NewFrame();
        //
        ImGui::EndFrame();
        ImGui::Render();

        ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());

        SF->getRender()->EndRender();
    }
    return true;
}

HRESULT CALLBACK Reset(D3DPRESENT_PARAMETERS* pPresentationParameters)
{
    ImGui_ImplDX9_InvalidateDeviceObjects();
    return true;
}

bool CALLBACK WndProcHandler(HWND hwd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    ImGui_ImplWin32_WndProcHandler(hwd, msg, wParam, lParam);
    return true;
}

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
            SF->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_RESET, Reset);
            SF->getGame()->registerWndProcCallback(SFGame::MEDIUM_CB_PRIORITY, WndProcHandler);
            // ImGui //
            ImGui::CreateContext();
            ImGuiIO& IO = ImGui::GetIO();
            ImGui_ImplWin32_Init(GetActiveWindow());
            ImGui_ImplDX9_Init(SF->getRender()->getD3DDevice());

            ImFontConfig font_config;
            TCHAR path[MAX_PATH];
            HRESULT hr = SHGetFolderPathA(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, path);
            std::string fPath = std::string(path).append("\\arialbd.ttf");
            IO.Fonts->AddFontFromFileTTF(fPath.c_str(), 14.0f, &font_config, IO.Fonts->GetGlyphRangesCyrillic());
            initialized = true;
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    if (dwReasonForCall == DLL_PROCESS_DETACH) {
        ImGui_ImplDX9_Shutdown();
        ImGui_ImplWin32_Shutdown();
        ImGui::DestroyContext();
    }
    return TRUE;
}
 
Статус
В этой теме нельзя размещать новые ответы.