/////////////////////////////////////////////////////////////// // // WinMain // // // /////////////////////////////////////////////////////////////// int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // Load the loader.dll and continue the load #ifdef MTA_DEBUG SString strLoaderDllFilename = "loader_d.dll"; #else SString strLoaderDllFilename = "loader.dll"; #endif SString strMTASAPath = PathJoin ( GetLaunchPath (), "mta" ); SString strLoaderDllPathFilename = PathJoin ( strMTASAPath, strLoaderDllFilename ); // Load loader dll HMODULE hModule = LoadLibrary ( strLoaderDllPathFilename ); int iReturnCode = 0; if ( hModule ) { // Find and call DoWinMain typedef int (*PFNDOWINMAIN) ( HINSTANCE, HINSTANCE, LPSTR, int ); PFNDOWINMAIN pfnDoWinMain = static_cast < PFNDOWINMAIN > ( static_cast < PVOID > ( GetProcAddress ( hModule, "DoWinMain" ) ) ); if ( pfnDoWinMain ) iReturnCode = pfnDoWinMain ( hInstance, hPrevInstance, lpCmdLine, nCmdShow ); FreeLibrary ( hModule ); } else { SString strError = GetSystemErrorMessage ( GetLastError () ); SString strMessage ( "Failed to load: '%s'\n\n%s", *strLoaderDllPathFilename, *strError ); AddReportLog ( 5711, strMessage ); BrowseToSolution ( "loader-dll-missing", true, false, false, strMessage ); iReturnCode = 1; } return iReturnCode; }
////////////////////////////////////////////////////////// // // InitLocalization // // Start localization thingmy // ////////////////////////////////////////////////////////// void InitLocalization( bool bNoFail ) { static bool bDone = false; if ( bDone ) return; // Check for and load core.dll for localization // Use launch relative path so core.dll can get updated SString strCoreDLL = PathJoin( GetLaunchPath(), "mta", MTA_DLL_NAME ); if ( !FileExists ( strCoreDLL ) ) { if ( !bNoFail ) return; DisplayErrorMessageBox ( ("Load failed. Please ensure that " "the file core.dll is in the modules " "directory within the MTA root directory."), _E("CL23"), "core-missing" ); // Core.dll missing return ExitProcess( EXIT_ERROR ); } // Use registry setting of mta path for dlls, as they will not be present in update files const SString strMTASAPath = GetMTASAPath (); SetDllDirectory( PathJoin( strMTASAPath, "mta" ) ); // See if xinput is loadable (XInput9_1_0.dll is core.dll dependency) HMODULE hXInputModule = LoadLibrary( "XInput9_1_0.dll" ); if ( hXInputModule ) FreeLibrary( hXInputModule ); else { // If not, do hack to use dll supplied with MTA SString strDest = PathJoin( strMTASAPath, "mta", "XInput9_1_0.dll" ); if ( !FileExists( strDest ) ) { SString strSrc = PathJoin( strMTASAPath, "mta", "XInput9_1_0_mta.dll" ); FileCopy( strSrc, strDest ); } } // Check if the core can be loaded - failure may mean msvcr90.dll or d3dx9_40.dll etc is not installed HMODULE hCoreModule = LoadLibrary( strCoreDLL ); if ( hCoreModule == NULL ) { if ( !bNoFail ) return; DisplayErrorMessageBox ( ("Loading core failed. Please ensure that \n" "Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) \n" "and the latest DirectX is correctly installed."), _E("CL24"), "vc-redist-missing" ); // Core.dll load failed. Ensure VC++ Redists and DX are installed return ExitProcess( EXIT_ERROR ); } // Grab our locale from the registry if possible, if not Windows SString strLocale = GetApplicationSetting ( "locale" ); if ( strLocale.empty() ) { setlocale(LC_ALL, ""); char* szLocale = setlocale(LC_ALL, NULL); strLocale = szLocale; } typedef CLocalizationInterface* (__cdecl *FUNC_CREATELOCALIZATIONFROMENVIRONMENT)(SString strLocale); FUNC_CREATELOCALIZATIONFROMENVIRONMENT pFunc = (FUNC_CREATELOCALIZATIONFROMENVIRONMENT)GetProcAddress ( hCoreModule, "L10n_CreateLocalization" ); CLocalizationInterface* pLocalization = pFunc(strLocale); if ( pLocalization == NULL ) { if ( !bNoFail ) return; DisplayErrorMessageBox ( ("Loading core failed. Please ensure that \n" "Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) \n" "and the latest DirectX is correctly installed."), _E("CL26"), "vc-redist-missing" ); // Core.dll load failed. Ensure VC++ Redists and DX are installed FreeLibrary ( hCoreModule ); return ExitProcess( EXIT_ERROR ); } SAFE_DELETE( g_pLocalization ); g_pLocalization = pLocalization; bDone = true; #ifdef MTA_DEBUG TestDialogs(); #endif }