mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-01 00:12:59 +00:00
SWORD25: Remove main_win.cpp
svn-id: r53177
This commit is contained in:
parent
c939bc753e
commit
1af6e17b0e
@ -190,3 +190,24 @@ bool AppMain()
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool main2(int argc, char ** argv)
|
||||
{
|
||||
// Engine initialisieren.
|
||||
vector<string> CommandLineParameters;
|
||||
for (int i = 0; i < argc; ++i) CommandLineParameters.push_back(string(argv[i]));
|
||||
if (!AppStart(CommandLineParameters))
|
||||
{
|
||||
MessageBoxA(0, ENGINE_STARTUP_ERROR_MESSAGE, ENGINE_STARTUP_ERROR_CAPTION, MB_ICONERROR);
|
||||
AppEnd();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Engine starten.
|
||||
bool RunSuccess = AppMain();
|
||||
|
||||
// Engine deinitialisieren.
|
||||
bool DeinitSuccess = AppEnd();
|
||||
|
||||
return (RunSuccess && DeinitSuccess) ? 0 : 1;
|
||||
}
|
||||
|
@ -1,238 +0,0 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
// This file is part of Broken Sword 2.5
|
||||
// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer
|
||||
//
|
||||
// Broken Sword 2.5 is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Broken Sword 2.5 is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Broken Sword 2.5; if not, write to the Free Software
|
||||
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#ifdef BS_PLATFORM_WINDOWS
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Includes
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <ShellAPI.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
#include "kernel/common.h"
|
||||
#include "kernel/kernel.h"
|
||||
|
||||
#define BS_LOG_PREFIX "MAIN_WIN"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
namespace
|
||||
{
|
||||
const char * const ENGINE_STARTUP_ERROR_MESSAGE = "A fatal error occured during engine startup. Please refer to log.txt for further information.";
|
||||
const char * const ENGINE_STARTUP_ERROR_CAPTION = "Broken Sword 2.5";
|
||||
const char * const EXCEPTION_TERMINATION_MESSAGE = "!! PROGRAM TERMINATED DUE TO EXCEPTION !!";
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
#define XXX(EX) case EX: return #EX;
|
||||
const char * GetExceptionCodeString(DWORD ExceptionCode)
|
||||
{
|
||||
switch (ExceptionCode)
|
||||
{
|
||||
XXX(EXCEPTION_ACCESS_VIOLATION)
|
||||
XXX(EXCEPTION_ARRAY_BOUNDS_EXCEEDED)
|
||||
XXX(EXCEPTION_BREAKPOINT)
|
||||
XXX(EXCEPTION_DATATYPE_MISALIGNMENT)
|
||||
XXX(EXCEPTION_FLT_DENORMAL_OPERAND)
|
||||
XXX(EXCEPTION_FLT_DIVIDE_BY_ZERO)
|
||||
XXX(EXCEPTION_FLT_INEXACT_RESULT)
|
||||
XXX(EXCEPTION_FLT_INVALID_OPERATION)
|
||||
XXX(EXCEPTION_FLT_OVERFLOW)
|
||||
XXX(EXCEPTION_FLT_STACK_CHECK)
|
||||
XXX(EXCEPTION_FLT_UNDERFLOW)
|
||||
XXX(EXCEPTION_GUARD_PAGE)
|
||||
XXX(EXCEPTION_ILLEGAL_INSTRUCTION)
|
||||
XXX(EXCEPTION_IN_PAGE_ERROR)
|
||||
XXX(EXCEPTION_INT_DIVIDE_BY_ZERO)
|
||||
XXX(EXCEPTION_INT_OVERFLOW)
|
||||
XXX(EXCEPTION_INVALID_DISPOSITION)
|
||||
XXX(EXCEPTION_INVALID_HANDLE)
|
||||
XXX(EXCEPTION_NONCONTINUABLE_EXCEPTION)
|
||||
XXX(EXCEPTION_PRIV_INSTRUCTION)
|
||||
XXX(EXCEPTION_SINGLE_STEP)
|
||||
XXX(EXCEPTION_STACK_OVERFLOW)
|
||||
XXX(DBG_CONTROL_C)
|
||||
XXX(DBG_CONTROL_BREAK)
|
||||
XXX(DBG_TERMINATE_THREAD)
|
||||
XXX(DBG_TERMINATE_PROCESS)
|
||||
XXX(RPC_S_UNKNOWN_IF)
|
||||
XXX(RPC_S_SERVER_UNAVAILABLE)
|
||||
default:
|
||||
static char Buffer[64];
|
||||
_snprintf(Buffer, sizeof(Buffer), "UNKNOWN EXCEPTION 0x%08X", ExceptionCode);
|
||||
return Buffer;
|
||||
}
|
||||
}
|
||||
#undef XXX
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
int HandleException(unsigned int ExceptionCode, _EXCEPTION_POINTERS * ExceptionPointersPtr)
|
||||
{
|
||||
BS_LOG_ERRORLN("Exception \"%s\" occured at 0x%08X.", GetExceptionCodeString(ExceptionCode), ExceptionPointersPtr->ContextRecord->Eip);
|
||||
|
||||
// Memorydump schreiben
|
||||
std::string Filename;
|
||||
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
extern bool AppStart(const vector<string> & CommandLineParameters);
|
||||
extern bool AppMain();
|
||||
extern bool AppEnd();
|
||||
|
||||
bool main2(int argc, char ** argv)
|
||||
{
|
||||
// Engine initialisieren.
|
||||
vector<string> CommandLineParameters;
|
||||
for (int i = 0; i < argc; ++i) CommandLineParameters.push_back(string(argv[i]));
|
||||
if (!AppStart(CommandLineParameters))
|
||||
{
|
||||
MessageBoxA(0, ENGINE_STARTUP_ERROR_MESSAGE, ENGINE_STARTUP_ERROR_CAPTION, MB_ICONERROR);
|
||||
AppEnd();
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Engine starten.
|
||||
bool RunSuccess = AppMain();
|
||||
|
||||
// Engine deinitialisieren.
|
||||
bool DeinitSuccess = AppEnd();
|
||||
|
||||
return (RunSuccess && DeinitSuccess) ? 0 : 1;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
// Im Release-Modus wird die gesamte Ausführung wird in einen __try-Block eingebettet, damit alle eventuellen Exceptions abgefangen werden.
|
||||
// Im Debug-Modus wollen wir, dass der Debugger die Exceptions fängt.
|
||||
#ifndef DEBUG
|
||||
__try
|
||||
#endif
|
||||
{
|
||||
// Im Debugmodus erlauben wir mehrere Fenster, ansonsten beenden wir uns wenn das Spiel bereits läuft;
|
||||
// Wichtig ist vor allem dass all dies vor Installation des Logservice passiert, da wir sonst das
|
||||
// Log der laufenden Instanz überschreiben würden.
|
||||
#ifndef DEBUG
|
||||
HANDLE hMutex;
|
||||
hMutex = CreateMutex(NULL, TRUE, "137bd040-8f06-11dd-8299-0016e65b9c32");
|
||||
if(GetLastError() == ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Der weitere Teil ist in eine andere Funktion ausgelagert, da Visual C++ in Funktionen die auch SEH benutzen keine Objekte mit Destruktoren zulässt.
|
||||
return main2(argc, argv);
|
||||
}
|
||||
|
||||
#ifndef DEBUG
|
||||
__except(HandleException(GetExceptionCode(), GetExceptionInformation()))
|
||||
{
|
||||
BS_Kernel::DeleteInstance();
|
||||
BS_LOG_ERRORLN(EXCEPTION_TERMINATION_MESSAGE);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
namespace
|
||||
{
|
||||
size_t CalculateConvertedBufferSize(int NumArgs, LPWSTR * Args)
|
||||
{
|
||||
if (NumArgs > 0 && Args)
|
||||
{
|
||||
size_t BufferSize = NumArgs * sizeof(char *);
|
||||
for (int i = 0; i < NumArgs; ++i)
|
||||
{
|
||||
int Length = WideCharToMultiByte(CP_ACP, 0, Args[i], -1, 0, 0, 0, 0);
|
||||
if (Length == 0) return 0;
|
||||
BufferSize += Length;
|
||||
}
|
||||
|
||||
return BufferSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
bool ConvertCommandLineParametersToANSI(int & NumArgs, vector<char> & Buffer)
|
||||
{
|
||||
// Kommandozeilenparameter auslesen.
|
||||
LPWSTR * Args = CommandLineToArgvW(GetCommandLineW(), &NumArgs);
|
||||
if (NumArgs <= 0 || Args == 0) false;
|
||||
|
||||
// Zuerst berechnen, wie groß der Buffer sein muss, der alle konvertierten Strings und die Stringpointer aufnimmt.
|
||||
size_t BufferSize = CalculateConvertedBufferSize(NumArgs, Args);
|
||||
if (BufferSize == 0) false;
|
||||
|
||||
// Bufferspeicher reservieren.
|
||||
Buffer.resize(BufferSize);
|
||||
|
||||
// Die benötigten Pointer erstellen.
|
||||
char ** StringsPtrPtr = reinterpret_cast<char **>(&Buffer[0]); // Pointer auf den Anfang des Buffers, dort werden die Stringpointer abgelegt.
|
||||
char * StringsPtr = &Buffer[NumArgs * sizeof(char *)]; // Pointer auf den Anfang des Bereiches in dem die Strings abgelegt werden.
|
||||
char * EndPtr = &Buffer[0] + Buffer.size(); // Pointer auf das Ende des Buffers, wird zum Berechnen des verbleibenden Platzes benötigt.
|
||||
|
||||
// Alle Strings konvertieren und zusammen mit den Pointern in den Buffer schreiben.
|
||||
for (int i = 0; i < NumArgs; ++i)
|
||||
{
|
||||
int BytesWritten = WideCharToMultiByte(CP_ACP, 0, Args[i], -1, StringsPtr, EndPtr - StringsPtr, 0, 0);
|
||||
if (BytesWritten == 0) return false;
|
||||
StringsPtrPtr[i] = StringsPtr;
|
||||
StringsPtr += BytesWritten;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
|
||||
{
|
||||
int NumArgs;
|
||||
vector<char> Buffer;
|
||||
if (ConvertCommandLineParametersToANSI(NumArgs, Buffer))
|
||||
{
|
||||
main(NumArgs, reinterpret_cast<char **>(&Buffer[0]));
|
||||
}
|
||||
else
|
||||
main(0, 0);
|
||||
}
|
||||
|
||||
#endif // BS_PLATFORM_WINDOWS
|
@ -2,7 +2,6 @@ MODULE := engines/sword25
|
||||
|
||||
MODULE_OBJS := \
|
||||
main.o \
|
||||
main_win.o \
|
||||
fmv/movieplayer.o \
|
||||
fmv/movieplayer_script.o \
|
||||
fmv/oggtheora/audiobuffer.o \
|
||||
|
Loading…
x
Reference in New Issue
Block a user