From e73ef3aac0bab1b4edb2098c398bf55b8a23f6a0 Mon Sep 17 00:00:00 2001
From: alex_q <914269@qq.com>
Date: Mon, 13 Jul 2026 10:02:53 +0800
Subject: [PATCH] Initial commit
---
.gitignore | 12 +
AppUpgrade.cbproj | 1380 +++++++++++++++++++++++++++++++++++++++++++++
AppUpgrade.cpp | 112 ++++
UpgradeThread.cpp | 922 ++++++++++++++++++++++++++++++
UpgradeThread.h | 62 ++
UpgradeUnit.cpp | 122 ++++
UpgradeUnit.dfm | 71 +++
UpgradeUnit.h | 52 ++
8 files changed, 2733 insertions(+)
create mode 100644 .gitignore
create mode 100644 AppUpgrade.cbproj
create mode 100644 AppUpgrade.cpp
create mode 100644 UpgradeThread.cpp
create mode 100644 UpgradeThread.h
create mode 100644 UpgradeUnit.cpp
create mode 100644 UpgradeUnit.dfm
create mode 100644 UpgradeUnit.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..74b79ad
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+#排除所有的编译目录
+**/Win32/
+
+#排除历史和恢复目录
+__history/
+__recovery/
+
+#排除本地设置
+*.~dsk
+*.cbpr
+*.local
+*.rc
\ No newline at end of file
diff --git a/AppUpgrade.cbproj b/AppUpgrade.cbproj
new file mode 100644
index 0000000..b66a326
--- /dev/null
+++ b/AppUpgrade.cbproj
@@ -0,0 +1,1380 @@
+
+
+ {4FDA74F8-059D-4F68-A028-A088D015B63F}
+ 20.4
+ VCL
+ Application
+ AppUpgrade.cpp
+ True
+ Debug
+ Win32
+ 3
+ AppUpgrade
+
+
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Cfg_1
+ true
+ true
+
+
+ true
+ Base
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ true
+ Cfg_2
+ true
+ true
+
+
+ true
+ CompanyName=;FileDescription=;FileVersion=1.5.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
+ 2052
+ System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)
+ CppVCLApplication
+ ..\;$(ILINK_LibraryPath)
+ true
+ $(BDS)\bin\cbuilder_PROJECTICON.ico
+ ..\;$(IncludePath)
+ <_TCHARMapping>wchar_t
+ AppUpgrade
+ rtl.lib;vcl.lib
+ JPHNE
+ true
+ .\$(Platform)\$(Config)
+ ..\Deploy\$(Platform)\$(Config)\
+ false
+ true
+ true
+ $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath)
+ None
+ _SPTHDG_;$(Defines)
+ 5
+ $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_44.png
+ $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png
+
+
+ res\upgrade.ico
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
+ $(BDSINCLUDE)\windows\vcl;$(IncludePath)
+ $(BDS)\bin\default_app.manifest
+ 1033
+ res\upgrade.ico
+ res\upgrade.ico
+ gdiScaling
+ requireAdministrator
+
+
+ $(BDSINCLUDE)\windows\vcl;$(IncludePath)
+ res\upgrade.ico
+ res\upgrade.ico
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.1.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+ $(BDS)\bin\default_app.manifest
+ 0
+ res\upgrade.ico
+ requireAdministrator
+
+
+ Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
+ Debug
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ 1033
+ $(BDS)\bin\default_app.manifest
+ true
+
+
+ false
+ true
+ false
+ true
+ _DEBUG;$(Defines)
+ false
+ None
+ DEBUG
+ true
+ true
+ true
+ true
+ Full
+ true
+ true
+ true
+ true
+ true
+ $(BDSLIB)\$(PLATFORM)\debug;$(ILINK_LibraryPath)
+ $(BDSLIB)\$(PLATFORM)\debug\$(LANGDIR);$(ILINK_TranslatedLibraryPath)
+
+
+ false
+ true
+ rtl.lib;vcl.lib
+ 1033
+ res\upgrade.ico
+ ..\$(Platform)\$(Config)
+ Debug
+ requireAdministrator
+ $(BDSLIB)\$(PLATFORM)$(CC_SUFFIX)\debug;$(ILINK_LibraryPath)
+ show RBmaster.exe 23
+
+
+ true
+ PerMonitorV2
+ rtl.lib;vcl.lib
+ 0
+ 1033
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.1.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
+ res\upgrade.ico
+ E:\BCB_Projects\Apps\Deploy\Win64\Debug\SportteryHedge.exe
+ show SportteryHedge.exe 13
+ ..\Deploy\$(Platform)\$(Config)\
+ requireAdministrator
+
+
+ PerMonitorV2
+
+
+ NDEBUG;$(Defines)
+ None
+
+
+ CompanyName=;FileVersion=1.5.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)
+ res\upgrade.ico
+ false
+ true
+ rtl.lib;vcl.lib
+ 1033
+ requireAdministrator
+
+
+ true
+ PerMonitorV2
+ rtl.lib;vcl.lib
+ 7
+ true
+ 1033
+ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.1.0.7;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0;Comments=
+ res\upgrade.ico
+ false
+ requireAdministrator
+
+
+ PerMonitorV2
+
+
+
+ 0
+
+
+ UpgradeThread.h
+ 3
+
+
+
+ dfm
+ UpgradeUnit.h
+ 2
+
+
+
+ Base
+
+
+ Cfg_1
+ Base
+
+
+ Cfg_2
+ Base
+
+
+
+ CPlusPlusBuilder.Personality.12
+ CppVCLApplication
+
+
+
+ AppUpgrade.cpp
+
+
+ False
+ True
+ True
+ False
+
+
+ Embarcadero C++Builder Office 2000 Servers Package
+ Embarcadero C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ res\xml
+ 1
+
+
+ res\xml
+ 1
+
+
+
+
+ library\lib\armeabi
+ 1
+
+
+ library\lib\armeabi
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ library\lib\mips
+ 1
+
+
+ library\lib\mips
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-anydpi-v21
+ 1
+
+
+ res\drawable-anydpi-v21
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\values-v21
+ 1
+
+
+ res\values-v21
+ 1
+
+
+
+
+ res\values-v31
+ 1
+
+
+ res\values-v31
+ 1
+
+
+
+
+ res\values-v35
+ 1
+
+
+ res\values-v35
+ 1
+
+
+
+
+ res\drawable-anydpi-v26
+ 1
+
+
+ res\drawable-anydpi-v26
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-anydpi-v33
+ 1
+
+
+ res\drawable-anydpi-v33
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\values-night-v21
+ 1
+
+
+ res\values-night-v21
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+
+
+ res\drawable-ldpi
+ 1
+
+
+ res\drawable-ldpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-mdpi
+ 1
+
+
+ res\drawable-mdpi
+ 1
+
+
+
+
+ res\drawable-hdpi
+ 1
+
+
+ res\drawable-hdpi
+ 1
+
+
+
+
+ res\drawable-xhdpi
+ 1
+
+
+ res\drawable-xhdpi
+ 1
+
+
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+ res\drawable-xxhdpi
+ 1
+
+
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+ res\drawable-xxxhdpi
+ 1
+
+
+
+
+ res\drawable-small
+ 1
+
+
+ res\drawable-small
+ 1
+
+
+
+
+ res\drawable-normal
+ 1
+
+
+ res\drawable-normal
+ 1
+
+
+
+
+ res\drawable-large
+ 1
+
+
+ res\drawable-large
+ 1
+
+
+
+
+ res\drawable-xlarge
+ 1
+
+
+ res\drawable-xlarge
+ 1
+
+
+
+
+ res\values
+ 1
+
+
+ res\values
+ 1
+
+
+
+
+ res\drawable-anydpi-v24
+ 1
+
+
+ res\drawable-anydpi-v24
+ 1
+
+
+
+
+ res\drawable
+ 1
+
+
+ res\drawable
+ 1
+
+
+
+
+ res\drawable-night-anydpi-v21
+ 1
+
+
+ res\drawable-night-anydpi-v21
+ 1
+
+
+
+
+ res\drawable-anydpi-v31
+ 1
+
+
+ res\drawable-anydpi-v31
+ 1
+
+
+
+
+ res\drawable-night-anydpi-v31
+ 1
+
+
+ res\drawable-night-anydpi-v31
+ 1
+
+
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+ Contents\MacOS
+ 1
+ .framework
+
+
+ 0
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 0
+ .dll;.bpl
+
+
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ Contents\MacOS
+ 1
+ .dylib
+
+
+ 0
+ .bpl
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ Contents\Resources\StartUp\
+ 0
+
+
+ 0
+
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+
+
+ Contents
+ 1
+
+
+ Contents
+ 1
+
+
+ Contents
+ 1
+
+
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+ Contents\Resources
+ 1
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+ library\lib\arm64-v8a
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ Contents\MacOS
+ 1
+
+
+ 0
+
+
+
+
+ library\lib\armeabi-v7a
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+ ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
+ 1
+
+
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+ ..\
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen
+ 64
+
+
+ ..\$(PROJECTNAME).launchscreen
+ 64
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+ Assets
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+ ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ False
+
+
+ 12
+
+
+
+
+
diff --git a/AppUpgrade.cpp b/AppUpgrade.cpp
new file mode 100644
index 0000000..4e026db
--- /dev/null
+++ b/AppUpgrade.cpp
@@ -0,0 +1,112 @@
+//---------------------------------------------------------------------------
+#include
+#include
+
+#include "UpgradeThread.h"
+#include "UpgradeUnit.h"
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+USEFORM("UpgradeUnit.cpp", UpgradeForm);
+//---------------------------------------------------------------------------
+
+String MAIN_APP_NAME;
+
+BOOL ImprovePrivilege()
+{
+ HANDLE token;
+ //Ȩ
+ if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token)){
+ MessageBox(NULL,L"ʧ...",L"",MB_ICONSTOP);
+ return FALSE;
+ }
+
+ BOOL bRet = true;
+ TOKEN_PRIVILEGES tkp;
+ tkp.PrivilegeCount = 1;
+ LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);
+ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+ if(!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,NULL)){
+ MessageBox(NULL,L"Ȩʧ...",L"",MB_ICONSTOP);
+ bRet = FALSE;
+ }
+
+ CloseHandle(token);
+
+ return bRet;
+}
+
+int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
+{
+ int mode = 0, sid = 0;
+ String sVar;
+ if( ParamStr(1).IsEmpty() ){
+ return 0;
+ }
+ else{
+ String param = ParamStr(1).UpperCase();
+
+ if( param=="MD5" ){
+ mode = 1;
+ }
+ else if( ParamStr(2).IsEmpty() ){
+ return 0;
+ }
+ else{
+ if( param=="SHOW" )
+ mode = 0;
+ else if( param=="HIDE" )
+ mode = 2;
+ else if( param=="MOVE" )
+ mode = 3;
+
+ MAIN_APP_NAME = ParamStr(2);
+ sid = ParamStr(3).ToInt();
+ sVar = ParamStr(4);
+#ifdef _DEBUG
+// String msg = ParamStr(0) + " ";
+// msg += ParamStr(1) + " ";
+// msg += ParamStr(2) + " ";
+// msg += ParamStr(3);
+// ShowMessage( msg );
+#endif
+ }
+ }
+
+ try{
+ Application->Initialize();
+ Application->Title = APPNAME;
+
+ ImprovePrivilege();
+
+ if( mode < 2 ){
+ Application->MainFormOnTaskBar = true;
+ Application->CreateForm(__classid(TUpgradeForm), &UpgradeForm);
+ UpgradeForm->m_iMode = mode;
+ UpgradeForm->m_idSoft = sid;
+ UpgradeForm->m_sVar = sVar;
+ Application->Run();
+ }
+ else{
+ TUpgradeThread* pThread = new TUpgradeThread( true, mode, sid, sVar );
+ pThread->Start();
+
+ pThread->WaitFor();
+ delete pThread;
+ }
+ }
+ catch (Exception &exception){
+ Application->ShowException(&exception);
+ }
+ catch (...){
+ try{
+ throw Exception("");
+ }
+ catch (Exception &exception){
+ Application->ShowException(&exception);
+ }
+ }
+ return 0;
+}
+//---------------------------------------------------------------------------
diff --git a/UpgradeThread.cpp b/UpgradeThread.cpp
new file mode 100644
index 0000000..3d7b1db
--- /dev/null
+++ b/UpgradeThread.cpp
@@ -0,0 +1,922 @@
+//---------------------------------------------------------------------------
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "UpgradeThread.h"
+
+#pragma hdrstop
+
+#pragma package(smart_init)
+#pragma comment(lib, "wininet")
+//---------------------------------------------------------------------------
+
+#define UPDATE_APP_NAME "AppUpgrade.exe"
+#define MD5_FILE_NAME "filemd5.lst"
+//#define GLOBAL_VAR_FILE "glbvrf.cnf"
+//#define DEFAULT_SERVER "23.236.66.46:88" //"127.0.0.1" //
+#define GLOBAL_VAR_VERSION 0x03
+
+extern String MAIN_APP_NAME;
+
+typedef struct tGVFHeader{
+ char head[4];
+ WORD idSoftware;
+ WORD iUpdate;
+
+ tGVFHeader(){
+ head[0] = 'G';
+ head[1] = 'V';
+ head[2] = 'F';
+ head[3] = GLOBAL_VAR_VERSION;
+ iUpdate = 0;
+ }
+} TGVFHEADER;
+
+typedef struct tGetUrlParam
+{
+ char server[128];
+ int idSoft;
+ int errCode;
+ HINTERNET hSession,
+ hRequest;
+
+ int sizeOut;
+ char *dataOut;
+
+ tGetUrlParam(){
+ memset( this, 0, sizeof(tGetUrlParam) );
+ };
+} TGetUrlParam;
+
+typedef struct tDownloadParam
+{
+ char url[256];
+ char filename[256];
+
+ HWND hWnd;
+ int errCode;
+ HINTERNET hSession,
+ hRequest;
+
+ tDownloadParam(){
+ memset( this, 0, sizeof(tDownloadParam) );
+ };
+} TDownloadParam;
+
+using namespace std;
+
+//---------------------------------------------------------------------------
+DWORD WINAPI GetUrlProc(LPVOID args)
+{
+ TGetUrlParam* param = (TGetUrlParam*)args;
+
+ param->hSession = InternetOpen( L"RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
+ if( param->hSession ){
+ String api = L"http://" + (String)param->server + L"/Api/getUpgradeUrl?sid=" + IntToStr(param->idSoft);
+
+ param->hRequest = InternetOpenUrl( param->hSession, api.c_str(), NULL, 0,
+ INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0 );
+ if( param->hRequest ){
+ int pos = 0;
+ DWORD dwByteRead = 0;
+ char szBuffer[1024];
+
+ ZeroMemory(szBuffer, sizeof(szBuffer));
+ ZeroMemory(param->dataOut, param->sizeOut);
+
+ // ѭȡֱ
+ while( InternetReadFile(param->hRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0){
+ if( pos + dwByteRead > param->sizeOut ){
+ param->errCode = ERROR_SIZE;
+ break;
+ }
+
+ //
+ memcpy( param->dataOut+pos, szBuffer, dwByteRead );
+ pos += dwByteRead;
+
+ // ջԱһζȡ
+ ZeroMemory(szBuffer, sizeof(szBuffer));
+ }
+
+ param->dataOut[pos] = 0;
+ param->sizeOut = pos;
+ }
+ else
+ param->errCode = ERROR_INTERNET_REQ;
+ }
+ else
+ param->errCode = ERROR_INTERNET_OPEN;
+
+ return 0;
+}
+
+DWORD WINAPI DownloadProc(LPVOID args)
+{
+ TDownloadParam* param = (TDownloadParam*)args;
+
+ param->hSession = InternetOpen( L"RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
+ if( param->hSession ){
+ param->hRequest = InternetOpenUrl( param->hSession, ((String)param->url).c_str(), NULL, 0,
+ INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE, 0 );
+ if( param->hRequest ){
+ int pos = 0;
+ DWORD dwAllBytes = 0,
+ dwSize = 4;
+
+ if( param->hWnd ){
+ HttpQueryInfo( param->hRequest, HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,
+ &dwAllBytes, &dwSize, NULL );
+ }
+
+ FILE* fp = fopen( param->filename, "wb" );
+ if( fp ){
+ char szBuffer[2048] = "\0";
+ DWORD dwByteRead = 0, dwReceived = 0;
+
+ ZeroMemory(szBuffer, sizeof(szBuffer));
+
+ // ѭȡֱ
+ while (InternetReadFile(param->hRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0){
+ fwrite( szBuffer, 1, dwByteRead, fp );
+
+ if( param->hWnd ){
+ //ʾ
+ dwReceived += dwByteRead;
+ int pos = (int)( dwReceived * 100.0 / dwAllBytes + 0.5 );
+ SendMessage( param->hWnd, UM_PROGRESS, 1, pos );
+ }
+
+ // ջԱһζȡ
+ ZeroMemory(szBuffer, sizeof(szBuffer));
+ }
+
+ fclose( fp );
+
+ if( dwReceived==dwAllBytes ){
+ SendMessage( param->hWnd, UM_PROGRESS, 1, 100 );
+ param->errCode = 0;
+ }
+ else
+ param->errCode = ERROR_FILE_SIZE;
+ }
+ else
+ param->errCode = ERROR_OPEN_FILE;
+ }
+ else
+ param->errCode = ERROR_INTERNET_REQ;
+ }
+ else
+ param->errCode = ERROR_INTERNET_OPEN;
+
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+/////////////////////////////////////////////////////////////////////////////
+//
+__fastcall TUpgradeThread::TUpgradeThread(bool CreateSuspended, int mode, int sid, String sVar, HWND hWnd)
+ : TThread(CreateSuspended)
+{
+ m_iMode = mode;
+ m_idSoft = sid;
+ m_hWnd = hWnd;
+ m_lstFile = NULL;
+ m_bUpdateSelf = false;
+
+ m_AppPath = TPath::GetFullPath(ExtractFilePath(Application->ExeName));
+ m_PathName = m_AppPath + MAIN_APP_NAME;
+// m_Server = DEFAULT_SERVER;
+ m_hSema = CreateSemaphore( NULL, 0, 1, NULL );
+
+ m_GlobalFile = m_AppPath + sVar;// GLOBAL_VAR_FILE;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeThread::Cancel()
+{
+ Terminate();
+ ReleaseSemaphore( m_hSema, 1, NULL );
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeThread::Execute()
+{
+ int ret = 0;
+ //ȡбļ
+ //ԱļMD5=>б
+ //ظбеļ
+ if( m_iMode==3 ){
+ Sleep(1000); //ȴappȫ˳
+ if( UpdateFiles() ){
+ RegUpdateFlag( 0 );
+ RestartApp();
+ }
+ }
+ else if( m_iMode==1 ){
+ MakeMD5File();
+ }
+ else{
+ String strText, strProg1, strProg2;
+ //Ŀ¼
+ ClearUpdateDir();
+
+ Randomize();
+
+ if( m_hWnd ){
+ strText = "ڻȡб";
+ SendMessage( m_hWnd, UM_SHOWTEXT, 0, (LPARAM)strText.c_str() );
+
+ strProg1 = L"";
+ SendMessage( m_hWnd, UM_SHOWTEXT, 1, (LPARAM)strProg1.c_str() );
+
+ strProg2 = L"бļ";
+ SendMessage( m_hWnd, UM_SHOWTEXT, 2, (LPARAM)strProg2.c_str() );
+ }
+
+ String umdfile = GetUpdateMD5File();
+ if( umdfile.Length()>0 && !Terminated ){
+ if( m_hWnd ){
+ strText = "ڼб";
+ SendMessage( m_hWnd, UM_SHOWTEXT, 0, (LPARAM)strText.c_str() );
+ }
+
+ TStringList* ufnLst = new TStringList;
+ int ret = GetUpdateFileList( umdfile, ufnLst );
+ if( ret==0 && !Terminated ){
+ int count = ufnLst->Count;
+ if( count > 0 ){
+ if( m_hWnd ){
+ strText = "ظļ";
+ SendMessage( m_hWnd, UM_SHOWTEXT, 0, (LPARAM)strText.c_str() );
+ }
+
+ for( int i=0; iCount && !Terminated; i++ ){
+ if( m_hWnd ){
+ strProg1 = L"ļ " + IntToStr( i )
+ + L"/" + IntToStr( m_lstFile->Count );
+ SendMessage( m_hWnd, UM_SHOWTEXT, 1, (LPARAM)strProg1.c_str() );
+
+ int pos = (int)( i*100.0/m_lstFile->Count + 0.5 );
+ SendMessage( m_hWnd, UM_PROGRESS, 0, pos );
+
+ strProg2 = L"ǰļ " + (*m_lstFile)[i];
+ SendMessage( m_hWnd, UM_SHOWTEXT, 2, (LPARAM)strProg2.c_str() );
+ }
+
+ String md5;
+ if( !GenerateFileMD5( (*m_lstFile)[i], md5 ) )
+ break;
+
+ if( m_hWnd )
+ SendMessage( m_hWnd, UM_PROGRESS, 1, 100 );
+
+ char text[256];
+ sprintf( text, "%s\t%s\n",
+ ((AnsiString)(*m_lstFile)[i]).c_str(),
+ ((AnsiString)md5).c_str() );
+
+ fwrite( text, 1, strlen(text), fp );
+ }
+
+ if( !Terminated && m_hWnd )
+ SendMessage( m_hWnd, UM_PROGRESS, 0, 100 );
+
+ fclose( fp );
+ }
+ }
+
+ delete m_lstFile;
+ delete m_lstMD5;
+ m_lstFile = NULL;
+
+ return !Terminated;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TUpgradeThread::GenerateFileMD5( String fname, String& md5 )
+{
+ String strName = m_AppPath + fname;
+ THashMD5* pMD5 = new THashMD5();
+ TFileStream* fs = new TFileStream( strName, fmOpenRead | fmShareDenyNone );
+ fs->Position = 0;
+
+ int sizeBuf = 1024 * 1024;
+ char* buf = (char*)malloc( sizeBuf );
+ while( !Terminated && fs->Position < fs->Size ){
+ if( fs->Position + sizeBuf > fs->Size )
+ sizeBuf = fs->Size - fs->Position;
+ fs->ReadBuffer( buf, sizeBuf );
+
+ pMD5->Update( buf, sizeBuf );
+
+ if( m_hWnd ){
+ //ʾ
+ int pos = (int)( fs->Position * 100.0 / fs->Size + 0.5 );
+ SendMessage( m_hWnd, UM_PROGRESS, 1, pos );
+ }
+ }
+
+ if( !Terminated ){
+ md5 = pMD5->HashAsString();
+ }
+
+ free( buf );
+
+ delete fs;
+ delete pMD5;
+
+ return !Terminated;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::DownloadFile( String url, String filename )
+{
+ int ret = -1;
+ String path = m_AppPath + L"upgrade\\";
+
+ if(!DirectoryExists(path, false))
+ ForceDirectories(path);
+
+ DeleteUrlCacheEntry(url.c_str());
+
+ path += filename;
+
+ for( int i=0; i<3; i++ ){ //3
+ TDownloadParam param;
+ param.hWnd = m_hWnd;
+ strcpy( param.url, ((AnsiString)url).c_str() );
+ strcpy( param.filename, ((AnsiString)path).c_str() );
+
+ DWORD id;
+ HANDLE hThread = CreateThread( NULL, 0, DownloadProc, ¶m, 0, &id );
+ if( hThread ){
+ HANDLE aHandle[2] = { m_hSema, hThread };
+
+ DWORD dwRet = WaitForMultipleObjects( 2, aHandle, FALSE, INFINITE );
+ if( param.hRequest )
+ InternetCloseHandle( param.hRequest );
+ if( param.hSession )
+ InternetCloseHandle( param.hSession );
+
+ WaitForSingleObject( hThread, 200 );
+ CloseHandle( hThread );
+
+ if( dwRet==WAIT_OBJECT_0 ) //û˳
+ break;
+ else if( dwRet==WAIT_OBJECT_0+1 ){ //߳˳
+ if( param.errCode==0 ){
+ ret = 0;
+ break;
+ }
+ else if( param.errCode==ERROR_OPEN_FILE )
+ break;
+ }
+ }
+ }
+
+ return ret;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TUpgradeThread::GetFileList( TStringList* pList )
+{
+ TSearchRec sr;
+ int iAttr = 0;
+ String strPath = m_AppPath;
+
+ if( FindFirst(strPath + L"*.*", iAttr, sr)==0 ){
+ do{
+ if( !(iAttr & faDirectory) /*iAttr & faNormal*/
+ //&& !sr.Name.Pos(".log")
+ //&& !sr.Name.Pos(".txt")
+ //&& !sr.Name.Pos(".ico")
+ //&& !sr.Name.Pos(".cnf")
+ //&& !sr.Name.Pos("agcdstdt")
+ && !sr.Name.Pos(".lst")){
+ pList->Add( sr.Name );
+ }
+ }
+ while( !Terminated && FindNext(sr)==0 );
+
+ FindClose(sr);
+ }
+
+ return !Terminated;
+}
+//---------------------------------------------------------------------------
+
+String __fastcall TUpgradeThread::GetUpdateMD5File()
+{
+ String locFile;
+
+ m_UpdateUrl = GetUpdateURL();
+ if( m_UpdateUrl.Length()>0 ){
+ int ran = Random( 1000000 );
+ String url = m_UpdateUrl + MD5_FILE_NAME;
+ url += "?" + IntToStr( ran );
+ int ret = DownloadFile( url, MD5_FILE_NAME );
+ if( ret==0 ){
+ locFile = m_AppPath + L"upgrade/" + MD5_FILE_NAME;
+ }
+ }
+
+ return locFile;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::GetServers( TStringList* pList )
+{
+ char szBuffer[2048] = "";
+// bool bSave = false;
+ FILE* fp = NULL;
+
+ //ȡļ
+ fp = fopen( ((AnsiString)m_GlobalFile).c_str(), "rb" );
+ if( fp ){
+ TGVFHEADER header;
+ header.idSoftware = m_idSoft;
+ int ret = fread( (void*)szBuffer, 1, sizeof(header), fp );
+
+ if( ret==sizeof(header) && !memcmp(szBuffer, header.head, sizeof(header.head)) ){
+ fseek( fp, 0, SEEK_END );
+ int size = ftell( fp ) - sizeof(header);
+ if( size>2048 )
+ size = 2048;
+
+ fseek( fp, sizeof(header), SEEK_SET );
+ fread( szBuffer, 1, size, fp );
+
+ char srvs[1024] = "";
+ char *tokenPtr=strtok(szBuffer,"\n");
+ while( tokenPtr ){
+ if( strstr(tokenPtr, "srv=") ){
+ strcpy( srvs, tokenPtr+4 );
+ break;
+ }
+ tokenPtr=strtok(NULL,"\n");
+ }
+
+ if( strlen(srvs) ){
+ char *tkn = strtok( srvs, ";" );
+ while( tkn!=NULL ){
+ pList->Add( tkn );
+ tkn = strtok(NULL, ";");
+ }
+ }
+ }
+
+ fclose( fp );
+ }
+// else{
+// pList->Add( m_Server );
+// }
+
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+String __fastcall TUpgradeThread::GetUpdateURL()
+{
+ String url;
+ TStringList* pServers = new TStringList;
+ GetServers( pServers );
+
+ for( int i=0; iCount; i++ ){
+ int sizeOut = 2048;
+ char dataOut[2048];
+
+ TGetUrlParam param;
+ param.idSoft = m_idSoft;
+ param.sizeOut = sizeOut;
+ param.dataOut = dataOut;
+ strcpy( param.server, ((AnsiString)(*pServers)[i]).c_str() );
+
+ DWORD id;
+ HANDLE hThread = CreateThread( NULL, 0, GetUrlProc, ¶m, 0, &id );
+ if( hThread ){
+ HANDLE aHandle[2] = { m_hSema, hThread };
+
+ DWORD dwRet = WaitForMultipleObjects( 2, aHandle, FALSE, 10000 );
+ if( param.hRequest )
+ InternetCloseHandle( param.hRequest );
+ if( param.hSession )
+ InternetCloseHandle( param.hSession );
+
+ WaitForSingleObject( hThread, 200 );
+ CloseHandle( hThread );
+
+ if( dwRet==WAIT_OBJECT_0 ) //û˳
+ break;
+ else if( dwRet==WAIT_OBJECT_0+1 && param.errCode==0 ){ //߳˳
+ if(dataOut[0]=='\"' && dataOut[param.sizeOut-1]=='\"')
+ dataOut[param.sizeOut-1] = 0;
+
+ char* p = strstr( dataOut, "url:" );
+ if( p ){
+ m_Server = (*pServers)[i];
+
+ char* str = p+4;
+ url = L"http://" + m_Server + L"/" + str;
+
+ break;
+ }
+ }
+ }
+ }
+
+ delete pServers;
+
+ return url;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::GetUpdateFileList( String ufile, TStringList* ufnLst )
+{
+ int err = 0;
+ String lfname = m_AppPath + MD5_FILE_NAME;
+
+ FILE *ufp = fopen( ((AnsiString)ufile).c_str(), "rb" ),
+ *lfp = fopen( ((AnsiString)lfname).c_str(), "rb" );
+
+ if( !ufp ){
+ err = -1;
+ goto exit_line;
+ }
+ else if( !lfp ){
+ if( !MakeMD5File() || !(lfp=fopen( ((AnsiString)lfname).c_str(), "rb" )) ){
+ err = -2;
+ goto exit_line;
+ }
+ }
+
+ {
+ char lbuf[4096] = "",
+ ubuf[4096] = "";
+
+ fseek( lfp, 0, SEEK_END );
+ fseek( ufp, 0, SEEK_END );
+
+ int lsize = ftell( lfp );
+ int usize = ftell( ufp );
+
+ if(usize==0)
+ goto exit_line;
+
+ fseek( lfp, 0, SEEK_SET );
+ fseek( ufp, 0, SEEK_SET );
+ fread( lbuf, 1, lsize, lfp );
+ fread( ubuf, 1, usize, ufp );
+
+ fclose( lfp );
+ fclose( ufp );
+ lfp = ufp = NULL;
+
+ TStringList *lfnLst = new TStringList,
+ *lmdLst = new TStringList,
+ *umdLst = new TStringList;
+
+ char *tokenPtr=strtok(lbuf,"\n");
+ while( tokenPtr ){
+ char* pos = strstr( tokenPtr, "\t" );
+
+ if( pos ){
+ char buf[256];
+ memcpy( buf, tokenPtr, pos-tokenPtr );
+ buf[pos-tokenPtr] = 0;
+ lfnLst->Add( buf );
+ lmdLst->Add( pos+1 );
+ }
+
+ tokenPtr=strtok(NULL,"\n");
+ }
+
+ tokenPtr=strtok(ubuf,"\n");
+ while( tokenPtr ){
+ char* pos = strstr( tokenPtr, "\t" );
+
+ if( pos ){
+ char buf[256];
+ memcpy( buf, tokenPtr, pos-tokenPtr );
+ buf[pos-tokenPtr] = 0;
+ ufnLst->Add( buf );
+ umdLst->Add( pos+1 );
+ }
+
+ tokenPtr=strtok(NULL,"\n");
+ }
+
+ String strProg1, strProg2;
+ int count = ufnLst->Count;
+ for( int i=ufnLst->Count-1; i>=0; i-- ){
+ if( m_hWnd ){
+ strProg1 = L"ļ " + IntToStr( count-i-1 ) + L"/" + IntToStr(count);
+ SendMessage( m_hWnd, UM_SHOWTEXT, 1, (LPARAM)strProg1.c_str() );
+
+ int pos = (int)( (count-i-1)*100.0/count + 0.5 );
+ SendMessage( m_hWnd, UM_PROGRESS, 0, pos );
+
+ strProg2 = L"ǰȶļ " + (*ufnLst)[i];
+ SendMessage( m_hWnd, UM_SHOWTEXT, 2, (LPARAM)strProg2.c_str() );
+ }
+
+ int count2 = lfnLst->Count;
+ for( int j=lfnLst->Count-1; j>=0; j-- ){
+ if( m_hWnd ){
+ int pos = (int)( (count2-j)*100.0/count2 + 0.5 );
+ SendMessage( m_hWnd, UM_PROGRESS, 1, pos );
+ }
+
+// String ufn = (*ufnLst)[i],
+// lfn = (*lfnLst)[j];
+
+ if( !(*ufnLst)[i].CompareIC( (*lfnLst)[j] ) ){
+// String umd = (*umdLst)[i],
+// lmd = (*lmdLst)[j];
+
+ if( !(*umdLst)[i].CompareIC( (*lmdLst)[j] ) ){
+ ufnLst->Delete( i );
+ umdLst->Delete( i );
+ }
+
+ lfnLst->Delete( j );
+ lmdLst->Delete( j );
+
+ break;
+ }
+ }
+ }
+
+ delete lfnLst;
+ delete lmdLst;
+ delete umdLst;
+ }
+
+exit_line:
+ if( ufp )
+ fclose( ufp );
+ if( lfp )
+ fclose( lfp );
+
+ return err;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::RegUpdateFlag( int iUpdate )
+{
+ FILE* fp = fopen( ((AnsiString)m_GlobalFile).c_str(), "r+b" );
+ if( fp ){
+ TGVFHEADER header;
+ header.idSoftware = m_idSoft;
+ header.iUpdate = iUpdate;
+
+ fseek( fp, 0, SEEK_SET );
+ fwrite( (void*)&header, sizeof(header), 1, fp );
+
+ fclose( fp );
+ }
+
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::ClearUpdateDir()
+{
+ TSearchRec sr;
+ int iAttr = 0;
+ String strPath = m_AppPath + L"upgrade\\";
+
+ if( FindFirst(strPath + L"*.*", iAttr, sr)==0 ){
+ do{
+ if( !(iAttr & faDirectory) ){
+ DeleteFile( strPath + sr.Name );
+ }
+ }
+ while( FindNext(sr)==0 );
+
+ FindClose(sr);
+ }
+
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TUpgradeThread::UpdateFiles()
+{
+ bool bSuccess = true;
+ TSearchRec sr;
+ int iAttr = 0;
+ String strPath = m_AppPath + L"upgrade\\";
+
+ //ȹر
+ StopApp();
+
+ Sleep(1000); //ȴappȫ˳
+
+ if( FindFirst(strPath + L"*.*", iAttr, sr)==0 ){
+ do{
+ if( !(iAttr & faDirectory) && sr.Name.CompareIC(UPDATE_APP_NAME) ){
+ String fOld = strPath + sr.Name,
+ fNew = m_AppPath + sr.Name;
+
+ if( !MoveFileEx( fOld.c_str(), fNew.c_str(), MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH ) ){
+ bSuccess = false;
+ break;
+ }
+ }
+ }
+ while( FindNext(sr)==0 );
+
+ FindClose(sr);
+ }
+
+ return bSuccess;
+}
+//---------------------------------------------------------------------------
+
+int __fastcall TUpgradeThread::RestartApp()
+{
+ //
+ HANDLE hToken = NULL,
+ hTokenDup = NULL;
+ if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken)){
+ if(DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS,NULL, SecurityIdentification,
+ TokenPrimary, &hTokenDup)){
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+
+ ZeroMemory(&si,sizeof(STARTUPINFO));
+ ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
+ si.cb = sizeof(STARTUPINFO);
+ si.lpDesktop = NULL;
+ si.lpReserved = NULL;
+ si.lpTitle = NULL;
+ si.cbReserved2 = NULL;
+ si.lpReserved2 = NULL;
+ si.dwFlags = STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_SHOWNORMAL;
+
+ String command = "\"" + m_AppPath + MAIN_APP_NAME + "\"";
+ CreateProcessAsUser(hTokenDup,NULL,command.c_str(),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
+ }
+ }
+
+ return 0;
+}
+//---------------------------------------------------------------------------
+
+bool __fastcall TUpgradeThread::StopApp()
+{
+ HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0 ); //ȡ̿
+ if( hSnapshot ){
+ DWORD idProcess = 0;
+ PROCESSENTRY32 pe32;
+ pe32.dwSize = sizeof( PROCESSENTRY32 );
+
+ if(!Process32First( hSnapshot, &pe32 )){ //ָһ
+ CloseHandle(hSnapshot);
+ return false;
+ }
+
+ do{
+ if( lstrcmpi( pe32.szExeFile, MAIN_APP_NAME.c_str() )==0 ){ //ҽ
+ if( SameModulePath( pe32.th32ProcessID )){
+ idProcess = pe32.th32ProcessID;
+ break;
+ }
+ }
+ }
+ while( Process32Next(hSnapshot, &pe32) ); // ѭֱȡ
+
+ if( idProcess ){
+ HANDLE hApp= OpenProcess( PROCESS_ALL_ACCESS, FALSE, idProcess ); //ݽIDȡľ
+ if( hApp ){
+ if( WaitForSingleObject( hApp, 2000 )==WAIT_TIMEOUT )// ȴر2
+ TerminateProcess( hApp, 0 );
+
+ CloseHandle( hApp );
+ }
+ }
+
+ CloseHandle( hSnapshot );
+ }
+
+ return true;
+}
+//---------------------------------------------------------------------------
+
+#define PSAPI_VERSION 1
+#include
+#pragma comment(lib,"psapi")
+bool __fastcall TUpgradeThread::SameModulePath(DWORD dwPID)
+{
+ TCHAR sFilename[MAX_PATH];
+ HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
+ if (hProcess == NULL)
+ return false;
+
+ bool bSame = false;
+ HMODULE hModule;
+ DWORD cbNeeded;
+ if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded)){
+ if (GetModuleFileNameEx(hProcess, hModule, sFilename, MAX_PATH)){
+ if(wcslen(sFilename)>0){
+ String sFullName = TPath::GetFullPath(sFilename);
+ if( !m_PathName.CompareIC( sFilename ) )
+ bSame = true;
+ }
+ }
+ }
+ else{
+ DWORD size = MAX_PATH;
+ if (QueryFullProcessImageName(hProcess, 0, sFilename, &size)){
+ if( !m_PathName.CompareIC( sFilename ) )
+ bSame = true;
+ }
+ }
+ CloseHandle(hProcess);
+
+ return bSame;
+}
+//---------------------------------------------------------------------------
+
diff --git a/UpgradeThread.h b/UpgradeThread.h
new file mode 100644
index 0000000..da9cc75
--- /dev/null
+++ b/UpgradeThread.h
@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+
+#ifndef UpgradeThreadH
+#define UpgradeThreadH
+
+//---------------------------------------------------------------------------
+#define UM_SHOWTEXT WM_USER+0x1000
+#define UM_PROGRESS WM_USER+0x1001
+#define UM_COMPLETE WM_USER+0x1003
+
+#define ERROR_OPEN_FILE 10
+#define ERROR_MEMORY 11
+#define ERROR_SIZE 12
+#define ERROR_INTERNET_OPEN 13
+#define ERROR_INTERNET_CONN 14
+#define ERROR_INTERNET_REQ 15
+#define ERROR_INTERNET_SEND 16
+#define ERROR_FILELIST_GET 17
+#define ERROR_FILE_SIZE 18
+//---------------------------------------------------------------------------
+
+class TUpgradeThread : public TThread
+{
+private:
+ int m_iMode,
+ m_idSoft;
+ HWND m_hWnd;
+ HANDLE m_hSema;
+ TStringList* m_lstMD5;
+ bool m_bUpdateSelf; //Ƿ
+ String m_AppPath,
+ m_PathName,
+ m_Server,
+ m_UpdateUrl,
+ m_GlobalFile;
+
+ bool __fastcall MakeMD5File();
+ bool __fastcall GetFileList(TStringList* pList);
+ bool __fastcall GenerateFileMD5( String fname, String& md5 );
+ String __fastcall GetUpdateMD5File();
+ int __fastcall GetUpdateFileList( String ufile, TStringList* pList );
+ int __fastcall DownloadFile( String url, String filename );
+ String __fastcall GetUpdateURL();
+ int __fastcall GetServers( TStringList* pList );
+ int __fastcall RegUpdateFlag( int iUpdate );
+ int __fastcall ClearUpdateDir();
+ bool __fastcall UpdateFiles();
+ int __fastcall RestartApp();
+ bool __fastcall StopApp();
+ bool __fastcall SameModulePath(DWORD dwPID);
+
+protected:
+ void __fastcall Execute();
+public:
+ TStringList* m_lstFile;
+ __fastcall TUpgradeThread(bool CreateSuspended, int mode, int sid, String sVar, HWND hWnd=NULL );
+
+ void __fastcall Cancel();
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/UpgradeUnit.cpp b/UpgradeUnit.cpp
new file mode 100644
index 0000000..dedfa79
--- /dev/null
+++ b/UpgradeUnit.cpp
@@ -0,0 +1,122 @@
+//---------------------------------------------------------------------------
+
+#include
+#include
+#pragma hdrstop
+
+#include "UpgradeThread.h"
+#include "UpgradeUnit.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TUpgradeForm *UpgradeForm;
+
+//---------------------------------------------------------------------------
+__fastcall TUpgradeForm::TUpgradeForm(TComponent* Owner)
+ : TForm(Owner)
+{
+ m_pThread = NULL;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::CreateParams(TCreateParams &Params)
+{
+ TForm::CreateParams(Params);
+
+// wcscpy(Params.WinClassName.data, (LPCTSTR)APPNAME);
+ wcscpy(Params.WinClassName, (LPCTSTR)APPNAME);
+}
+// ---------------------------------------------------------------------------
+
+
+void __fastcall TUpgradeForm::FormDestroy(TObject *Sender)
+{
+ if( m_pThread ){
+ ((TUpgradeThread*)m_pThread)->Cancel();
+ m_pThread->WaitFor();
+
+ delete m_pThread;
+ m_pThread = NULL;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::FormCloseQuery(TObject *Sender, bool &CanClose)
+{
+ if( m_pThread ){
+ String msg = m_iMode==1 ? L"ڴУȷ˳"
+ : L"УǷȷֹ";
+
+ int mrRet = MessageBox(Handle, msg.c_str(), L"˳",
+ MB_ICONQUESTION | MB_YESNO);;
+
+ if( mrRet==mrNo )
+ CanClose = false;
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::FormShow(TObject *Sender)
+{
+ Caption = m_iMode==0 ? L"Զ"
+ : L"MD5ɳ";
+
+ m_pThread = new TUpgradeThread(true, m_iMode, m_idSoft, m_sVar, Handle );
+ m_pThread->Start();
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::UMShowText(TMessage &msg)
+{
+ TCHAR* str = (TCHAR*)msg.LParam;
+ if( msg.WParam==0 )
+ m_lblTxt->Caption = str;
+ else if( msg.WParam==1 )
+ m_lblFileCount->Caption = str;
+ else
+ m_lblFileName->Caption = str;
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::UMProgress(TMessage &msg)
+{
+ if( msg.WParam==0 ){
+ m_progCount->Position = msg.LParam;
+ m_progCount->Update();
+ }
+ else{
+ m_progFile->Position = msg.LParam;
+ m_progFile->Update();
+ }
+}
+//---------------------------------------------------------------------------
+
+void __fastcall TUpgradeForm::UMComplete(TMessage &msg)
+{
+ if( m_pThread ){
+ m_pThread->WaitFor();
+
+ delete m_pThread;
+ m_pThread = NULL;
+ }
+
+ if( m_iMode==0 ){
+ if( msg.WParam!=0 )
+ ShowMessage( "θδ" );
+ }
+ else if( m_iMode==1 ){
+ if( msg.WParam==0 )
+ ShowMessage( "" );
+ else
+ ShowMessage( "쳣ֹ" );
+ }
+
+ Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TUpgradeForm::CancelClick(TObject *Sender)
+{
+ Close();
+}
+//---------------------------------------------------------------------------
+
diff --git a/UpgradeUnit.dfm b/UpgradeUnit.dfm
new file mode 100644
index 0000000..401f5e9
--- /dev/null
+++ b/UpgradeUnit.dfm
@@ -0,0 +1,71 @@
+object UpgradeForm: TUpgradeForm
+ Left = 0
+ Top = 0
+ BorderIcons = [biSystemMenu, biMinimize]
+ BorderStyle = bsSingle
+ Caption = 'MD5'#29983#25104#31243#24207
+ ClientHeight = 203
+ ClientWidth = 509
+ Color = clBtnFace
+ DoubleBuffered = True
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Tahoma'
+ Font.Style = []
+ FormStyle = fsStayOnTop
+ Position = poDesktopCenter
+ Scaled = False
+ OnCloseQuery = FormCloseQuery
+ OnDestroy = FormDestroy
+ OnShow = FormShow
+ TextHeight = 13
+ object m_lblFileCount: TLabel
+ Left = 24
+ Top = 93
+ Width = 329
+ Height = 13
+ AutoSize = False
+ Caption = #22788#29702#25991#20214#25968
+ end
+ object m_lblTxt: TLabel
+ Left = 24
+ Top = 40
+ Width = 329
+ Height = 13
+ AutoSize = False
+ Caption = #27491#22312#22788#29702
+ end
+ object m_lblFileName: TLabel
+ Left = 24
+ Top = 141
+ Width = 329
+ Height = 13
+ AutoSize = False
+ Caption = #22788#29702#25991#20214
+ end
+ object m_progCount: TProgressBar
+ Left = 24
+ Top = 112
+ Width = 457
+ Height = 17
+ TabOrder = 0
+ end
+ object m_progFile: TProgressBar
+ Left = 24
+ Top = 160
+ Width = 457
+ Height = 17
+ TabOrder = 1
+ end
+ object m_btnCancel: TButton
+ Left = 400
+ Top = 35
+ Width = 75
+ Height = 25
+ Caption = #21462#28040
+ ModalResult = 2
+ TabOrder = 2
+ OnClick = CancelClick
+ end
+end
diff --git a/UpgradeUnit.h b/UpgradeUnit.h
new file mode 100644
index 0000000..f7a4f64
--- /dev/null
+++ b/UpgradeUnit.h
@@ -0,0 +1,52 @@
+//---------------------------------------------------------------------------
+
+#ifndef UpgradeUnitH
+#define UpgradeUnitH
+//---------------------------------------------------------------------------
+#include
+#include
+#include
+#include
+#include
+
+#define APPNAME "APPԶ\0"
+
+//---------------------------------------------------------------------------
+class TUpgradeForm : public TForm
+{
+__published: // IDE-managed Components
+ TLabel *m_lblFileCount;
+ TProgressBar *m_progCount;
+ TLabel *m_lblTxt;
+ TProgressBar *m_progFile;
+ TLabel *m_lblFileName;
+ TButton *m_btnCancel;
+ void __fastcall FormDestroy(TObject *Sender);
+ void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+ void __fastcall FormShow(TObject *Sender);
+ void __fastcall CancelClick(TObject *Sender);
+private: // User declarations
+ TThread *m_pThread;
+
+ void __fastcall CreateParams(TCreateParams &Params);
+
+ MESSAGE void __fastcall UMProgress(TMessage &msg);
+ MESSAGE void __fastcall UMShowText(TMessage &msg);
+ MESSAGE void __fastcall UMComplete(TMessage &msg);
+
+ BEGIN_MESSAGE_MAP
+ MESSAGE_HANDLER(UM_PROGRESS, TMessage, UMProgress)
+ MESSAGE_HANDLER(UM_SHOWTEXT, TMessage, UMShowText)
+ MESSAGE_HANDLER(UM_COMPLETE, TMessage, UMComplete)
+ END_MESSAGE_MAP(TForm)
+public: // User declarations
+ __fastcall TUpgradeForm(TComponent* Owner);
+
+ int m_iMode;
+ int m_idSoft;
+ String m_sVar;
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TUpgradeForm *UpgradeForm;
+//---------------------------------------------------------------------------
+#endif