[Project64] move program inir/cleanup code in to a separate file
This commit is contained in:
parent
b8ade27bab
commit
9e9189c192
|
@ -0,0 +1,139 @@
|
|||
#include "stdafx.h"
|
||||
#include <Common\Util.h>
|
||||
|
||||
void FixDirectories(void);
|
||||
void FixLocale(void);
|
||||
|
||||
static void IncreaseThreadPriority(void);
|
||||
|
||||
static CTraceFileLog * g_LogFile = NULL;
|
||||
|
||||
void LogLevelChanged(CTraceFileLog * LogFile)
|
||||
{
|
||||
LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||
}
|
||||
|
||||
void LogFlushChanged(CTraceFileLog * LogFile)
|
||||
{
|
||||
LogFile->SetFlushFile(g_Settings->LoadDword(Debugger_AppLogFlush) != 0);
|
||||
}
|
||||
|
||||
void InitializeLog(void)
|
||||
{
|
||||
CPath LogFilePath(CPath::MODULE_DIRECTORY);
|
||||
LogFilePath.AppendDirectory("Logs");
|
||||
if (!LogFilePath.DirectoryExists())
|
||||
{
|
||||
LogFilePath.DirectoryCreate();
|
||||
}
|
||||
LogFilePath.SetNameExtension("Project64.log");
|
||||
|
||||
g_LogFile = new CTraceFileLog(LogFilePath, g_Settings->LoadDword(Debugger_AppLogFlush) != 0, Log_New, 500);
|
||||
#ifdef VALIDATE_DEBUG
|
||||
g_LogFile->SetTraceLevel((TraceLevel)(g_Settings->LoadDword(Debugger_AppLogLevel) | TraceValidate | TraceDebug));
|
||||
#else
|
||||
g_LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||
#endif
|
||||
AddTraceModule(g_LogFile);
|
||||
|
||||
g_Settings->RegisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||
g_Settings->RegisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||
}
|
||||
|
||||
void AppInit(CNotification * Notify)
|
||||
{
|
||||
try
|
||||
{
|
||||
g_Notify = Notify;
|
||||
|
||||
FixDirectories();
|
||||
FixLocale();
|
||||
|
||||
stdstr_f AppName("Project64 %s", VER_FILE_VERSION_STR);
|
||||
IncreaseThreadPriority();
|
||||
|
||||
g_Settings = new CSettings;
|
||||
g_Settings->Initialize(AppName.c_str());
|
||||
|
||||
if (g_Settings->LoadBool(Setting_CheckEmuRunning) &&
|
||||
pjutil::TerminatedExistingExe())
|
||||
{
|
||||
delete g_Settings;
|
||||
g_Settings = new CSettings;
|
||||
g_Settings->Initialize(AppName.c_str());
|
||||
}
|
||||
|
||||
InitializeLog();
|
||||
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Application Starting");
|
||||
CMipsMemoryVM::ReserveMemory();
|
||||
|
||||
//Create the plugin container
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Create Plugins");
|
||||
g_Plugins = new CPlugins(g_Settings->LoadStringVal(Directory_Plugin));
|
||||
|
||||
g_Lang = new CLanguage();
|
||||
g_Lang->LoadCurrentStrings();
|
||||
g_Notify->AppInitDone();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
g_Notify->DisplayError(stdstr_f("Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__).ToUTF16().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void AppCleanup(void)
|
||||
{
|
||||
g_Settings->UnregisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||
g_Settings->UnregisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": cleaning up global objects");
|
||||
|
||||
if (g_Rom) { delete g_Rom; g_Rom = NULL; }
|
||||
if (g_Plugins) { delete g_Plugins; g_Plugins = NULL; }
|
||||
if (g_Settings) { delete g_Settings; g_Settings = NULL; }
|
||||
if (g_Lang) { delete g_Lang; g_Lang = NULL; }
|
||||
|
||||
CMipsMemoryVM::FreeReservedMemory();
|
||||
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Done");
|
||||
CloseTrace();
|
||||
}
|
||||
|
||||
void FixDirectories(void)
|
||||
{
|
||||
CPath Directory(CPath::MODULE_DIRECTORY);
|
||||
Directory.AppendDirectory("Config");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Logs");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Save");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Screenshots");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("textures");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
}
|
||||
|
||||
#include <windows.h>
|
||||
void FixLocale(void)
|
||||
{
|
||||
char *lbuffer = new char[10];
|
||||
if (GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SABBREVLANGNAME, lbuffer, 10))
|
||||
{
|
||||
setlocale(LC_ALL, lbuffer);
|
||||
}
|
||||
delete[] lbuffer;
|
||||
}
|
||||
|
||||
void IncreaseThreadPriority(void)
|
||||
{
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <Project64\User Interface\Notification Class.h>
|
||||
|
||||
void AppInit(CNotification * Notify);
|
||||
void AppCleanup(void);
|
|
@ -44,6 +44,7 @@
|
|||
</Manifest>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="AppInit.cpp" />
|
||||
<ClCompile Include="logging.cpp" />
|
||||
<ClCompile Include="main.cpp" />
|
||||
<ClCompile Include="Multilanguage\LanguageSelector.cpp" />
|
||||
|
@ -178,6 +179,7 @@
|
|||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AppInit.h" />
|
||||
<ClInclude Include="Logging.h" />
|
||||
<ClInclude Include="Multilanguage.h" />
|
||||
<ClInclude Include="Multilanguage\LanguageSelector.h" />
|
||||
|
|
|
@ -426,6 +426,9 @@
|
|||
<ClCompile Include="Settings\Logging Settings.cpp">
|
||||
<Filter>Source Files\N64 System Source</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AppInit.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="User Interface\Icons\left.ico">
|
||||
|
@ -845,5 +848,8 @@
|
|||
<ClInclude Include="Settings\Logging Settings.h">
|
||||
<Filter>Header Files\Settings Headers</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="AppInit.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -1,247 +1,21 @@
|
|||
#include "stdafx.h"
|
||||
#include <Project64\AppInit.h>
|
||||
#include "Multilanguage\LanguageSelector.h"
|
||||
#include <Tlhelp32.h>
|
||||
|
||||
CTraceFileLog * LogFile = NULL;
|
||||
|
||||
void LogLevelChanged(CTraceFileLog * LogFile)
|
||||
{
|
||||
LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||
}
|
||||
|
||||
void LogFlushChanged(CTraceFileLog * LogFile)
|
||||
{
|
||||
LogFile->SetFlushFile(g_Settings->LoadDword(Debugger_AppLogFlush) != 0);
|
||||
}
|
||||
|
||||
void InitializeLog(void)
|
||||
{
|
||||
CPath LogFilePath(CPath::MODULE_DIRECTORY);
|
||||
LogFilePath.AppendDirectory("Logs");
|
||||
if (!LogFilePath.DirectoryExists())
|
||||
{
|
||||
LogFilePath.DirectoryCreate();
|
||||
}
|
||||
LogFilePath.SetNameExtension("Project64.log");
|
||||
|
||||
LogFile = new CTraceFileLog(LogFilePath, g_Settings->LoadDword(Debugger_AppLogFlush) != 0, Log_New, 500);
|
||||
#ifdef VALIDATE_DEBUG
|
||||
LogFile->SetTraceLevel((TraceLevel)(g_Settings->LoadDword(Debugger_AppLogLevel) | TraceValidate | TraceDebug));
|
||||
#else
|
||||
LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
|
||||
#endif
|
||||
AddTraceModule(LogFile);
|
||||
|
||||
g_Settings->RegisterChangeCB(Debugger_AppLogLevel, LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||
g_Settings->RegisterChangeCB(Debugger_AppLogFlush, LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||
}
|
||||
|
||||
/*bool ChangeDirPermission ( const CPath & Dir)
|
||||
{
|
||||
if (Dir.DirectoryExists())
|
||||
{
|
||||
HANDLE hDir = CreateFile(Dir,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL);
|
||||
if (hDir != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
ACL * pOldDACL = NULL;
|
||||
PSECURITY_DESCRIPTOR pSD = NULL;
|
||||
|
||||
if (GetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDACL,NULL,&pSD) == ERROR_SUCCESS)
|
||||
{
|
||||
bool bAdd = true;
|
||||
|
||||
PEXPLICIT_ACCESS_W pListOfExplictEntries;
|
||||
ULONG cCountOfExplicitEntries;
|
||||
if (GetExplicitEntriesFromAclW(pOldDACL,&cCountOfExplicitEntries,&pListOfExplictEntries) == ERROR_SUCCESS)
|
||||
{
|
||||
for (int i = 0; i < cCountOfExplicitEntries; i ++)
|
||||
{
|
||||
EXPLICIT_ACCESS_W &ea = pListOfExplictEntries[i];
|
||||
if (ea.grfAccessMode != GRANT_ACCESS) { continue; }
|
||||
if (ea.grfAccessPermissions != GENERIC_ALL) { continue; }
|
||||
if ((ea.grfInheritance & (CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE)) != (CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE)) { continue; }
|
||||
|
||||
if (ea.Trustee.TrusteeType == TRUSTEE_IS_SID)
|
||||
{
|
||||
}
|
||||
bAdd = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (bAdd)
|
||||
{
|
||||
EXPLICIT_ACCESS ea = {0};
|
||||
ea.grfAccessMode = GRANT_ACCESS;
|
||||
ea.grfAccessPermissions = GENERIC_ALL;
|
||||
ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE;
|
||||
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
|
||||
ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
|
||||
ea.Trustee.ptstrName = TEXT("Users");
|
||||
|
||||
ACL * pNewDACL = NULL;
|
||||
SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL);
|
||||
|
||||
SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDACL,NULL);
|
||||
LocalFree(pNewDACL);
|
||||
}
|
||||
LocalFree(pSD);
|
||||
}
|
||||
CloseHandle(hDir);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}*/
|
||||
|
||||
void FixDirectories(void)
|
||||
{
|
||||
CPath Directory(CPath::MODULE_DIRECTORY);
|
||||
Directory.AppendDirectory("Config");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Logs");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Save");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("Screenshots");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
|
||||
Directory.UpDirectory();
|
||||
Directory.AppendDirectory("textures");
|
||||
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
|
||||
}
|
||||
|
||||
bool TerminatedExistingEmu()
|
||||
{
|
||||
bool bTerminated = false;
|
||||
bool AskedUser = false;
|
||||
DWORD pid = GetCurrentProcessId();
|
||||
|
||||
HANDLE nSearch = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (nSearch != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
PROCESSENTRY32 lppe;
|
||||
|
||||
memset(&lppe, 0, sizeof(PROCESSENTRY32));
|
||||
lppe.dwSize = sizeof(PROCESSENTRY32);
|
||||
stdstr ModuleName = CPath(CPath::MODULE_FILE).GetNameExtension();
|
||||
|
||||
if (Process32First(nSearch, &lppe))
|
||||
{
|
||||
do
|
||||
{
|
||||
if (_stricmp(lppe.szExeFile, ModuleName.c_str()) != 0 ||
|
||||
lppe.th32ProcessID == pid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!AskedUser)
|
||||
{
|
||||
AskedUser = true;
|
||||
int res = MessageBox(NULL, stdstr_f("Project64.exe currently running\n\nTerminate pid %d now?", lppe.th32ProcessID).c_str(), "Terminate project64", MB_YESNO | MB_ICONEXCLAMATION);
|
||||
if (res != IDYES)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lppe.th32ProcessID);
|
||||
if (hHandle != NULL)
|
||||
{
|
||||
if (TerminateProcess(hHandle, 0))
|
||||
{
|
||||
bTerminated = true;
|
||||
}
|
||||
else {
|
||||
MessageBox(NULL, stdstr_f("Failed to terminate pid %d", lppe.th32ProcessID).c_str(), "Terminate project64 failed!", MB_YESNO | MB_ICONEXCLAMATION);
|
||||
}
|
||||
CloseHandle(hHandle);
|
||||
}
|
||||
} while (Process32Next(nSearch, &lppe));
|
||||
}
|
||||
CloseHandle(nSearch);
|
||||
}
|
||||
return bTerminated;
|
||||
}
|
||||
|
||||
const char * AppName(void)
|
||||
{
|
||||
static stdstr Name;
|
||||
if (Name.empty())
|
||||
{
|
||||
Name = stdstr_f("Project64 %s", VER_FILE_VERSION_STR);
|
||||
}
|
||||
return Name.c_str();
|
||||
}
|
||||
|
||||
#ifndef WINDOWS_UI
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
while (argc > 0)
|
||||
{
|
||||
puts(argv[--argc]);
|
||||
}
|
||||
putchar('\n');
|
||||
|
||||
fprintf(
|
||||
stderr,
|
||||
"Cross-platform (graphical/terminal?) UI not yet implemented.\n"
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpszArgs*/, int /*nWinMode*/)
|
||||
{
|
||||
FixDirectories();
|
||||
|
||||
char *lbuffer = new char[10];
|
||||
if (GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SABBREVLANGNAME, lbuffer, 10))
|
||||
setlocale(LC_ALL, lbuffer);
|
||||
delete[] lbuffer;
|
||||
|
||||
CoInitialize(NULL);
|
||||
try
|
||||
{
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
g_Settings = new CSettings;
|
||||
g_Settings->Initialize(AppName());
|
||||
|
||||
if (g_Settings->LoadBool(Setting_CheckEmuRunning) &&
|
||||
TerminatedExistingEmu())
|
||||
{
|
||||
delete g_Settings;
|
||||
g_Settings = new CSettings;
|
||||
g_Settings->Initialize(AppName());
|
||||
}
|
||||
|
||||
InitializeLog();
|
||||
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Application Starting");
|
||||
CMipsMemoryVM::ReserveMemory();
|
||||
|
||||
g_Notify = &Notify();
|
||||
|
||||
//Create the plugin container
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Create Plugins");
|
||||
g_Plugins = new CPlugins(g_Settings->LoadStringVal(Directory_Plugin));
|
||||
|
||||
//Select the language
|
||||
g_Lang = new CLanguage();
|
||||
if (!g_Lang->LoadCurrentStrings())
|
||||
CoInitialize(NULL);
|
||||
AppInit(&Notify());
|
||||
if (!g_Lang->IsLanguageLoaded())
|
||||
{
|
||||
CLanguageSelector().Select();
|
||||
}
|
||||
|
||||
//Create the main window with Menu
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Create Main Window");
|
||||
stdstr WinTitle(AppName());
|
||||
|
||||
WinTitle.Format("Project64 %s", VER_FILE_VERSION_STR);
|
||||
|
||||
CMainGui MainWindow(true, WinTitle.c_str()), HiddenWindow(false);
|
||||
CMainGui MainWindow(true, stdstr_f("Project64 %s", VER_FILE_VERSION_STR).c_str()), HiddenWindow(false);
|
||||
CMainMenu MainMenu(&MainWindow);
|
||||
g_Plugins->SetRenderWindows(&MainWindow, &HiddenWindow);
|
||||
Notify().SetMainWindow(&MainWindow);
|
||||
|
@ -280,27 +54,13 @@ int WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /
|
|||
g_BaseSystem = NULL;
|
||||
}
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": System Closed");
|
||||
|
||||
g_Settings->UnregisterChangeCB(Debugger_AppLogLevel, LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
|
||||
g_Settings->UnregisterChangeCB(Debugger_AppLogFlush, LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
WriteTraceF(TraceError, __FUNCTION__ ": Exception caught (File: \"%s\" Line: %d)", __FILE__, __LINE__);
|
||||
MessageBox(NULL, stdstr_f("Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__).c_str(), "Exception", MB_OK);
|
||||
}
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": cleaning up global objects");
|
||||
|
||||
if (g_Rom) { delete g_Rom; g_Rom = NULL; }
|
||||
if (g_Plugins) { delete g_Plugins; g_Plugins = NULL; }
|
||||
if (g_Settings) { delete g_Settings; g_Settings = NULL; }
|
||||
if (g_Lang) { delete g_Lang; g_Lang = NULL; }
|
||||
|
||||
CMipsMemoryVM::FreeReservedMemory();
|
||||
|
||||
AppCleanup();
|
||||
CoUninitialize();
|
||||
WriteTrace(TraceDebug, __FUNCTION__ ": Done");
|
||||
CloseTrace();
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
}
|
Loading…
Reference in New Issue