/** * @file MainWin32.cpp * @brief Win32 可执行程序入口与消息泵实现。 * @details * 负责设置工作目录、初始化调试内存检测,并驱动主循环: * - 轮询并分发 Windows 消息; * - 在消息空闲阶段调用 engine_update; * - 退出时由 engine_shutdown 完成资源收尾。 */ #ifdef _WIN64 #include "CommonHeader.h" #include #ifndef WIN32_MEAN_AND_LEAN #define WIN32_MEAN_AND_LEAN #endif #include #include namespace { /** * @brief 将当前工作目录切换到可执行文件所在目录。 * @return 切换后的当前目录;失败时返回空路径。 */ std::filesystem::path set_current_directory_to_executable_path() { wchar_t path[MAX_PATH]{}; const uint32_t length{ GetModuleFileName(0, &path[0], MAX_PATH) }; if (!length || GetLastError() == ERROR_INSUFFICIENT_BUFFER) return {}; std::filesystem::path p{ path }; std::filesystem::current_path(p.parent_path()); return std::filesystem::current_path(); } } #ifndef USE_WITH_EDITOR extern bool engine_initialize(); extern void engine_update(); extern void engine_shutdown(); /** * @brief Win32 程序入口函数。 * @return 进程退出码。 */ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { #if _DEBUG _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif set_current_directory_to_executable_path(); if (engine_initialize()) { MSG msg{}; bool is_running{ true }; while (is_running) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); is_running &= (msg.message != WM_QUIT); } engine_update(); } } } #endif // USE_WITH_EDITOR #endif // _WIN64