123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623 |
- unit Connections;
- interface
- uses
- ADODB, SysUtils, Classes, ZhAPI, Windows;
- const
- ProductName = 'Measure';
- EmptyFileVersion = '1.0.0.0';
- FileVersion = '1.0.1.12';
- EncryptVersion = 'Auto1.0';
- SAdoConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;' +
- 'User ID=Admin;Password='''';Persist Security Info=True';
- type
- TConnection = class
- private
- FFileName: string;
- FOrgFile: string;
- function GetConnection: TADOConnection; virtual; abstract;
- protected
- procedure AppendLog(const ALog: string);
- public
- procedure Open(const AFileName: string); virtual; abstract;
- procedure Save; virtual; abstract;
- procedure Close;
- function HasOpened: Boolean; virtual; abstract;
- property FileName: string read FFileName;
- property Connection: TADOConnection read GetConnection;
- property OrgFile: string read FOrgFile;
- end;
- TCommonConnection = class(TConnection)
- private
- FConnection: TADOConnection;
- procedure InnerOpen(const AFileName: string);
- function GetConnection: TADOConnection; override;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Open(const AFileName: string); override;
- procedure Save; override;
- function HasOpened: Boolean; override;
- end;
- TDrawingFileHead = packed record
- ProductName: string[20];
- FileType: Integer;
- EncryptVersion: string[20];
- FileVersion: string[20];
- // 创建项目 -- Exe版本号
- CreateExeVersion: string[20];
- // 最后一次打开 -- Exe版本号
- LastestExeVersion: string[20];
- // 历史最大 -- exe版本号
- MaxExeVersion: string[20];
- Reserve: array [0..1024 -21 -21 -21] of Char;
- end;
- TEncryptConnection = class(TCommonConnection)
- private
- FFileHead: TDrawingFileHead;
- function CheckFileValid(const AFileName: string): Boolean;
- procedure Encrypt;
- function Decrypt(const AFileName: string): string;
- procedure RefreshFileHead;
- procedure DamageFileHead(AFileName: string);
- procedure RecoverFileHead(AFileName: string);
- procedure WriteAndAddHead(AFileName: string);
- procedure RemoveHead(const AFileName: string);
- procedure ReadAndRemoveHead(AFileName: string);
- procedure ResetFileHead;
- function CheckFileEncrypt: Boolean; overload;
- function CheckFileEncrypt(AFileName: string): Boolean; overload;
- function GetNeedUpdate: Boolean;
- function GetOverExe: Boolean;
- function GetFileVersion: string;
- public
- destructor Destroy; override;
- procedure Open(const AFileName: string); override;
- procedure Save; override;
- procedure UnEncryptSave;
- procedure UpdateFileVersion;
- procedure SaveDebugFile(const AFileName: string);
- property NeedUpdate: Boolean read GetNeedUpdate;
- property OverExe: Boolean read GetOverExe;
- property CurFileVersion: string read GetFileVersion;
- end;
- procedure SimpleDecrypt(const ASourceFile, AResultFile: string);
- function FileEncrypted(const AFileName: string): Boolean;
- implementation
- uses
- CompactDB, TransFile, UtilMethods, Globals;
- const
- MDBOrgHead: array [0..15] of Byte =
- ($00, $01, $00, $00, $53, $74, $61, $6E, $64, $61, $72, $64, $20, $4A, $65, $74);
- WrongHead: array [0..15] of Char =
- ('z', 'o', 'n', 'g', 'h', 'e', 'n', 'g', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e');
- procedure SimpleDecrypt(const ASourceFile, AResultFile: string);
- procedure RemoveHead(const AFileName: string);
- var
- sTempFile: string;
- FileStream, FileStreamTemp: TFileStream;
- begin
- if not FileExists(AFileName) then Exit;
- sTempFile := GetTempFileName;
- try
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- FileStreamTemp := TFileStream.Create(sTempFile, fmCreate);
- try
- FileStream.Position := SizeOf(TDrawingFileHead);
- FileStreamTemp.CopyFrom(FileStream, FileStream.Size - SizeOf(TDrawingFileHead));
- finally
- FileStream.Free;
- FileStreamTemp.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- finally
- DeleteFile(PChar(sTempFile));
- end;
- end;
- procedure RecoverFileHead(const AFileName: string);
- var
- sTempFile: string;
- FileStream: TFileStream;
- begin
- sTempFile := ExtractFilePath(AFileName) + ExtractSimpleFileName(AFileName) + '.tmp';
- CopyFileOrFolder(AFileName, sTempFile);
- try
- if FileExists(sTempFile) then
- begin
- FileStream := TFileStream.Create(sTempFile, fmOpenWrite);
- try
- FileStream.Seek($00, soFromBeginning);
- FileStream.Write(MDBOrgHead, SizeOf(MDBOrgHead));
- finally
- FileStream.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- DeleteFile(PChar(sTempFile));
- end;
- except
- DeleteFile(PChar(sTempFile));
- end;
- end;
- var
- sTempFile: string;
- begin
- if not FileExists(ASourceFile) then Exit;
- try
- sTempFile := GetTempFileName;
- CopyFileOrFolder(ASourceFile, sTempFile);
- RemoveHead(sTempFile);
- AutoDecryptFile(sTempFile, AResultFile);
- RecoverFileHead(AResultFile);
- finally
- DeleteFile(PChar(sTempFile));
- end;
- end;
- function FileEncrypted(const AFileName: string): Boolean;
- var
- FileHead: TDrawingFileHead;
- FileStream: TFileStream;
- begin
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- try
- FileStream.ReadBuffer(FileHead, SizeOf(TDrawingFileHead));
- Result := FileHead.ProductName = ProductName;
- finally
- FileStream.Free;
- end;
- end;
- procedure EncryptFile(const AFileName: string);
- var
- fileStream: TFileStream;
- begin
- fileStream := TFileStream.Create(AFileName, fmOpenReadWrite);
- try
- fileStream.Position := 0;
- fileStream.WriteBuffer(WrongHead, SizeOf(WrongHead));
- finally
- fileStream.Free;
- end;
- end;
- procedure DecryptFile(const AFileName: string);
- var
- fileStream: TFileStream;
- begin
- fileStream := TFileStream.Create(AFileName, fmOpenReadWrite);
- try
- fileStream.Position := 0;
- fileStream.WriteBuffer(MDBOrgHead, SizeOf(MDBOrgHead));
- finally
- fileStream.Free;
- end;
- end;
- { TEncryptConnection }
- procedure TEncryptConnection.Encrypt;
- var
- sTempFile, sEncryptFile: string;
- begin
- AppendLog('Save File-E');
- if (FFileName <> '') and FileExists(FFileName) then
- begin
- sTempFile := GetTempFileName;
- sEncryptFile := GetTempFileName;
- CopyFileOrFolder(FFileName, sTempFile);
- try
- AutoEncryptFile(sTempFile, sEncryptFile);
- RefreshFileHead;
- WriteAndAddHead(sEncryptFile);
- if CheckFileValid(sEncryptFile) then
- begin
- AppendLog('Check File-E --> Pass');
- CopyFileOrFolder(sEncryptFile, FOrgFile);
- end
- else
- begin
- AppendLog('Check File-E --> Error');
- Abort;
- end;
- finally
- DeleteFile(PChar(sTempFile));
- DeleteFile(PChar(sEncryptFile));
- end;
- end;
- AppendLog('Save File-E --> End');
- end;
- destructor TEncryptConnection.Destroy;
- begin
- Close;
- if (FFileName <> '') and FileExists(FFileName) then
- DeleteFile(PChar(FFileName));
- inherited;
- end;
- procedure TEncryptConnection.Open(const AFileName: string);
- begin
- Close;
- if (FFileName <> '') and FileExists(FFileName) then
- DeleteFile(PChar(FFileName));
- FFileName := Decrypt(AFileName);
- if FileExists(FFileName) then
- begin
- RecoverFileHead(FFileName);
- InnerOpen(FFileName);
- DamageFileHead(FFileName);
- end
- else
- raise Exception.Create(Format('文件[%s]不存在!', [AFileName]));
- end;
- procedure TEncryptConnection.DamageFileHead(AFileName: string);
- var
- sTempFile: string;
- FileStream: TFileStream;
- begin
- sTempFile := ExtractFilePath(AFileName) + ExtractSimpleFileName(AFileName) + '.tmp';
- CopyFileOrFolder(AFileName, sTempFile);
- try
- if FileExists(sTempFile) then
- begin
- FileStream := TFileStream.Create(sTempFile, fmOpenWrite);
- try
- FileStream.Seek($00, soFromBeginning);
- FileStream.Write(WrongHead, SizeOf(WrongHead));
- finally
- FileStream.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- DeleteFile(PChar(sTempFile));
- end;
- except
- DeleteFile(PChar(sTempFile));
- end;
- end;
- procedure TEncryptConnection.WriteAndAddHead(AFileName: string);
- var
- sTempFile: string;
- FileStream, FileStreamTemp: TFileStream;
- begin
- if FileExists(AFileName) then
- begin
- sTempFile := ExtractFilePath(FFileName) + ExtractSimpleFileName(FFileName) + '.tmp';
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- FileStreamTemp := TFileStream.Create(sTempFile, fmCreate);
- try
- try
- FileStream.Position := 0;
- FileStreamTemp.WriteBuffer(FFileHead, SizeOf(TDrawingFileHead));
- FileStreamTemp.CopyFrom(FileStream, FileStream.Size);
- finally
- FileStream.Free;
- FileStreamTemp.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- DeleteFile(PChar(sTempFile));
- except
- DeleteFile(PChar(sTempFile))
- end;
- end;
- end;
- procedure TEncryptConnection.ReadAndRemoveHead(AFileName: string);
- var
- sTempFile: string;
- FileStream, FileStreamTemp: TFileStream;
- begin
- if FileExists(AFileName) then
- begin
- sTempFile := ExtractFilePath(FFileName) + ExtractSimpleFileName(FFileName) + '.tmp';
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- FileStreamTemp := TFileStream.Create(sTempFile, fmCreate);
- try
- try
- FileStream.Position := 0;
- FileStream.ReadBuffer(FFileHead, SizeOf(TDrawingFileHead));
- FileStreamTemp.CopyFrom(FileStream, FileStream.Size - SizeOf(TDrawingFileHead));
- finally
- FileStream.Free;
- FileStreamTemp.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- DeleteFile(PChar(sTempFile));
- except
- DeleteFile(PChar(sTempFile))
- end;
- end;
- end;
- function TEncryptConnection.Decrypt(const AFileName: string): string;
- var
- sConnectFile, sTempFile: string;
- begin
- FOrgFile := AFileName;
- sConnectFile := GetTempFileName;
- sTempFile := GetTempFileName;
- if FileExists(AFileName) then
- begin
- CopyFileOrFolder(AFileName, sTempFile);
- if CheckFileEncrypt(sTempFile) then
- begin
- ReadAndRemoveHead(sTempFile);
- AutoDecryptFile(sTempFile, sConnectFile);
- end
- else
- begin
- ResetFileHead;
- CopyFileOrFolder(sTempFile, sConnectFile);
- end;
- DecryptFile(sConnectFile);
- DeleteFile(PChar(sTempFile));
- end;
- Result := sConnectFile;
- end;
- function TEncryptConnection.CheckFileEncrypt(AFileName: string): Boolean;
- var
- FileHead: TDrawingFileHead;
- FileStream: TFileStream;
- begin
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- try
- FileStream.ReadBuffer(FileHead, SizeOf(TDrawingFileHead));
- Result := FileHead.ProductName = ProductName;
- finally
- FileStream.Free;
- end;
- end;
- function TEncryptConnection.CheckFileEncrypt: Boolean;
- begin
- Result := FFileHead.ProductName = ProductName;
- end;
- procedure TEncryptConnection.ResetFileHead;
- begin
- if (FFileHead.ProductName <> ProductName) then
- begin
- FFileHead.ProductName := ProductName;
- FFileHead.FileType := 1;
- FFileHead.EncryptVersion := EncryptVersion;
- FFileHead.FileVersion := EmptyFileVersion;
- FFileHead.CreateExeVersion := GetVersion;
- FFileHead.LastestExeVersion := GetVersion;
- FFileHead.MaxExeVersion := GetVersion;
- end;
- end;
- procedure TEncryptConnection.Save;
- begin
- AppendLog('Save File');
- RecoverFileHead(FFileName);
- Encrypt;
- AppendLog('Save File --> End');
- end;
- procedure TEncryptConnection.RefreshFileHead;
- begin
- FFileHead.EncryptVersion := EncryptVersion;
- FFileHead.FileVersion := FileVersion;
- FFileHead.LastestExeVersion := GetVersion;
- end;
- procedure TEncryptConnection.UpdateFileVersion;
- begin
- FFileHead.FileVersion := FileVersion;
- end;
- procedure TEncryptConnection.RecoverFileHead(AFileName: string);
- var
- sTempFile: string;
- FileStream: TFileStream;
- begin
- sTempFile := ExtractFilePath(AFileName) + ExtractSimpleFileName(AFileName) + '.tmp';
- CopyFileOrFolder(AFileName, sTempFile);
- try
- if FileExists(sTempFile) then
- begin
- FileStream := TFileStream.Create(sTempFile, fmOpenWrite);
- try
- FileStream.Seek($00, soFromBeginning);
- FileStream.Write(MDBOrgHead, SizeOf(MDBOrgHead));
- finally
- FileStream.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- DeleteFile(PChar(sTempFile));
- end;
- except
- DeleteFile(PChar(sTempFile));
- end;
- end;
- function TEncryptConnection.GetNeedUpdate: Boolean;
- begin
- Result := CompareCode(FileVersion, FFileHead.FileVersion, '.') > 0;
- end;
- function TEncryptConnection.GetOverExe: Boolean;
- begin
- Result := CompareCode(FileVersion, FFileHead.FileVersion, '.') < 0;
- end;
- procedure TEncryptConnection.SaveDebugFile(const AFileName: string);
- begin
- CopyFileOrFolder(FFileName, AFileName);
- RecoverFileHead(AFileName);
- end;
- function TEncryptConnection.CheckFileValid(
- const AFileName: string): Boolean;
- var
- sConnectFile, sTempFile: string;
- vCon: TADOConnection;
- begin
- AppendLog('Check File-E');
- Result := False;
- try
- sConnectFile := GetTempFileName;
- sTempFile := GetTempFileName;
- vCon := TADOConnection.Create(nil);
- vCon.LoginPrompt := False;
- if FileExists(AFileName) then
- begin
- AppendLog('Check File Exist');
- if CopyFileOrFolder(AFileName, sTempFile) then
- begin
- AppendLog('Copy Check File -- Pass');
- if CheckFileEncrypt(sTempFile) then
- begin
- RemoveHead(sTempFile);
- AutoDecryptFile(sTempFile, sConnectFile);
- end
- else
- sConnectFile := sTempFile;
- RecoverFileHead(sConnectFile);
- AppendLog('prepare to Connect Check File');
- vCon.ConnectionString := Format(SAdoConnectStr, [sConnectFile]);
- AppendLog('Checking File');
- vCon.Open;
- Result := True;
- AppendLog('File Valid');
- end;
- end;
- finally
- if Assigned(vCon) then
- vCon.Free;
- if FileExists(sConnectFile) then
- DeleteFile(PChar(sConnectFile));
- if FileExists(sConnectFile) then
- DeleteFile(PChar(sTempFile));
- end;
- end;
- procedure TEncryptConnection.UnEncryptSave;
- begin
- RecoverFileHead(FFileName);
-
- end;
- function TEncryptConnection.GetFileVersion: string;
- begin
- Result := Trim(FFileHead.FileVersion);
- end;
- procedure TEncryptConnection.RemoveHead(const AFileName: string);
- var
- sTempFile: string;
- FileStream, FileStreamTemp: TFileStream;
- begin
- if FileExists(AFileName) then
- begin
- sTempFile := GetTempFileName;
- FileStream := TFileStream.Create(AFileName, fmOpenRead);
- FileStreamTemp := TFileStream.Create(sTempFile, fmCreate);
- try
- try
- FileStream.Position := SizeOf(TDrawingFileHead);
- FileStreamTemp.CopyFrom(FileStream, FileStream.Size - SizeOf(TDrawingFileHead));
- finally
- FileStream.Free;
- FileStreamTemp.Free;
- end;
- CopyFileOrFolder(sTempFile, AFileName);
- finally
- if FileExists(sTempFile) then
- DeleteFile(PChar(sTempFile));
- end;
- end;
- end;
- { TConnection }
- procedure TConnection.AppendLog(const ALog: string);
- begin
- if SupportManager.ConfigInfo.IsLog then
- MeasureLog.AppendLogTo(ALog);
- end;
- procedure TConnection.Close;
- begin
- Connection.Close;
- end;
- { TCommonConnection }
- constructor TCommonConnection.Create;
- begin
- FConnection := TADOConnection.Create(nil);
- FConnection.LoginPrompt := False;
- end;
- destructor TCommonConnection.Destroy;
- begin
- Close;
- FConnection.Free;
- inherited;
- end;
- function TCommonConnection.GetConnection: TADOConnection;
- begin
- Result := FConnection;
- end;
- function TCommonConnection.HasOpened: Boolean;
- begin
- Result := FConnection.Connected;
- end;
- procedure TCommonConnection.Open(const AFileName: string);
- begin
- Close;
- if FileExists(AFileName) then
- begin
- //DecryptFile(AFileName);
- InnerOpen(AFileName);
- end
- else
- raise Exception.Create(Format('文件[%s]不存在!', [AFileName]));
- end;
- procedure TCommonConnection.InnerOpen(const AFileName: string);
- begin
- FFileName := AFileName;
- CompactDatabase(FFileName);
- FConnection.ConnectionString := Format(SAdoConnectStr, [FFileName]);
- FConnection.Open;
- end;
- procedure TCommonConnection.Save;
- begin
- inherited;
- end;
- end.
|