From b2fb0d0d488434c221472fb8996837751073df52 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Sat, 9 Jun 2012 15:35:20 +0200 Subject: [PATCH] switched to crash-server crash handler Signed-off-by: Sven Strickroth --- release.txt | 2 + src/Git/CrashReport.h | 172 --------------- src/Git/Git.vcproj | 4 - src/TGitCache/TGITCache.cpp | 6 +- src/TortoiseGit.sln | 327 ++++++++++++++++++++++++++++ src/TortoiseMerge/MainFrm.cpp | 8 +- src/TortoiseMerge/Patch.cpp | 6 +- src/TortoiseMerge/TortoiseMerge.cpp | 3 +- src/TortoiseMerge/TortoiseMerge.h | 3 - src/TortoiseMerge/stdafx.h | 2 + src/TortoiseProc/TortoiseProc.cpp | 39 +--- src/Utils/CrashReport.h | 312 ++++++++++++++++++++++++++ 12 files changed, 658 insertions(+), 226 deletions(-) delete mode 100644 src/Git/CrashReport.h create mode 100644 src/Utils/CrashReport.h diff --git a/release.txt b/release.txt index 5c6ab6fdc0..519757d702 100644 --- a/release.txt +++ b/release.txt @@ -5,3 +5,5 @@ Upgrade numbers in: -# doc/doc.build.include -# src/version.h -# src/TortoiseGitSetup/VersionNumberInclude.wxi + +Uploads symbols to crash-server.com diff --git a/src/Git/CrashReport.h b/src/Git/CrashReport.h deleted file mode 100644 index 49652c1ac8..0000000000 --- a/src/Git/CrashReport.h +++ /dev/null @@ -1,172 +0,0 @@ -#pragma once - -// Client crash callback -typedef BOOL (CALLBACK *LPGETLOGFILE) (LPVOID lpvState); -// Stack trace callback -typedef void (*TraceCallbackFunction)(DWORD_PTR address, const char *ImageName, - const char *FunctionName, DWORD functionDisp, - const char *Filename, DWORD LineNumber, DWORD lineDisp, - void *data); - -typedef LPVOID (*InstallEx)(LPGETLOGFILE pfn, LPCSTR lpcszTo, LPCSTR lpcszSubject, BOOL bUseUI); -typedef void (*UninstallEx)(LPVOID lpState); -typedef void (*EnableUI)(void); -typedef void (*DisableUI)(void); -typedef void (*EnableHandler)(void); -typedef void (*DisableHandler)(void); -typedef void (*AddFileEx)(LPVOID lpState, LPCSTR lpFile, LPCSTR lpDesc); -typedef void (*AddRegistryEx)(LPVOID lpState, LPCSTR lpRegistry, LPCSTR lpDesc); -typedef void (*AddEventLogEx)(LPVOID lpState, LPCSTR lpEventLog, LPCSTR lpDesc); - -/** - * \ingroup CrashRpt - * This class wraps the most important functions the CrashRpt-library - * offers. To learn more about the CrashRpt-library go to - * http://www.codeproject.com/debug/crash_report.asp \n - * To compile the library you need the WTL. You can get the WTL - * directly from Microsoft: - * http://www.microsoft.com/downloads/details.aspx?FamilyID=128e26ee-2112-4cf7-b28e-7727d9a1f288&DisplayLang=en \n - * \n - * Many changes were made to the library so if you read the - * article on CodeProject also read the change log in the source - * folder.\n - * The most important changes are: - * - stack trace is included in the report, with symbols/linenumbers if available - * - "save" button so the user can save the report instead of directly send it - * - can be used by multiple applications - * - zlib linked statically, so no need to ship the zlib.dll separately - * \n - * To use the library just include the header file "CrashReport.h" - * \code - * #include "CrashReport.h" - * \endcode - * Then you can either declare an instance of the class CCrashReport - * somewhere globally in your application like this: - * \code - * CCrashReport g_crasher("report@mycompany.com", "Crash report for MyApplication"); - * \endcode - * that way you can't add registry keys or additional files to the report, but - * it's the fastest and easiest way to use the library. - * Another way is to declare a global variable and initialize it in e.g. InitInstance() - * \code - * CCrashReport g_crasher; - * //then somewhere in InitInstance. - * g_crasher.AddFile("mylogfile.log", "this is a log file"); - * g_crasher.AddRegistry("HKCU\\Software\\MyCompany\\MyProgram"); - * \endcode - * - * - * \remark the dll is dynamically linked at runtime. So the main application - * will still work even if the dll is not shipped. - * - */ -class CCrashReport -{ -public: - /** - * Construct the CrashReport-Object. This loads the dll - * and initializes it. - * \param lpTo the mail address the crash report should be sent to - * \param lpSubject the mail subject - */ - CCrashReport(LPCSTR lpTo = NULL, LPCSTR lpSubject = NULL, BOOL bUseUI = TRUE) - { - InstallEx pfnInstallEx; - TCHAR szFileName[_MAX_PATH]; - GetModuleFileName(NULL, szFileName, _MAX_FNAME); - - // C:\Programme\TortoiseSVN\bin\TortoiseProc.exe -> C:\Programme\TortoiseSVN\bin\CrashRpt.dll - CString strFilename = szFileName; - strFilename = strFilename.Left(strFilename.ReverseFind(_T('\\')) + 1); - strFilename += _T("CrashRpt.dll"); - - m_hDll = LoadLibrary(strFilename); - if (m_hDll) - { - pfnInstallEx = (InstallEx)GetProcAddress(m_hDll, "InstallEx"); - if ( pfnInstallEx ) - { - m_lpvState = pfnInstallEx(NULL, lpTo, lpSubject, bUseUI); - } - } - } - ~CCrashReport() - { - UninstallEx pfnUninstallEx; - if ((m_hDll)&&(m_lpvState)) - { - pfnUninstallEx = (UninstallEx)GetProcAddress(m_hDll, "UninstallEx"); - pfnUninstallEx(m_lpvState); - } - FreeLibrary(m_hDll); - } - /** - * Adds a file which will be included in the crash report. Use this - * if your application generates log-files or the like. - * \param lpFile the full path to the file - * \param lpDesc a description of the file, used in the crash report dialog - */ - void AddFile(LPCSTR lpFile, LPCSTR lpDesc) - { - AddFileEx pfnAddFileEx; - if ((m_hDll)&&(m_lpvState)) - { - pfnAddFileEx = (AddFileEx)GetProcAddress(m_hDll, "AddFileEx"); - (pfnAddFileEx)(m_lpvState, lpFile, lpDesc); - } - } - /** - * Adds a whole registry tree to the crash report. - * \param lpFile the full registry path, e.g. "HKLM\\Software\\MyApplication" - * \param lpDesc a description of the generated registry file, used in the crash report dialog - */ - void AddRegistry(LPCSTR lpFile, LPCSTR lpDesc) - { - AddRegistryEx pfnAddRegistryEx; - if ((m_hDll)&&(m_lpvState)) - { - pfnAddRegistryEx = (AddRegistryEx)GetProcAddress(m_hDll, "AddRegistryHiveEx"); - (pfnAddRegistryEx)(m_lpvState, lpFile, lpDesc); - } - } - /** - * Adds a system Event Log to the crash report. - * \param lpFile - * \param lpDesc - */ - void AddEventLog(LPCSTR lpFile, LPCSTR lpDesc) - { - AddEventLogEx pfnAddEventLogEx; - if ((m_hDll)&&(m_lpvState)) - { - pfnAddEventLogEx = (AddEventLogEx)GetProcAddress(m_hDll, "AddEventLogEx"); - (pfnAddEventLogEx)(m_lpvState, lpFile, lpDesc); - } - } - - - void Enable(BOOL bEnable) - { - EnableHandler pfnEnableHandler; - DisableHandler pfnDisableHandler; - if ((m_hDll)&&(m_lpvState)) - { - if (bEnable) - { - pfnEnableHandler = (EnableHandler)GetProcAddress(m_hDll, "EnableHandlerEx"); - (pfnEnableHandler)(); - } - else - { - OutputDebugString(_T("Calling DisableHandlerEx\n")); - - pfnDisableHandler = (DisableHandler)GetProcAddress(m_hDll, "DisableHandlerEx"); - (pfnDisableHandler)(); - } - } - } - -private: - HMODULE m_hDll; - LPVOID m_lpvState; -}; diff --git a/src/Git/Git.vcproj b/src/Git/Git.vcproj index ed1e0487ce..684796612c 100644 --- a/src/Git/Git.vcproj +++ b/src/Git/Git.vcproj @@ -367,10 +367,6 @@ Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > - - diff --git a/src/TGitCache/TGITCache.cpp b/src/TGitCache/TGITCache.cpp index 8e28a9cd5d..9b706f5856 100644 --- a/src/TGitCache/TGITCache.cpp +++ b/src/TGitCache/TGITCache.cpp @@ -1,7 +1,7 @@ // TortoiseGit - a Windows shell extension for easy version control // External Cache Copyright (C) 2005 - 2006,2010 - Will Dean, Stefan Kueng -// Copyright (C) 2008-2011 - TortoiseGit +// Copyright (C) 2008-2012 - TortoiseGit // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -25,7 +25,7 @@ #include "CacheInterface.h" #include "Resource.h" #include "registry.h" -#include "..\crashrpt\CrashReport.h" +#include "CrashReport.h" #include "GitAdminDir.h" #include "Dbt.h" #include @@ -46,7 +46,7 @@ #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") -CCrashReport crasher("tortoisegit-bug@googlegroups.com", "Crash Report for TGitCache " APP_X64_STRING " : " STRPRODUCTVER, TRUE);// crash +CCrashReportTGit crasher(L"TGitCache " _T(APP_X64_STRING)); DWORD WINAPI InstanceThread(LPVOID); DWORD WINAPI PipeThread(LPVOID); diff --git a/src/TortoiseGit.sln b/src/TortoiseGit.sln index 3819117611..5d55faa608 100644 --- a/src/TortoiseGit.sln +++ b/src/TortoiseGit.sln @@ -15,6 +15,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TortoiseProc", "TortoisePro {A5498556-CE09-4095-8335-08FC8370552D} = {A5498556-CE09-4095-8335-08FC8370552D} {2C879469-DB8F-4BF0-B016-AE864D2A7BBC} = {2C879469-DB8F-4BF0-B016-AE864D2A7BBC} {2B4F366C-93BA-491E-87AF-5EF7B37F75F7} = {2B4F366C-93BA-491E-87AF-5EF7B37F75F7} + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} = {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB} = {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB} {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} = {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B} = {7CA5B1EB-8CC9-40A6-96D8-83649C1A870B} @@ -71,6 +72,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TGitCache", "TGitCache\TGit ProjectSection(ProjectDependencies) = postProject {13BC1836-2726-45C4-9249-5BA2BBBF8328} = {13BC1836-2726-45C4-9249-5BA2BBBF8328} {2B4F366C-93BA-491E-87AF-5EF7B37F75F7} = {2B4F366C-93BA-491E-87AF-5EF7B37F75F7} + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} = {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} {5C6B6A95-2053-4593-9617-C4F176736D5A} = {5C6B6A95-2053-4593-9617-C4F176736D5A} {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} = {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} EndProjectSection @@ -112,6 +114,7 @@ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TortoiseMerge", "TortoiseMerge\TortoiseMerge.vcproj", "{8ABB4F84-891A-4748-8507-F5494842173E}" ProjectSection(ProjectDependencies) = postProject {4472028D-4ACF-474E-AA95-9B7E12B50F60} = {4472028D-4ACF-474E-AA95-9B7E12B50F60} + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} = {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9} = {6BD19BAE-4041-4E85-B576-AAC9D54CAAB9} {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE} = {AE6AAFBA-9992-452A-9EB8-DD69402A4ACE} {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} = {4F0A55DE-DAFD-4A0B-A03D-2C14CB77E08F} @@ -225,6 +228,27 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Lang_es_ES", "..\Languages\ {EC88E7EC-3074-4841-BA45-B938D098EFF6} = {EC88E7EC-3074-4841-BA45-B938D098EFF6} EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Crash-Server", "Crash-Server", "{9D948C1D-52C8-4BEC-B2BE-26BE9B25ACD1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CommonLibs", "CommonLibs", "{BD66F94E-B546-4B80-A536-FAB2CB61A398}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Zlib_static", "..\ext\CrashServer\CommonLibs\Zlib\Zlib.vcproj", "{D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CrashServerSDK", "CrashServerSDK", "{C8F4D789-D86F-4B0C-8C47-4B263027B1A6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpUploaderServiceLib", "..\ext\CrashServer\CrashHandler\DumpUploaderServiceLib\DumpUploaderServiceLib.vcproj", "{1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SendRpt", "..\ext\CrashServer\CrashHandler\SendRpt\SendRpt.vcproj", "{BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}" + ProjectSection(ProjectDependencies) = postProject + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93} = {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93} + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA} = {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CrashHandler", "..\ext\CrashServer\CrashHandler\CrashHandler\CrashHandler.vcproj", "{8E943F8F-ED43-42DB-A25B-C6356F01AAC7}" + ProjectSection(ProjectDependencies) = postProject + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA} = {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution debug_static|Mixed Platforms = debug_static|Mixed Platforms @@ -3718,6 +3742,302 @@ Global {AD35E207-3793-4A26-82A2-520D7C3C71BB}.Release|x64.Build.0 = Release|x64 {AD35E207-3793-4A26-82A2-520D7C3C71BB}.Release|x86.ActiveCfg = Release|x86 {AD35E207-3793-4A26-82A2-520D7C3C71BB}.Release|x86.Build.0 = Release|x86 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|x64.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.debug_static|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|x64.ActiveCfg = Debug|x64 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|x64.Build.0 = Debug|x64 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Debug|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|x64.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Debug|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|x64.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL ASM Release|x86.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Debug|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|x64.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.DLL Release|x86.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|x64.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Debug|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|x64.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB ASM Release|x86.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|Win32.Build.0 = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|x64.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Debug|x86.ActiveCfg = Debug|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|x64.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.LIB Release|x86.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|x64.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.release_static|x86.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|Mixed Platforms.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|Win32.ActiveCfg = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|Win32.Build.0 = Release|Win32 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|x64.ActiveCfg = Release|x64 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|x64.Build.0 = Release|x64 + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93}.Release|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|x64.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.debug_static|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|x64.ActiveCfg = Debug|x64 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|x64.Build.0 = Debug|x64 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Debug|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|x64.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Debug|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|x64.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL ASM Release|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Debug|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|x64.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.DLL Release|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|x64.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Debug|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|x64.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB ASM Release|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|Win32.Build.0 = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|x64.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Debug|x86.ActiveCfg = Debug|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|x64.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.LIB Release|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|x64.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.release_static|x86.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|Mixed Platforms.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|Win32.ActiveCfg = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|Win32.Build.0 = Release|Win32 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|x64.ActiveCfg = Release|x64 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|x64.Build.0 = Release|x64 + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA}.Release|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|x64.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.debug_static|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|x64.ActiveCfg = Debug|x64 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|x64.Build.0 = Debug|x64 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Debug|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|x64.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Debug|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|x64.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL ASM Release|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Debug|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|x64.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.DLL Release|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|x64.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Debug|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|x64.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB ASM Release|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|Mixed Platforms.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|Win32.Build.0 = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|x64.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Debug|x86.ActiveCfg = Debug|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|x64.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.LIB Release|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|x64.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.release_static|x86.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|Mixed Platforms.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|Win32.ActiveCfg = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|Win32.Build.0 = Release|Win32 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|x64.ActiveCfg = Release|x64 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|x64.Build.0 = Release|x64 + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA}.Release|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|x64.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.debug_static|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|x64.ActiveCfg = Debug|x64 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|x64.Build.0 = Debug|x64 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Debug|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|x64.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Debug|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|x64.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL ASM Release|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|x64.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Debug|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|x64.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.DLL Release|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|x64.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Debug|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|x64.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB ASM Release|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|Win32.Build.0 = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|x64.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Debug|x86.ActiveCfg = Debug|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|x64.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.LIB Release|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|x64.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.release_static|x86.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|Mixed Platforms.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|Win32.ActiveCfg = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|Win32.Build.0 = Release|Win32 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|x64.ActiveCfg = Release|x64 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|x64.Build.0 = Release|x64 + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7}.Release|x86.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3729,6 +4049,7 @@ Global {4472028D-4ACF-474E-AA95-9B7E12B50F60} = {C4836DB1-8F21-4113-A9C4-CE7F5264C90C} {2CB340C3-B2ED-46F4-981E-847747E0A3BF} = {C4836DB1-8F21-4113-A9C4-CE7F5264C90C} {12E5B4AE-D7EF-4A57-A22D-6F9F9D8CE1FB} = {C4836DB1-8F21-4113-A9C4-CE7F5264C90C} + {9D948C1D-52C8-4BEC-B2BE-26BE9B25ACD1} = {C4836DB1-8F21-4113-A9C4-CE7F5264C90C} {454D5FCC-E25A-4B45-9CA2-01ABB0FA5181} = {97449875-7B08-41B1-AF99-1EBE64AD7939} {150172A5-8D02-4C00-ABB5-BD99D4B16B4C} = {97449875-7B08-41B1-AF99-1EBE64AD7939} {1B3C273E-6DDF-4FBE-BA31-F9F39C6DAC99} = {FB607AFD-DD1E-4C6D-8C34-BC00AF725037} @@ -3754,5 +4075,11 @@ Global {1A8B6349-1C68-4BDC-8095-8EEF80310633} = {84AFABE1-6139-457A-8645-F86D1F182E06} {948733DE-FC5A-46C2-8CD6-429017508D63} = {84AFABE1-6139-457A-8645-F86D1F182E06} {603B8D8B-240E-4B18-A750-CC3F7E301C76} = {84AFABE1-6139-457A-8645-F86D1F182E06} + {BD66F94E-B546-4B80-A536-FAB2CB61A398} = {9D948C1D-52C8-4BEC-B2BE-26BE9B25ACD1} + {C8F4D789-D86F-4B0C-8C47-4B263027B1A6} = {9D948C1D-52C8-4BEC-B2BE-26BE9B25ACD1} + {D0D57CA2-A972-47FE-92C8-63A3CAAF0E93} = {BD66F94E-B546-4B80-A536-FAB2CB61A398} + {1912DDA2-E7B9-437F-BA8E-DA2C1C2D79FA} = {C8F4D789-D86F-4B0C-8C47-4B263027B1A6} + {BC62FB83-CFBB-4AE3-A60D-D73155AA33FA} = {C8F4D789-D86F-4B0C-8C47-4B263027B1A6} + {8E943F8F-ED43-42DB-A25B-C6356F01AAC7} = {C8F4D789-D86F-4B0C-8C47-4B263027B1A6} EndGlobalSection EndGlobal diff --git a/src/TortoiseMerge/MainFrm.cpp b/src/TortoiseMerge/MainFrm.cpp index bd6c9f4acd..f78ec3d908 100644 --- a/src/TortoiseMerge/MainFrm.cpp +++ b/src/TortoiseMerge/MainFrm.cpp @@ -619,10 +619,10 @@ void CMainFrame::OnFileOpen() m_Data.m_sDiffFile = dlg.m_sUnifiedDiffFile; m_Data.m_sPatchPath = dlg.m_sPatchDirectory; m_Data.m_mergedFile.SetOutOfUse(); - g_crasher.AddFile((LPCSTR)(LPCTSTR)dlg.m_sBaseFile, (LPCSTR)(LPCTSTR)_T("Basefile")); - g_crasher.AddFile((LPCSTR)(LPCTSTR)dlg.m_sTheirFile, (LPCSTR)(LPCTSTR)_T("Theirfile")); - g_crasher.AddFile((LPCSTR)(LPCTSTR)dlg.m_sYourFile, (LPCSTR)(LPCTSTR)_T("Yourfile")); - g_crasher.AddFile((LPCSTR)(LPCTSTR)dlg.m_sUnifiedDiffFile, (LPCSTR)(LPCTSTR)_T("Difffile")); + CCrashReport::Instance().AddFile2(dlg.m_sBaseFile, NULL, _T("Basefile"), CR_AF_MAKE_FILE_COPY); + CCrashReport::Instance().AddFile2(dlg.m_sTheirFile, NULL, _T("Theirfile"), CR_AF_MAKE_FILE_COPY); + CCrashReport::Instance().AddFile2(dlg.m_sYourFile, NULL, _T("Yourfile"), CR_AF_MAKE_FILE_COPY); + CCrashReport::Instance().AddFile2(dlg.m_sUnifiedDiffFile, NULL, _T("Difffile"), CR_AF_MAKE_FILE_COPY); if (!m_Data.IsBaseFileInUse() && m_Data.IsTheirFileInUse() && m_Data.IsYourFileInUse()) { diff --git a/src/TortoiseMerge/Patch.cpp b/src/TortoiseMerge/Patch.cpp index c983a3a0ff..01eb1e372e 100644 --- a/src/TortoiseMerge/Patch.cpp +++ b/src/TortoiseMerge/Patch.cpp @@ -2,7 +2,7 @@ // Copyright (C) 2009-2012 - TortoiseGit // Copyright (C) 2012 - Sven Strickroth -// Copyright (C) 2004-2009,2011 - TortoiseSVN +// Copyright (C) 2004-2009,2011-2012 - TortoiseSVN // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -330,7 +330,7 @@ BOOL CPatch::OpenUnifiedDiffFile(const CString& filename) EOL ending = EOL_NOENDING; INT_PTR nIndex = 0; INT_PTR nLineCount = 0; - g_crasher.AddFile((LPCSTR)(LPCTSTR)filename, (LPCSTR)(LPCTSTR)_T("unified diff file")); + CCrashReport::Instance().AddFile2(filename, NULL, _T("unified diff file"), CR_AF_MAKE_FILE_COPY); CFileTextLines PatchLines; if (!PatchLines.Load(filename)) @@ -807,7 +807,7 @@ int CPatch::PatchFile(int nIndex, const CString& sPatchPath, const CString& sSav CString sPatchFile = sBaseFile.IsEmpty() ? sPath : sBaseFile; if (PathFileExists(sPatchFile)) { - g_crasher.AddFile((LPCSTR)(LPCTSTR)sPatchFile, (LPCSTR)(LPCTSTR)_T("File to patch")); + CCrashReport::Instance().AddFile2(sPatchFile, NULL, _T("File to patch"), CR_AF_MAKE_FILE_COPY); } CFileTextLines PatchLines; CFileTextLines PatchLinesResult; diff --git a/src/TortoiseMerge/TortoiseMerge.cpp b/src/TortoiseMerge/TortoiseMerge.cpp index e5503ba81b..e8f937b9b7 100644 --- a/src/TortoiseMerge/TortoiseMerge.cpp +++ b/src/TortoiseMerge/TortoiseMerge.cpp @@ -49,12 +49,13 @@ CTortoiseMergeApp::CTortoiseMergeApp() // The one and only CTortoiseMergeApp object CTortoiseMergeApp theApp; CString sOrigCWD; -CCrashReport g_crasher("tortoisesvn@gmail.com", "Crash Report for TortoiseMerge " APP_X64_STRING " : " STRPRODUCTVER, TRUE); +CCrashReportTGit g_crasher(L"TortoiseMerge " _T(APP_X64_STRING)); // CTortoiseMergeApp initialization BOOL CTortoiseMergeApp::InitInstance() { SetDllDirectory(L""); + CCrashReport::Instance().AddUserInfoToReport(L"CommandLine", GetCommandLine()); CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); CMFCButton::EnableWindowsTheming(); diff --git a/src/TortoiseMerge/TortoiseMerge.h b/src/TortoiseMerge/TortoiseMerge.h index fc10ccb439..816f9779ce 100644 --- a/src/TortoiseMerge/TortoiseMerge.h +++ b/src/TortoiseMerge/TortoiseMerge.h @@ -23,8 +23,6 @@ #endif #include "resource.h" // main symbols -#include "CrashReport.h" - /** * \ingroup TortoiseMerge @@ -54,4 +52,3 @@ class CTortoiseMergeApp : public CWinAppEx }; extern CTortoiseMergeApp theApp; -extern CCrashReport g_crasher; diff --git a/src/TortoiseMerge/stdafx.h b/src/TortoiseMerge/stdafx.h index 27ae986c8b..6e84fab32d 100644 --- a/src/TortoiseMerge/stdafx.h +++ b/src/TortoiseMerge/stdafx.h @@ -59,6 +59,8 @@ #define XMESSAGEBOX_APPREGPATH "Software\\TortoiseMerge\\" +#include "..\Utils\CrashReport.h" + #ifdef _WIN64 # define APP_X64_STRING "x64" #else diff --git a/src/TortoiseProc/TortoiseProc.cpp b/src/TortoiseProc/TortoiseProc.cpp index be7eb957e3..f17d251215 100644 --- a/src/TortoiseProc/TortoiseProc.cpp +++ b/src/TortoiseProc/TortoiseProc.cpp @@ -21,7 +21,7 @@ //#include "vld.h" #include "TortoiseProc.h" #include "SysImageList.h" -#include "CrashReport.h" +#include "..\Utils\CrashReport.h" #include "CmdLineParser.h" #include "Hooks.h" #include "AppUtils.h" @@ -71,6 +71,7 @@ END_MESSAGE_MAP() CTortoiseProcApp::CTortoiseProcApp() { SetDllDirectory(L""); + CCrashReport::Instance().AddUserInfoToReport(L"CommandLine", GetCommandLine()); EnableHtmlHelp(); // int argc = 0; // const char* const * argv = NULL; @@ -117,13 +118,12 @@ BOOL CTortoiseProcApp::CheckMsysGitDir() //map.GetFileStatus(_T("D:\\TortoiseGit"),&path, &status); return g_Git.CheckMsysGitDir(); } -CCrashReport crasher("tortoisegit-bug@googlegroups.com", "Crash Report for TortoiseGit " APP_X64_STRING " : " STRPRODUCTVER, TRUE);// crash +CCrashReportTGit crasher(L"TortoiseGit " _T(APP_X64_STRING)); // CTortoiseProcApp initialization BOOL CTortoiseProcApp::InitInstance() { - EnableCrashHandler(); CheckUpgrade(); CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); CMFCButton::EnableWindowsTheming(); @@ -609,39 +609,6 @@ void CTortoiseProcApp::CheckUpgrade() regVersion = _T(STRPRODUCTVER); } -void CTortoiseProcApp::EnableCrashHandler() -{ - // the crash handler is enabled by default, but we disable it - // after 3 months after a release - -#define YEAR ((((__DATE__ [7] - '0') * 10 + (__DATE__ [8] - '0')) * 10 \ - + (__DATE__ [9] - '0')) * 10 + (__DATE__ [10] - '0')) - -#define MONTH (__DATE__ [2] == 'n' ? (__DATE__ [1] == 'a' ? 1 : 6) \ - : __DATE__ [2] == 'b' ? 2 \ - : __DATE__ [2] == 'r' ? (__DATE__ [0] == 'M' ? 3 : 4) \ - : __DATE__ [2] == 'y' ? 5 \ - : __DATE__ [2] == 'l' ? 7 \ - : __DATE__ [2] == 'g' ? 8 \ - : __DATE__ [2] == 'p' ? 9 \ - : __DATE__ [2] == 't' ? 10 \ - : __DATE__ [2] == 'v' ? 11 : 12) - - #define DAY ((__DATE__ [4] == ' ' ? 0 : __DATE__ [4] - '0') * 10 \ - + (__DATE__ [5] - '0')) - - #define DATE_AS_INT (((YEAR - 2000) * 12 + MONTH) * 31 + DAY) - - CTime compiletime(YEAR, MONTH, DAY, 0, 0, 0); - CTime now = CTime::GetCurrentTime(); - - CTimeSpan timediff = now-compiletime; - if (timediff.GetDays() > 3*31) - { -// crasher.Enable(FALSE); - } -} - void CTortoiseProcApp::InitializeJumpList() { // for Win7 : use a custom jump list diff --git a/src/Utils/CrashReport.h b/src/Utils/CrashReport.h new file mode 100644 index 0000000000..d074b63fb0 --- /dev/null +++ b/src/Utils/CrashReport.h @@ -0,0 +1,312 @@ +// TortoiseGit - a Windows shell extension for easy version control + +// Copyright (C) 2012 - TortoiseSVN + +// This program 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. + +// This program 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 this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +#pragma once +#include "../../ext/CrashServer/CrashHandler/CrashHandler/CrashHandler.h" +#include "../version.h" +#include +#include +#include + +// dummy define, needed only when we use crashrpt instead of this. +#define CR_AF_MAKE_FILE_COPY 0 + +/** + * \ingroup Utils + * helper class for the CrashServerSDK + */ +class CCrashReport +{ +private: + CCrashReport(void) + { + LoadDll(); + } + + ~CCrashReport(void) + { + } + +public: + static CCrashReport& Instance() + { + static CCrashReport instance; + return instance; + } + + int Uninstall(void) { return FALSE; } + int AddFile2(LPCTSTR pszFile,LPCTSTR pszDestFile,LPCTSTR /*pszDesc*/,DWORD /*dwFlags*/) + { + return AddFileToReport(pszFile, pszDestFile) ? 1 : 0; + } + + + //! Initializes crash handler. + //! \note You may call this function multiple times if some data has changed. + //! \return Return \b true if crash handling was enabled. + bool InitCrashHandler( + ApplicationInfo* applicationInfo, //!< [in] Pointer to the ApplicationInfo structure that identifies your application. + HandlerSettings* handlerSettings, //!< [in] Pointer to the HandlerSettings structure that customizes crash handling behavior. This paramenter can be \b NULL. + BOOL ownProcess = TRUE //!< [in] If you own the process your code running in set this option to \b TRUE. If don't (for example you write + //!< a plugin to some external application) set this option to \b FALSE. In that case you need to explicitly + //!< catch exceptions. See \ref SendReport for more information. + ) throw() + { + if (!m_InitCrashHandler) + return false; + + return m_InitCrashHandler(applicationInfo, handlerSettings, ownProcess) != FALSE; + } + + //! You may add any key/value pair to crash report. + //! \return If the function succeeds, the return value is \b true. + bool AddUserInfoToReport( + LPCWSTR key, //!< [in] key string that will be added to the report. + LPCWSTR value //!< [in] value for the key. + ) throw() + { + if (!m_AddUserInfoToReport) + return false; + m_AddUserInfoToReport(key, value); + return true; + } + + //! You may add any file to crash report. This file will be read when crash appears and will be sent within the report. + //! Multiple files may be added. Filename of the file in the report may be changed to any name. + //! \return If the function succeeds, the return value is \b true. + bool AddFileToReport( + LPCWSTR path, //!< [in] Path to the file, that will be added to the report. + LPCWSTR reportFileName /* = NULL */ //!< [in] Filename that will be used in report for this file. If parameter is \b NULL, original name from path will be used. + ) throw() + { + if (!m_AddFileToReport) + return false; + m_AddFileToReport(path, reportFileName); + return true; + } + + //! Remove from report the file that was registered earlier to be sent within report. + //! \return If the function succeeds, the return value is \b true. + bool RemoveFileFromReport( + LPCWSTR path //!< [in] Path to the file, that will be removed from the report. + ) throw() + { + if (!m_RemoveFileFromReport) + return false; + m_RemoveFileFromReport(path); + return true; + } + + //! Fills version field (V) of ApplicationInfo with product version + //! found in the executable file of the current process. + //! \return If the function succeeds, the return value is \b true. + bool GetVersionFromApp( + ApplicationInfo* appInfo //!< [out] Pointer to ApplicationInfo structure. Its version field (V) will be set to product version. + ) throw() + { + if (!m_GetVersionFromApp) + return false; + return m_GetVersionFromApp(appInfo) != FALSE; + } + + //! Fill version field (V) of ApplicationInfo with product version found in the file specified. + //! \return If the function succeeds, the return value is \b true. + bool GetVersionFromFile( + LPCWSTR path, //!< [in] Path to the file product version will be extracted from. + ApplicationInfo* appInfo //!< [out] Pointer to ApplicationInfo structure. Its version field (V) will be set to product version. + ) throw() + { + if (!m_GetVersionFromFile) + return false; + return m_GetVersionFromFile(path, appInfo) != FALSE; + } + + //! If you do not own the process your code running in (for example you write a plugin to some + //! external application) you need to properly initialize CrashHandler using \b ownProcess option. + //! Also you need to explicitly catch all exceptions in all entry points to your code and in all + //! threads you create. To do so use this construction: + //! \code + //! bool SomeEntryPoint(PARAM p) + //! { + //! __try + //! { + //! return YouCode(p); + //! } + //! __except (CrashHandler::SendReport(GetExceptionInformation())) + //! { + //! ::ExitProcess(0); // It is better to stop the process here or else corrupted data may incomprehensibly crash it later. + //! return false; + //! } + //! } + //! \endcode + LONG SendReport( + EXCEPTION_POINTERS* exceptionPointers //!< [in] Pointer to EXCEPTION_POINTERS structure. You should get it using GetExceptionInformation() + //!< function inside __except keyword. + ) + { + if (!m_SendReport) + return EXCEPTION_CONTINUE_SEARCH; + // There is no crash handler but asserts should continue anyway + if (exceptionPointers->ExceptionRecord->ExceptionCode == ExceptionAssertionViolated) + return EXCEPTION_CONTINUE_EXECUTION; + return m_SendReport(exceptionPointers); + } + + //! To send a report about violated assertion you can throw exception with this exception code + //! using: \code RaiseException(CrashHandler::ExceptionAssertionViolated, 0, 0, NULL); \endcode + //! Execution will continue after report will be sent (EXCEPTION_CONTINUE_EXECUTION would be used). + //! \note If you called CrashHandler constructor and crshhdnl.dll was missing you still may using this exception. + //! It will be catched, ignored and execution will continue. \ref SendReport function also works safely + //! when crshhdnl.dll was missing. + static const DWORD ExceptionAssertionViolated = ((DWORD)0xCCE17000); + + //! Sends assertion violation report from this point and continue execution. + //! \sa ExceptionAssertionViolated + //! \note Functions prefixed with "CrashServer_" will be ignored in stack parsing. + void CrashServer_SendAssertionViolated() + { + if (!m_InitCrashHandler) + return; + ::RaiseException(CrashHandler::ExceptionAssertionViolated, 0, 0, NULL); + } + +private: + bool LoadDll() throw() + { + bool result = false; + + // hCrshhndlDll should not be unloaded, crash may appear even after return from main(). + // So hCrshhndlDll is not saved after construction. + HMODULE hCrshhndlDll = ::LoadLibraryW(L"crshhndl.dll"); + if (hCrshhndlDll != NULL) + { + m_InitCrashHandler = (pfnInitCrashHandler) GetProcAddress(hCrshhndlDll, "InitCrashHandler"); + m_SendReport = (pfnSendReport) GetProcAddress(hCrshhndlDll, "SendReport"); + m_IsReadyToExit = (pfnIsReadyToExit) GetProcAddress(hCrshhndlDll, "IsReadyToExit"); + m_AddUserInfoToReport = (pfnAddUserInfoToReport) GetProcAddress(hCrshhndlDll, "AddUserInfoToReport"); + m_AddFileToReport = (pfnAddFileToReport) GetProcAddress(hCrshhndlDll, "AddFileToReport"); + m_RemoveFileFromReport = (pfnRemoveFileFromReport) GetProcAddress(hCrshhndlDll, "RemoveFileFromReport"); + m_GetVersionFromApp = (pfnGetVersionFromApp) GetProcAddress(hCrshhndlDll, "GetVersionFromApp"); + m_GetVersionFromFile = (pfnGetVersionFromFile) GetProcAddress(hCrshhndlDll, "GetVersionFromFile"); + + result = m_InitCrashHandler + && m_SendReport + && m_IsReadyToExit + && m_AddUserInfoToReport + && m_AddFileToReport + && m_RemoveFileFromReport + && m_GetVersionFromApp + && m_GetVersionFromFile; + } + + // if no crash processing was started, we need to ignore ExceptionAssertionViolated exceptions. + if (!result) + ::AddVectoredExceptionHandler(TRUE, SkipAsserts); + + return result; + } + + static LONG CALLBACK SkipAsserts(EXCEPTION_POINTERS* pExceptionInfo) + { + if (pExceptionInfo->ExceptionRecord->ExceptionCode == ExceptionAssertionViolated) + return EXCEPTION_CONTINUE_EXECUTION; + return EXCEPTION_CONTINUE_SEARCH; + } + + typedef BOOL (*pfnInitCrashHandler)(ApplicationInfo* applicationInfo, HandlerSettings* handlerSettings, BOOL ownProcess); + typedef LONG (*pfnSendReport)(EXCEPTION_POINTERS* exceptionPointers); + typedef BOOL (*pfnIsReadyToExit)(); + typedef void (*pfnAddUserInfoToReport)(LPCWSTR key, LPCWSTR value); + typedef void (*pfnAddFileToReport)(LPCWSTR path, LPCWSTR reportFileName /* = NULL */); + typedef void (*pfnRemoveFileFromReport)(LPCWSTR path); + typedef BOOL (*pfnGetVersionFromApp)(ApplicationInfo* appInfo); + typedef BOOL (*pfnGetVersionFromFile)(LPCWSTR path, ApplicationInfo* appInfo); + + pfnInitCrashHandler m_InitCrashHandler; + pfnSendReport m_SendReport; + pfnIsReadyToExit m_IsReadyToExit; + pfnAddUserInfoToReport m_AddUserInfoToReport; + pfnAddFileToReport m_AddFileToReport; + pfnRemoveFileFromReport m_RemoveFileFromReport; + pfnGetVersionFromApp m_GetVersionFromApp; + pfnGetVersionFromFile m_GetVersionFromFile; +}; + + +class CCrashReportTGit +{ +public: + + //! Installs exception handlers to the caller process + CCrashReportTGit(LPCTSTR appname) + { + char s_month[6]; + int month, day, year; + struct tm t = {0}; + static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; + sscanf_s(__DATE__, "%s %d %d", s_month, _countof(s_month)-1, &day, &year); + month = (int)((strstr(month_names, s_month)-month_names))/3; + + t.tm_mon = month; + t.tm_mday = day; + t.tm_year = year - 1900; + t.tm_isdst = -1; + __time64_t compiletime = _mktime64(&t); + + __time64_t now; + _time64(&now); + + if ((now - compiletime)<(60*60*24*31*4)) + { + ApplicationInfo appInfo; + memset(&appInfo, 0, sizeof(appInfo)); + appInfo.ApplicationInfoSize = sizeof(ApplicationInfo); + appInfo.ApplicationGUID = "7fbde3fc-94e9-408b-b5c8-62bd4e203570"; + appInfo.Prefix = "tgit"; + appInfo.AppName = appname; + appInfo.Company = L"TortoiseGit"; + + appInfo.Hotfix = 0; + appInfo.V[0] = TGIT_VERMAJOR; + appInfo.V[1] = TGIT_VERMINOR; + appInfo.V[2] = TGIT_VERMICRO; + appInfo.V[3] = TGIT_VERBUILD; + + HandlerSettings handlerSettings; + memset(&handlerSettings, 0, sizeof(handlerSettings)); + handlerSettings.HandlerSettingsSize = sizeof(handlerSettings); + handlerSettings.LeaveDumpFilesInTempFolder = FALSE; + handlerSettings.UseWER = FALSE; + handlerSettings.OpenProblemInBrowser = TRUE; + handlerSettings.SubmitterID = 0; + + CCrashReport::Instance().InitCrashHandler(&appInfo, &handlerSettings); + } + } + + + //! Deinstalls exception handlers from the caller process + ~CCrashReportTGit() + { + CCrashReport::Instance().Uninstall(); + } + + //! Install status + int m_nInstallStatus; +}; +