Files
GdCpp12/source/sApp.cpp

201 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "pch.h"
#include "sApp.h"
#include "CreateDump.h"
#include "Tools.h"
#include <gdiplus.h>
#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;
}