////////////////////////////////////////////////////////// // // CInstallManager::_ShowCrashFailDialog // // // ////////////////////////////////////////////////////////// SString CInstallManager::_ShowCrashFailDialog ( void ) { // Crashed before gta game started ? if ( WatchDogIsSectionOpen ( "L1" ) ) WatchDogIncCounter ( "CR1" ); HideSplash (); // Transfer gta-fopen-last info if ( GetApplicationSetting ( "diagnostics", "gta-fopen-fail" ).empty() ) SetApplicationSetting ( "diagnostics", "gta-fopen-fail", GetApplicationSetting ( "diagnostics", "gta-fopen-last" ) ); SetApplicationSetting ( "diagnostics", "gta-fopen-last", "" ); SString strMessage = GetApplicationSetting ( "diagnostics", "last-crash-info" ); SString strReason = GetApplicationSetting ( "diagnostics", "last-crash-reason" ); SetApplicationSetting ( "diagnostics", "last-crash-reason", "" ); if ( strReason == "direct3ddevice-reset" ) { strMessage += _("** The crash was caused by a graphics driver error **\n\n** Please update your graphics drivers **"); } else { strMessage += strReason; } strMessage = strMessage.Replace ( "\r", "" ).Replace ( "\n", "\r\n" ); SString strResult = ShowCrashedDialog ( g_hInstance, strMessage ); HideCrashedDialog (); CheckAndShowFileOpenFailureMessage (); return strResult; }
bool CClientDFF::ReplaceModel(unsigned short usModel, bool bAlphaTransparency) { // Record attempt in case it all goes wrong CArgMap argMap; argMap.Set("id", usModel); argMap.Set("reason", "ReplaceModel"); SetApplicationSetting("diagnostics", "gta-model-fail", argMap.ToString()); bool bResult = DoReplaceModel(usModel, bAlphaTransparency); SetApplicationSetting("diagnostics", "gta-model-fail", ""); return bResult; }
////////////////////////////////////////////////////////// // // HandleCustomStartMessage // // // ////////////////////////////////////////////////////////// void HandleCustomStartMessage ( void ) { SString strStartMessage = GetApplicationSetting( "diagnostics", "start-message" ); SString strTrouble = GetApplicationSetting( "diagnostics", "start-message-trouble" ); if ( strStartMessage.empty() ) return; SetApplicationSetting( "diagnostics", "start-message", "" ); SetApplicationSetting( "diagnostics", "start-message-trouble", "" ); if ( strStartMessage.BeginsWith( "vdetect" ) ) { SString strFilename = strStartMessage.SplitRight( "name=" ); strStartMessage = _( "WARNING\n\n" "MTA:SA has detected unusual activity.\n" "Please run a virus scan to ensure your system is secure.\n\n" ); strStartMessage += SString( _( "The detected file was: %s\n" ), *strFilename ); } DisplayErrorMessageBox( strStartMessage, _E("CL37"), strTrouble ); }
//////////////////////////////////////////////////////////////////////////////////////////////// // Check for invalid RpHAnimHierarchy* void _cdecl OnGetAnimHierarchyFromSkinClump(RpClump* pRpClump, void* pRpHAnimHierarchyResult) { if (pRpHAnimHierarchyResult == nullptr) { // Crash will occur at offset 003C51A8 uint uiModelId = pGameInterface->GetPools()->GetModelIdFromClump(pRpClump); LogEvent(818, "Model bad anim hierarchy", "GetAnimHierarchyFromSkinClump", SString("Corrupt model:%d", uiModelId), 5418); CArgMap argMap; argMap.Set("id", uiModelId); argMap.Set("reason", "anim_hierarchy"); SetApplicationSetting("diagnostics", "gta-model-fail", argMap.ToString()); } }
////////////////////////////////////////////////////////// // // CInstallManager::_InstallNewsItems // // // ////////////////////////////////////////////////////////// SString CInstallManager::_InstallNewsItems ( void ) { // Get install news queue CArgMap queue; queue.SetFromString ( GetApplicationSetting ( "news-install" ) ); SetApplicationSetting ( "news-install", "" ); std::vector < SString > keyList; queue.GetKeys ( keyList ); for ( uint i = 0 ; i < keyList.size () ; i++ ) { // Install each file SString strDate = keyList[i]; SString strFileLocation = queue.Get ( strDate ); // Save cwd SString strSavedDir = GetSystemCurrentDirectory (); // Calc and make target dir SString strTargetDir = PathJoin ( GetMTADataPath (), "news", strDate ); MkDir ( strTargetDir ); // Extract into target dir SetCurrentDirectory ( strTargetDir ); // Try to extract the files if ( !ExtractFiles ( strFileLocation ) ) { // If extract failed and update file is an exe, try to run it if ( ExtractExtension ( strFileLocation ).CompareI ( "exe" ) ) ShellExecuteBlocking ( "open", strFileLocation, "-s" ); } // Restore cwd SetCurrentDirectory ( strSavedDir ); // Check result if ( FileExists ( PathJoin ( strTargetDir, "files.xml" ) ) ) { SetApplicationSettingInt ( "news-updated", 1 ); AddReportLog ( 2051, SString ( "InstallNewsItems ok for '%s'", *strDate ) ); } else { AddReportLog ( 4048, SString ( "InstallNewsItems failed with '%s' '%s' '%s'", *strDate, *strFileLocation, *strTargetDir ) ); } } return "ok"; }
// // Direct players to info about trouble // void SharedUtil::BrowseToSolution ( const SString& strType, bool bAskQuestion, bool bTerminateProcess, bool bDoOnExit, const SString& strMessageBoxMessage ) { AddReportLog ( 3200, SString ( "Trouble %s", *strType ) ); // Put args into a string and save in the registry CArgMap argMap; argMap.Set ( "type", strType.SplitLeft ( ";" ) ); argMap.Set ( "bAskQuestion", bAskQuestion ); argMap.Set ( "message", strMessageBoxMessage ); SetApplicationSetting ( "pending-browse-to-solution", argMap.ToString () ); // Do it now if required if ( !bDoOnExit ) ProcessPendingBrowseToSolution (); // Exit if required if ( bTerminateProcess ) TerminateProcess ( GetCurrentProcess (), 1 ); }
void CCrashDumpWriter::DumpMiniDump ( _EXCEPTION_POINTERS* pException, CExceptionInformation* pExceptionInformation ) { WriteDebugEvent ( "CCrashDumpWriter::DumpMiniDump" ); // Try to load the DLL in our directory HMODULE hDll = NULL; char szDbgHelpPath [MAX_PATH]; if ( GetModuleFileNameA ( NULL, szDbgHelpPath, MAX_PATH ) ) { char* pSlash = _tcsrchr ( szDbgHelpPath, '\\' ); if ( pSlash ) { _tcscpy ( pSlash + 1, "DBGHELP.DLL" ); hDll = LoadLibrary ( szDbgHelpPath ); } } // If we couldn't load the one in our dir, load any version available if ( !hDll ) { hDll = LoadLibrary( "DBGHELP.DLL" ); } if ( !hDll ) AddReportLog( 9201, "CCrashDumpWriter::DumpMiniDump - Could not load DBGHELP.DLL" ); // We could load a dll? if ( hDll ) { // Grab the MiniDumpWriteDump proc address MINIDUMPWRITEDUMP pDump = reinterpret_cast < MINIDUMPWRITEDUMP > ( GetProcAddress( hDll, "MiniDumpWriteDump" ) ); if ( !pDump ) AddReportLog( 9202, "CCrashDumpWriter::DumpMiniDump - Could not find MiniDumpWriteDump" ); if ( pDump ) { // Create the file HANDLE hFile = CreateFile ( CalcMTASAPath ( "mta\\core.dmp" ), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if ( hFile == INVALID_HANDLE_VALUE ) AddReportLog( 9203, SString( "CCrashDumpWriter::DumpMiniDump - Could not create '%s'", *CalcMTASAPath ( "mta\\core.dmp" ) ) ); if ( hFile != INVALID_HANDLE_VALUE ) { // Create an exception information struct _MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = GetCurrentThreadId (); ExInfo.ExceptionPointers = pException; ExInfo.ClientPointers = FALSE; // Write the dump BOOL bResult = pDump ( GetCurrentProcess(), GetCurrentProcessId(), hFile, (MINIDUMP_TYPE)( MiniDumpNormal | MiniDumpWithIndirectlyReferencedMemory ), &ExInfo, NULL, NULL ); if ( !bResult ) AddReportLog( 9204, SString( "CCrashDumpWriter::DumpMiniDump - MiniDumpWriteDump failed (%08x)", GetLastError() ) ); else WriteDebugEvent ( "CCrashDumpWriter::DumpMiniDump - MiniDumpWriteDump succeeded" ); // Close the dumpfile CloseHandle ( hFile ); // Grab the current time // Ask windows for the system time. SYSTEMTIME SystemTime; GetLocalTime ( &SystemTime ); // Create the dump directory CreateDirectory ( CalcMTASAPath ( "mta\\dumps" ), 0 ); CreateDirectory ( CalcMTASAPath ( "mta\\dumps\\private" ), 0 ); SString strModuleName = pExceptionInformation->GetModuleBaseName (); strModuleName = strModuleName.ReplaceI ( ".dll", "" ).Replace ( ".exe", "" ).Replace ( "_", "" ).Replace ( ".", "" ).Replace ( "-", "" ); if ( strModuleName.length () == 0 ) strModuleName = "unknown"; SString strMTAVersionFull = SString ( "%s.%s", MTA_DM_BUILDTAG_LONG, *GetApplicationSetting ( "mta-version-ext" ).SplitRight ( ".", NULL, -2 ) ); SString strSerialPart = GetApplicationSetting ( "serial" ).substr ( 0, 5 ); uint uiServerIP = GetApplicationSettingInt ( "last-server-ip" ); uint uiServerPort = GetApplicationSettingInt ( "last-server-port" ); int uiServerTime = GetApplicationSettingInt ( "last-server-time" ); int uiServerDuration = _time32 ( NULL ) - uiServerTime; uiServerDuration = Clamp ( 0, uiServerDuration + 1, 0xfff ); // Get path to mta dir SString strPathCode; { std::vector < SString > parts; PathConform ( CalcMTASAPath ( "" ) ).Split ( PATH_SEPERATOR, parts ); for ( uint i = 0 ; i < parts.size () ; i++ ) { if ( parts[i].CompareI ( "Program Files" ) ) strPathCode += "Pr"; else if ( parts[i].CompareI ( "Program Files (x86)" ) ) strPathCode += "Px"; else if ( parts[i].CompareI ( "MTA San Andreas" ) ) strPathCode += "Mt"; else if ( parts[i].BeginsWithI ( "MTA San Andreas" ) ) strPathCode += "Mb"; else strPathCode += parts[i].Left ( 1 ).ToUpper (); } } // Ensure filename parts match up with EDumpFileNameParts SString strFilename ( "mta\\dumps\\private\\client_%s_%s_%08x_%x_%s_%08X_%04X_%03X_%s_%04d%02d%02d_%02d%02d.dmp", strMTAVersionFull.c_str (), strModuleName.c_str (), pExceptionInformation->GetAddressModuleOffset (), pExceptionInformation->GetCode () & 0xffff, strPathCode.c_str (), uiServerIP, uiServerPort, uiServerDuration, strSerialPart.c_str (), SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wHour, SystemTime.wMinute ); SString strPathFilename = CalcMTASAPath ( strFilename ); // Copy the file CopyFile ( CalcMTASAPath ( "mta\\core.dmp" ), strPathFilename, false ); // For the dump uploader SetApplicationSetting ( "diagnostics", "last-dump-extra", "none" ); SetApplicationSetting ( "diagnostics", "last-dump-save", strPathFilename ); // Try to append pool sizes info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-pools" ); CBuffer poolInfo; GetPoolInfo ( poolInfo ); AppendToDumpFile ( strPathFilename, poolInfo, 'POLs', 'POLe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-pools" ); // Try to append d3d state info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-d3d" ); CBuffer d3dInfo; GetD3DInfo ( d3dInfo ); AppendToDumpFile ( strPathFilename, d3dInfo, 'D3Ds', 'D3De' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-d3d" ); // Try to append crash averted stats to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-crash-averted" ); CBuffer crashAvertedStats; GetCrashAvertedStats ( crashAvertedStats ); AppendToDumpFile ( strPathFilename, crashAvertedStats, 'CASs', 'CASe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-crash-averted" ); // Try to append log info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-log" ); CBuffer logInfo; GetLogInfo ( logInfo ); AppendToDumpFile ( strPathFilename, logInfo, 'LOGs', 'LOGe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-log" ); // Try to append dx info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-misc" ); CBuffer dxInfo; GetDxInfo ( dxInfo ); AppendToDumpFile ( strPathFilename, dxInfo, 'DXIs', 'DXIe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-misc" ); // Try to append misc info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-misc" ); CBuffer miscInfo; GetMiscInfo ( miscInfo ); AppendToDumpFile ( strPathFilename, miscInfo, 'MSCs', 'MSCe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-misc" ); // Try to append memory info to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-mem" ); CBuffer memInfo; GetMemoryInfo ( memInfo ); AppendToDumpFile ( strPathFilename, memInfo, 'MEMs', 'MEMe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-mem" ); // Try to logfile.txt to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-logfile" ); CBuffer logfileContent; logfileContent.LoadFromFile( CalcMTASAPath( PathJoin( "mta", "logs", "logfile.txt" ) ) ); AppendToDumpFile ( strPathFilename, logfileContent, 'LOGs', 'LOGe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-logfile" ); // Try to report.log to dump file SetApplicationSetting ( "diagnostics", "last-dump-extra", "try-report" ); CBuffer reportLogContent; reportLogContent.LoadFromFile( PathJoin( GetMTADataPath(), "report.log" ) ); AppendToDumpFile ( strPathFilename, reportLogContent, 'REPs', 'REPe' ); SetApplicationSetting ( "diagnostics", "last-dump-extra", "added-report" ); } } // Free the DLL again FreeLibrary ( hDll ); } // Auto-fixes // Check if crash was in volumetric shadow code if ( ms_uiInCrashZone == 1 || ms_uiInCrashZone == 2 ) { CVARS_SET( "volumetric_shadows", false ); CCore::GetSingleton().SaveConfig(); AddReportLog( 9205, "Disabled volumetric shadows" ); } CNet* pNet = CCore::GetSingleton().GetNetwork(); if ( pNet ) pNet->PostCrash(); }
void CCrashDumpWriter::DumpCoreLog ( CExceptionInformation* pExceptionInformation ) { // Write crash flag for next launch (Simple flag in case of double faults later) fclose( fopen ( CalcMTASAPath ( "mta\\core.log.flag" ), "w" ) ); // Write a log with the generic exception information FILE* pFile = fopen ( CalcMTASAPath ( "mta\\core.log" ), "a+" ); if ( pFile ) { // Header fprintf ( pFile, "%s", "** -- Unhandled exception -- **\n\n" ); // Write the time time_t timeTemp; time ( &timeTemp ); SString strMTAVersionFull = SString ( "%s.%s", MTA_DM_BUILDTAG_LONG, *GetApplicationSetting ( "mta-version-ext" ).SplitRight ( ".", NULL, -2 ) ); SString strInfo; strInfo += SString ( "Version = %s\n", strMTAVersionFull.c_str () ); strInfo += SString ( "Time = %s", ctime ( &timeTemp ) ); strInfo += SString ( "Module = %s\n", pExceptionInformation->GetModulePathName () ); // Write the basic exception information strInfo += SString ( "Code = 0x%08X\n", pExceptionInformation->GetCode () ); strInfo += SString ( "Offset = 0x%08X\n\n", pExceptionInformation->GetAddressModuleOffset () ); // Write the register info strInfo += SString ( "EAX=%08X EBX=%08X ECX=%08X EDX=%08X ESI=%08X\n" \ "EDI=%08X EBP=%08X ESP=%08X EIP=%08X FLG=%08X\n" \ "CS=%04X DS=%04X SS=%04X ES=%04X " \ "FS=%04X GS=%04X\n\n", pExceptionInformation->GetEAX (), pExceptionInformation->GetEBX (), pExceptionInformation->GetECX (), pExceptionInformation->GetEDX (), pExceptionInformation->GetESI (), pExceptionInformation->GetEDI (), pExceptionInformation->GetEBP (), pExceptionInformation->GetESP (), pExceptionInformation->GetEIP (), pExceptionInformation->GetEFlags (), pExceptionInformation->GetCS (), pExceptionInformation->GetDS (), pExceptionInformation->GetSS (), pExceptionInformation->GetES (), pExceptionInformation->GetFS (), pExceptionInformation->GetGS () ); fprintf ( pFile, "%s", strInfo.c_str () ); // End of unhandled exception fprintf ( pFile, "%s", "** -- End of unhandled exception -- **\n\n\n" ); // Close the file fclose ( pFile ); // For the crash dialog SetApplicationSetting ( "diagnostics", "last-crash-info", strInfo ); WriteDebugEvent ( strInfo.Replace( "\n", " " ) ); } }
////////////////////////////////////////////////////////// // // PreLaunchWatchDogs // // // ////////////////////////////////////////////////////////// void PreLaunchWatchDogs ( void ) { assert ( !CreateSingleInstanceMutex () ); // // "L0" is opened before the launch sequence and is closed if MTA shutsdown with no error // "L1" is opened before the launch sequence and is closed if GTA is succesfully started // "CR1" is a counter which is incremented if GTA was not started and MTA shutsdown with an error // // "L2" is opened before the launch sequence and is closed if the GTA loading screen is shown // "CR2" is a counter which is incremented at startup, if the previous run didn't make it to the loading screen // // "L3" is opened before the launch sequence and is closed if the GTA loading screen is shown, or a startup problem is handled elsewhere // // Check for unclean stop on previous run #ifndef MTA_DEBUG if ( WatchDogIsSectionOpen ( "L0" ) ) WatchDogSetUncleanStop ( true ); // Flag to maybe do things differently if MTA exit code on last run was not 0 else #endif WatchDogSetUncleanStop ( false ); SString strCrashFlagFilename = CalcMTASAPath( "mta\\core.log.flag" ); if ( FileExists( strCrashFlagFilename ) ) { FileDelete( strCrashFlagFilename ); WatchDogSetLastRunCrash( true ); // Flag to maybe do things differently if MTA crashed last run } else WatchDogSetLastRunCrash( false ); // Reset counter if gta game was run last time if ( !WatchDogIsSectionOpen ( "L1" ) ) WatchDogClearCounter ( "CR1" ); // If crashed 3 times in a row before starting the game, do something if ( WatchDogGetCounter ( "CR1" ) >= 3 ) { WatchDogReset (); HandleTrouble (); } // Check for possible gta_sa.set problems if ( WatchDogIsSectionOpen ( "L2" ) ) { WatchDogIncCounter ( "CR2" ); // Did not reach loading screen last time WatchDogCompletedSection ( "L2" ); } else WatchDogClearCounter ( "CR2" ); // If didn't reach loading screen 5 times in a row, do something if ( WatchDogGetCounter ( "CR2" ) >= 5 ) { WatchDogClearCounter ( "CR2" ); HandleResetSettings (); } // Clear down freeze on quit detection WatchDogCompletedSection( "Q0" ); WatchDogBeginSection ( "L0" ); // Gets closed if MTA exits with a return code of 0 WatchDogBeginSection ( "L1" ); // Gets closed when online game has started SetApplicationSetting ( "diagnostics", "gta-fopen-fail", "" ); SetApplicationSetting ( "diagnostics", "last-crash-reason", "" ); SetApplicationSetting ( "diagnostics", "gta-fopen-last", "" ); }
/////////////////////////////////////////////////////////////// // // CModelCacheManagerImpl::PreLoad // // Cache all weapons and upgrades // // Peds KB: 64,832 KB 7-312 306 296 valid, 10 not so valid 219 KB/model 4.45/MB // Weapons KB: 470 321-372 52 39 valid, 3 invalid(329,332,340) 470 KB all weapons // Upgrades KB: 2,716 1000-1193 194 all valid 2,716 KB all upgrades // Vehicles(400-499) KB: 14,622 140 KB/model 7/MB // Vehicles(500-599) KB: 14,888 // /////////////////////////////////////////////////////////////// void CModelCacheManagerImpl::PreLoad ( void ) { if ( m_bDonePreLoad ) return; m_bDonePreLoad = true; CTickCount startTicks = CTickCount::Now (); #if 0 for ( uint i = 321 ; i <= 372 ; i++ ) { if ( CClientPedManager::IsValidWeaponModel ( i ) ) AddModelRefCount ( i ); } #endif m_pGame->GetStreaming()->LoadAllRequestedModels ( false ); // Get current limits int bSlowMethod = GetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_SLOW ); int iLowestUnsafeUpgrade = GetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_LOWEST_UNSAFE ); SetApplicationSetting( DIAG_CRASH_EXTRA_MSG, "** AUTO FIXING CRASH (Step 1/2) **\n\n** Please continue and connect to a server **" ); // Crashed during previous PreLoad? if ( WatchDogIsSectionOpen( WD_SECTION_PRELOAD_UPGRADES ) ) { AddReportLog( 8545, SString( "PreLoad Upgrades - Crash detect - bSlowMethod:%d iLowestUnsafeUpgrade:%d", bSlowMethod, iLowestUnsafeUpgrade ) ); iLowestUnsafeUpgrade = GetApplicationSettingInt( DIAG_PRELOAD_UPGRADE_ATTEMPT_ID ); bSlowMethod = 1; SetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_LOWEST_UNSAFE, iLowestUnsafeUpgrade ); SetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_SLOW, bSlowMethod ); SetApplicationSetting( DIAG_CRASH_EXTRA_MSG, "** AUTO FIXING CRASH (Step 2/2) **\n\n** Please continue and connect to a server **" ); } if ( iLowestUnsafeUpgrade == 0 ) iLowestUnsafeUpgrade = 1194; // PreLoad upgrades WatchDogBeginSection( WD_SECTION_PRELOAD_UPGRADES ); { for ( int i = 1000 ; i < iLowestUnsafeUpgrade ; i++ ) { if ( bSlowMethod ) SetApplicationSettingInt( DIAG_PRELOAD_UPGRADE_ATTEMPT_ID, i ); AddModelRefCount ( i ); if ( bSlowMethod ) m_pGame->GetStreaming()->LoadAllRequestedModels ( false ); } m_pGame->GetStreaming()->LoadAllRequestedModels ( false ); } WatchDogCompletedSection( WD_SECTION_PRELOAD_UPGRADES ); SetApplicationSetting( DIAG_CRASH_EXTRA_MSG, "" ); // Report if LowestUnsafeUpgrade has fallen int iPrevHiScore = GetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_HISCORE ); SetApplicationSettingInt( DIAG_PRELOAD_UPGRADES_HISCORE, iLowestUnsafeUpgrade ); if ( iPrevHiScore > iLowestUnsafeUpgrade ) AddReportLog( 8544, SString( "PreLoad Upgrades - LowestUnsafeUpgrade fallen from %d to %d", iPrevHiScore, iLowestUnsafeUpgrade ) ); CTickCount deltaTicks = CTickCount::Now () - startTicks; OutputDebugLine ( SString ( "CModelCacheManagerImpl::PreLoad completed in %d ms", deltaTicks.ToInt () ) ); }
// // Clear BrowseToSolution // void SharedUtil::ClearPendingBrowseToSolution ( void ) { SetApplicationSetting ( "pending-browse-to-solution", "" ); }
// // Get/set string - Which uses 'general' key // void SharedUtil::SetApplicationSetting ( const SString& strName, const SString& strValue ) { SetApplicationSetting ( "general", strName, strValue ); }
// // Get/set int // void SharedUtil::SetApplicationSettingInt ( const SString& strPath, const SString& strName, int iValue ) { SetApplicationSetting ( strPath, strName, SString ( "%d", iValue ) ); }