#include "pch.h" #include "sApp.h" #include "CreateDump.h" #include "Tools.h" #include #include "aLog.h" #include "CTic.h" using namespace Gdiplus; #pragma comment (lib,"Gdiplus.lib") int sApp::preInit() { CTic::Init(); TCHAR path[MAX_PATH + 1]; GetModuleFileName(NULL, path, MAX_PATH); ExeFullPath = path; //完整路径 wstrExeName = ExeFullPath.stem().wstring(); //保存去掉扩展名的文件名 ExeDir = ExeFullPath.parent_path(); //exe所在路径 setCreateDump((ExeDir / wstrExeName).c_str(), MiniDumpWithIndirectlyReferencedMemory | MiniDumpWithDataSegs | MiniDumpWithHandleData | MiniDumpWithThreadInfo); hInstance_Exe = GetModuleHandle(NULL); GetFileVersion(path, exeFileVerStr); // 如果版本号是以.0结尾,去掉 auto pos = exeFileVerStr.rfind(L".0"); if (pos != std::wstring::npos && pos == exeFileVerStr.size() - 2) { exeFileVerStr.erase(pos); } GetProductVersion(path, exeProductVerStr); pos = exeProductVerStr.rfind(L".0"); if (pos != std::wstring::npos && pos == exeProductVerStr.size() - 2) { exeProductVerStr.erase(pos); } // 设置搜索dll的方式 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); // 默认工作目录是exe所在目录 WorkDir = ExeDir; // 如果在Debug/Release目录之下调试,工作目录向上一级 auto pathname = ExeDir.filename().wstring(); if (pathname._Starts_with(L"Debug") || pathname._Starts_with(L"Release") || pathname._Starts_with(L"debug") || pathname._Starts_with(L"release")) { WorkDir = ExeDir.parent_path(); fs::path solutionDir = WorkDir.parent_path(); } return 0; } // 子类不用调用sApp::init(),这里只是打个样; int sApp::init() { // 如果要更改WorkDir,在这开头修改 SettingDir = WorkDir / L"Setting"; LogDir = WorkDir / L"Log"; if (!fs::exists(SettingDir)) { fs::create_directories(SettingDir); } // Log目录不存在则创建 if (!fs::exists(LogDir)) { fs::create_directories(LogDir); } initGDI(); initSocket(); return 0; } int sApp::deinit() { if(wsaData.wVersion) // 初始化过应该是0x0202 WSACleanup(); if(m_gdiplusToken) GdiplusShutdown(m_gdiplusToken); return 0; } void sApp::initGDI() { GdiplusStartupInput gdiplusStartupInput; // Initialize GDI+. GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); } bool sApp::initSocket() { //第一个参数为WinSock版本号,低字节为主版本号,高字节为修正版本号,第二个参数为WSADATA类型的指针 初始化成功返回0 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { alog->error("WSAStartup 失败"); //TRACE(_T("WSAStartup 失败!\n")); return false; } return true; } void sApp::RestartWindows() { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; // Get the LUID for the shutdown privilege. if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) { CloseHandle(hToken); return; } tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) { CloseHandle(hToken); return; } if (GetLastError() != ERROR_SUCCESS) { CloseHandle(hToken); return; } // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE)) { CloseHandle(hToken); return; } //shutdown was successful CloseHandle(hToken); return; } void sApp::ShutdownWindows() { HANDLE hToken; TOKEN_PRIVILEGES tkp; // Get a token for this process. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; // Get the LUID for the shutdown privilege. if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) { CloseHandle(hToken); return; } tkp.PrivilegeCount = 1; // one privilege to set tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Get the shutdown privilege for this process. if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) { CloseHandle(hToken); return; } if (GetLastError() != ERROR_SUCCESS) { CloseHandle(hToken); return; } // Shut down the system and force all applications to close. if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_MINOR_UPGRADE)) { CloseHandle(hToken); return; } //shutdown was successful CloseHandle(hToken); return; }