#pragma once
#include "GdCPP_Exports.h"
#include "IpHelper.h"

struct GDCPP_API sApp
{
	// 当前执行文件的完整路径
	fs::path ExeFullPath;

	// 当前执行exe所在目录
	fs::path ExeDir;

	// Exe文件名，可以根据不同名称执行不同的内容
	std::wstring wstrExeName;

	// 工作目录，是Log、Setting目录的主目录
	// 初始化默认等于ExeDir。
	// 如果exe所在目录是Debug或Release，ExeDir就上移一层，到x64
	// 应用层可以另外指定工作目录
	fs::path WorkDir;

	// 参数目录，默认为WorkDir下的Setting。应用层可以另外指定
	fs::path SettingDir;
	// Log目录，默认为WorkDir下的Log。应用层可以另外指定
	fs::path LogDir;			

	// exe文件的版本
	std::wstring exeFileVerStr;

	std::wstring exeProductVerStr;

	// exe的HINSTANCE
	HINSTANCE hInstance_Exe=0;

	CAdapterList NetAdapter;

	// @brief 跟具体应用关系不大的常规初始操作，与应用相关的放到init()。
	// 初始化CTick，获取exe路径，设置工作目录、Log目录、Dump。在InitInstance()开头调用
	// @return 是否有错。没错返回0；已知错误：
	virtual int preInit();

	// 与应用相关的初始化，每个应用相差很大，
	// 继承类不需要调用sApp::init()，只是给个参考。
	// 通常先调整工作目录，初始化Log，后面的操作都需要用到Log了
	virtual int init();

	virtual int deinit();

	// 初始化gdi用到的变量，
	// 保存下来用于在deinit()里判断是否初始化过gdi
	ULONG_PTR           m_gdiplusToken=0;

	// 初始化socket用到的变量，
	// 保存下来用于在deinit()里用判断是否初始化过socket
	WSADATA wsaData={0,0};

	void initGDI();
	bool initSocket();
	virtual void RestartWindows();
	virtual void ShutdownWindows();
};

