
// OGCAssistTool.cpp : 定义应用程序的类行为。
//

#include "stdafx.h"
#include "OGCAssistTool.h"
#include "OGCAssistToolDlg.h"
#include "DlgLogin.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

INT StartOGCTool()
{
	INT nRet = 0;
	DWORD dwProcId = 0;
	if ( 0 == ( dwProcId = GLOBAL::FindProcess(_T("Demo.exe"))) )
	{
		// 没有找到目标进程,启动;
		if ( !GLOBAL::StartProcess(GLOBAL::g_config.szOGCToolProgram) )
		{
			// 新开失败;
			MessageBox(NULL, _T("启动进程失败"), _T("错误！"), MB_ICONERROR);
			return 0;
		}

		nRet = 1;	// 进程新开;
	}
	else 
	{
		TCHAR szModulPath[MAX_PATH] = {0};
		_stprintf(szModulPath, _T("%s"), GLOBAL::GetModulePath(_T("Demo.exe"), dwProcId));
		if ( _tcscmp(szModulPath, GLOBAL::g_config.szOGCToolProgram) != 0 )
		{
			TCHAR szMsg[1024] = {0};
			_stprintf_s(szMsg, 
				_T("存在同名进程，目录非指定路径，请手动关闭非目标路径程序")
				_T("\n\n当前进程路径：%s\n\n正确进程路径：%s\n\n")
				_T("是：关闭当前进程并启动目标进程\n")
				_T("否：不关闭当前进程，退出操作\n")
				_T("取消：不关闭当前进程，启动目标进程\n"), 
				szModulPath, 
				GLOBAL::g_config.szOGCToolProgram);
			INT nChoose = MessageBox(NULL, szMsg, _T("错误，存在同名进程！"), MB_ICONERROR|MB_YESNOCANCEL);
			if ( nChoose == IDNO )
			{
				// 退出新开;
				return -1;
			}
			else if ( nChoose == IDYES )
			{
				// 关闭当前进程;
				HANDLE token = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
				TerminateProcess(token, 0);
			}

			if ( !GLOBAL::StartProcess(GLOBAL::g_config.szOGCToolProgram) )
			{
				// 新开失败;
				MessageBox(NULL, _T("启动进程失败"), _T("错误！"), MB_ICONERROR);
				return 0;
			}

			nRet = 1;
		}
		else
		{
			nRet = 2;
			GLOBAL::g_procWndInfo.dwProcId = dwProcId;
		}
	}

	// 新开进程标记未劫持;
	if ( nRet == 1 )
		GLOBAL::g_bHijacted = FALSE;

	return nRet;
}

// COGCAssistToolApp

BEGIN_MESSAGE_MAP(COGCAssistToolApp, CWinAppEx)
	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()


// COGCAssistToolApp 构造

COGCAssistToolApp::COGCAssistToolApp()
{
	// TODO: 在此处添加构造代码，
	// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 COGCAssistToolApp 对象

COGCAssistToolApp theApp;


// COGCAssistToolApp 初始化

BOOL COGCAssistToolApp::InitInstance()
{
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式，
	//则需要 InitCommonControlsEx()。否则，将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinAppEx::InitInstance();

	AfxEnableControlContainer();

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小，则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串，
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	MTVERIFY(GLOBAL::GetConfigInfo());

	GLOBAL::g_IOCP.Start();

#pragma region 打开目标进程;
	if ( StartOGCTool() < 0 )
		return FALSE;
#pragma endregion

#pragma region 登录对话框;
	CDlgLogin LoginDlg;
	if ( LoginDlg.DoModal() != IDOK )
	{
		return FALSE;
	}
#pragma endregion

	COGCAssistToolDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此放置处理何时用
		//  “确定”来关闭对话框的代码
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置处理何时用
		//  “取消”来关闭对话框的代码
	}

	// 由于对话框已关闭，所以将返回 FALSE 以便退出应用程序，
	//  而不是启动应用程序的消息泵。
	return FALSE;
}
