Browse Source

debug: 某些用户导出浙江电子招投标没反应
原因是该用户的临时文件路径有空格,传递参数给ZJ_Encrypt.exe时参数被截断了。

JimiZhang 3 weeks atrás
parent
commit
2c218201b2

+ 2 - 2
MainUI/ProjectManage/ScBigProjManageView.dfm

@@ -295,7 +295,7 @@ object ScfrmBigProjManage: TScfrmBigProjManage
             Width = 145
             Height = 20
             ImeName = #20013#25991' - QQ'#25340#38899#36755#20837#27861
-            ItemHeight = 12
+            ItemHeight = 0
             TabOrder = 2
             Visible = False
           end
@@ -305,7 +305,7 @@ object ScfrmBigProjManage: TScfrmBigProjManage
             Width = 145
             Height = 20
             ImeName = #20013#25991' - QQ'#25340#38899#36755#20837#27861
-            ItemHeight = 12
+            ItemHeight = 0
             TabOrder = 3
             Visible = False
           end

+ 1 - 1
MainUI/ProjectManage/ScBigProjManageView.pas

@@ -2598,7 +2598,7 @@ begin
     // ÑéÖ¤´ò°ü
     strEncryptExe := AppPath + 'ZJEncrypt\ZJ_Encrypt.exe';
     if FileExists(strEncryptExe) and FileExists(sZipFile) then
-      ShellExecute(0, 'open', PChar(strEncryptExe), PChar(sZipFile), PChar(AppPath), SW_HIDE);
+      ShellExecute(0, 'open', PChar('"' + strEncryptExe + '"'), PChar('"' + sZipFile + '"'), PChar('"' + AppPath + '"'), SW_HIDE);
   finally
     EndExportPDF_ZheJiang;
     vTenderList.Free;

+ 39 - 0
Utils/ZJ_Encrypt/D7Test/TestZJEncrypt.cfg

@@ -0,0 +1,39 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-N"D:\Code\DelphiTemp"
+-LE"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-LN"c:\program files (x86)\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST

File diff suppressed because it is too large
+ 136 - 0
Utils/ZJ_Encrypt/D7Test/TestZJEncrypt.dof


+ 13 - 0
Utils/ZJ_Encrypt/D7Test/TestZJEncrypt.dpr

@@ -0,0 +1,13 @@
+program TestZJEncrypt;
+
+uses
+  Forms,
+  Unit1 in 'Unit1.pas' {Form1};
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.CreateForm(TForm1, Form1);
+  Application.Run;
+end.

BIN
Utils/ZJ_Encrypt/D7Test/TestZJEncrypt.exe


BIN
Utils/ZJ_Encrypt/D7Test/TestZJEncrypt.res


+ 39 - 0
Utils/ZJ_Encrypt/D7Test/Unit1.dfm

@@ -0,0 +1,39 @@
+object Form1: TForm1
+  Left = 290
+  Top = 130
+  Width = 456
+  Height = 166
+  Caption = #23558#26412#25991#20214#25918#33267'ZJ_Encrypt.exe'#30456#21516#30446#24405#36816#34892
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  OldCreateOrder = False
+  PixelsPerInch = 96
+  TextHeight = 11
+  object lblParam: TLabel
+    Left = 24
+    Top = 8
+    Width = 30
+    Height = 11
+    Caption = 'Param'
+  end
+  object btnExecute: TButton
+    Left = 80
+    Top = 64
+    Width = 257
+    Height = 25
+    Caption = 'Execute ZJ_Encrypt.exe'
+    TabOrder = 0
+    OnClick = btnExecuteClick
+  end
+  object edtParam: TEdit
+    Left = 24
+    Top = 32
+    Width = 361
+    Height = 19
+    TabOrder = 1
+  end
+end

+ 37 - 0
Utils/ZJ_Encrypt/D7Test/Unit1.pas

@@ -0,0 +1,37 @@
+unit Unit1;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+  Dialogs, StdCtrls, ShellAPI;
+
+type
+  TForm1 = class(TForm)
+    btnExecute: TButton;
+    edtParam: TEdit;
+    lblParam: TLabel;
+    procedure btnExecuteClick(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  Form1: TForm1;
+
+implementation
+
+{$R *.dfm}
+
+procedure TForm1.btnExecuteClick(Sender: TObject);
+var
+  strEncryptExe: string;
+begin
+  strEncryptExe := ExtractFilePath(Application.ExeName) + 'ZJ_Encrypt.exe';
+  if FileExists(strEncryptExe) then
+    ShellExecute(0, 'open', PChar('"' + strEncryptExe + '"'), PChar('"' + edtParam.Text + '"'), '', SW_HIDE);
+end;
+
+end.

+ 181 - 0
Utils/ZJ_Encrypt/HandleUnit.pas

@@ -0,0 +1,181 @@
+unit HandleUnit;
+
+interface
+
+uses Vcl.Forms, System.SysUtils, System.Variants, System.Classes, System.Zip,
+      IdHashMessageDigest, IdGlobal, IdHash,
+      Xml.XMLDoc, Xml.XMLIntf;
+
+procedure startExtract(fileName: String; Application: TApplication);
+function getMD5(pdfFile: TStream): String;
+function getVerificationCode(fullFile: PAnsiChar; exePath: String): String;
+procedure iniXmlZTB(fullFileName: String; Application: TApplication);
+procedure handleXmlZTB(xmlFile: String; newVerifyStr: String; Application: TApplication);
+
+implementation
+
+uses
+  MainUnit;
+
+// 备注: 低版本的PChar类型是指PAnsiChar,在Delphi12中,PChar指PWideChar,所以需要明确指定PAnsiChar类型  (对应 DLL 的 char* 定义)
+function generateDynamicCode(licPath: PAnsiChar; sk: PAnsiChar; xmlPath: PAnsiChar; buf: PPAnsiChar; size: PNativeUInt):Integer;stdcall;
+ external 'license-validator.dll';
+
+
+procedure startExtract(fileName: String; Application: TApplication);
+var
+  zipFile: TZipFile;
+  fileStream: TStream;
+  fileHeader: TZipHeader;
+  md5Str, verifyStr: String;
+  innerFileName, innerXmlFileName, fileExt, pcharStr, strPath: String;
+  i, xmlFileIdx : integer;
+  hasXml, hasPdf, dirCreated: boolean;
+begin
+  //AddLog('startExtract');
+  if zipFile.IsValid(fileName) then
+  begin
+    zipFile := TZipFile.Create;
+    try
+      zipFile.Open(fileName, zmReadWrite);
+      //AddLog(Format('zipFile.FileCount: %d.', [zipFile.FileCount]));
+      if Length(zipFile.FileNames) = 2 then
+      begin
+        hasXml := False;
+        hasPdf := False;
+        xmlFileIdx := 0;
+        strPath := ExtractFilePath(Application.ExeName); // 备注:不能用当前目录的方式,必须得绝对目录,不同环境调用有可能不认 ./ 这种方式
+        //AddLog('Begin extract files.');
+        for i := 0 to 1 do
+        begin
+          innerFileName := zipFile.FileName[i];
+          fileExt := ExtractFileExt(innerFileName);
+          fileExt := AnsiLowerCase(fileExt);
+          if fileExt = '.xml' then
+          begin
+            xmlFileIdx := i;
+            innerXmlFileName := innerFileName;
+            if not DirectoryExists(strPath + 'Temp') then
+            begin
+              dirCreated := CreateDir(strPath + 'Temp');
+            end;
+            zipFile.Extract(innerFileName, strPath + 'Temp/', False);
+            // 初始化XML,防止已有校验码数据导致后续给的动态码不一致,而且更重要的是考虑到Delphi读写XML可能与别的软件会有差别,所以在这里先保存一次文件,抹平这种差别
+            iniXmlZTB(strPath + 'Temp/' + innerFileName, Application);
+            pcharStr := strPath + 'Temp/' + innerFileName;
+            verifyStr := getVerificationCode(PAnsiChar(AnsiString(pcharStr)), strPath); // 这里string不能直接转PAnsiChar,需要先过一道AnsiString再转
+            hasXml := True;
+          end else
+          begin
+            // .pdf
+            zipFile.Read(i, fileStream, fileHeader, False);
+            md5Str := getMD5(fileStream);
+            md5Str := AnsiLowerCase(md5Str);
+            hasPdf := True;
+          end;
+          //AddLog(Format('Extract file: %s.', [innerFileName]));
+        end;
+        //AddLog('End extract files.');
+        if hasXml and hasPdf then
+        begin
+          //AddLog('Zip files.');
+          handleXmlZTB(strPath + 'Temp/' + innerXmlFileName, verifyStr + '@' + md5Str, Application);
+          zipFile.Delete(xmlFileIdx);
+          zipFile.Add(strPath + 'Temp/' + innerXmlFileName, innerXmlFileName, zcDeflate);
+        end else
+        begin
+          Application.MessageBox(PChar('无效文件:' + fileName), '', 0);
+        end;
+
+        zipFile.Close;
+      end;
+    finally
+      zipFile.Free;
+    end;
+  end else
+  begin
+    Application.MessageBox(PChar('无效文件:' + fileName), '', 0);
+  end;
+end;
+
+function getMD5(pdfFile: TStream): String;
+var
+  MyMD5: TIdHashMessageDigest5;
+  Digest: T4x4LongWordRecord;
+  ByteDigest: String;
+begin
+  MyMD5 := TIdHashMessageDigest5.Create;
+  ByteDigest := MyMD5.HashStreamAsHex(pdfFile);
+  Result := ByteDigest;
+end;
+
+function getVerificationCode(fullFile: PAnsiChar; exePath: String): String;
+var licPath, sk, xmlPath: PAnsiChar;
+    buf: PAnsiChar;
+    tmpSize: NativeUInt;
+    size: NativeUInt;
+    rst: Integer;
+    str: PAnsiChar;
+begin
+  //  licPath := PAnsiChar(AnsiString(exePath + 'license.lic')); // license文件与exe文件在同一目录下
+  //  sk := 'BFwXdiTMnfL81aWj8dQw7Cqw0IVGOL+fd9P+d0/NSBkDhs921Oa+TrCqgWfnITXbO87PgzwTDuK2slLgzF3MmXXT7j/xz2qI7uQUW4j3seaKqgh6czF7UnnTVnbzpzVTEJ+leLaQhVCRDHzl/J2RTRg=';
+  // 生产环境与测试环境不一样,上面的是测试的,下面定义的是生产环境的
+  licPath := PAnsiChar(AnsiString(exePath + 'license_info.lic'));
+  sk := 'BCk7qnC7T8tayh8UNVtVtvsBBy+qbOtIHoeGNR/8ZPVn03ehucjHQGmUaRfwky9fA2whd2bMcv7nIG2gAAg0zZG7nbyJdrvSVEI5Pgk/0o3oYBmgkkmhXwsN36pxIDekPSIh000g2/Hubs3sCP19w5w=';
+  str := '';
+  buf := str;
+  tmpSize := 0;
+  size := tmpSize;
+  rst := generateDynamicCode(licPath, sk, fullFile, @buf, @size);
+  case rst of
+      0: begin
+           Result := buf;
+         end;
+    1001: begin
+            Result := 'license无效';
+          end;
+    1002: begin
+            Result := 'license校验失败';
+          end;
+    1003: begin
+            Result := 'license已过期';
+          end;
+    1004: begin
+            Result := '文件未找到';
+          end;
+    1005: begin
+            Result := 'license解密失败';
+          end;
+    1006: begin
+            Result := 'ak无效';
+          end;
+    9999: begin
+            Result := '其他错误';
+          end;
+  end;
+end;
+
+procedure iniXmlZTB(fullFileName: String; Application: TApplication);
+begin
+  handleXmlZTB(fullFileName, '', Application);
+end;
+
+procedure handleXmlZTB(xmlFile: String; newVerifyStr: String; Application: TApplication);
+var
+  L_FXMLDoc : TXMLDocument;
+  xml_Node : IXMLNode;
+begin
+  L_FXMLDoc := TXMLDocument.Create(Application);
+  try
+    L_FXMLDoc.Options:=L_FXMLDoc.Options - [doAttrNull];
+    L_FXMLDoc.LoadFromFile(xmlFile);
+    L_FXMLDoc.Active := true;
+    xml_Node := L_FXMLDoc.DocumentElement.ChildNodes['工程信息'];
+    xml_Node.Attributes['软件校验码'] := newVerifyStr;
+    L_FXMLDoc.SaveToFile(xmlFile);
+  finally
+    L_FXMLDoc.Free;
+  end;
+end;
+
+end.

+ 252 - 0
Utils/ZJ_Encrypt/MainUnit.dfm

@@ -0,0 +1,252 @@
+object MainForm: TMainForm
+  Left = 0
+  Top = 0
+  BorderStyle = bsDialog
+  Caption = #27993#27743#25307#25237#26631#25991#20214#26657#39564#30721#26381#21153#19968#26465#40857
+  ClientHeight = 134
+  ClientWidth = 624
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = 'Segoe UI'
+  Font.Style = []
+  Icon.Data = {
+    0000010003002020000001000800A8080000360000001818000001000800C806
+    0000DE080000101000000100080068050000A60F000028000000200000004000
+    0000010008000000000000040000000000000000000000010000000100000000
+    0000317B1F0000792F00007D3500007F3800AD6E0000AE700000B0700000BE73
+    0000B47A0800B57C0900B57D0D00BB7D0C00BD7F0E00CB7F0F00D47C0600D87F
+    0C000080370000803A0000823D0047853000418434004C843100008542000088
+    4300008A460000894A00038C4B0000894C00018E4D000E8D4F00008D51000390
+    5200009657000F92560000955800009F59001091520010945600009F60000B9C
+    6600149B64001D99610039996E003D996E003F9C700000A0600000A66D0000A2
+    720000A7750000A2780000A57E0000AB780000A87D0000AE7F0000B1780000B7
+    7F0000BE7A0025A476002AA7760040986F0041987100429D720048A1650049A3
+    6A004CA268004CAA7D004FAE7D0050AA790051A97F0052AE7D00BA872100B887
+    2400BA882300BC892500CF800E00C5831600CB831400C9841600CE851800DD84
+    1400D1851800C4882500C7A25800C8A25900CAA55B00CFAA600000AB810000B1
+    810000B9800000BE840000B3980000B69C0000BF9A0000BC9E005DA4830042B0
+    830045B0840053BD97005EBA99005CBD99006CA48B006DB4850070B78A0060BA
+    99007FBC910000C7860000C7880000C38F0000C1960000C5970000C39B0000C6
+    980000C09D0000C59C0000C89A0000CD990000CA9D0000CE9C0000D0990000D4
+    990000D09E0000D49D0000DD9B0000D89E002BC3910000CEA30001CFA4000FCD
+    A40011CCA30010CDA4001DCFA70000D2A10000D6A1000CD3A20000DEA3000DDE
+    A20019D2A70024D2AB0038CBB4002DD0B00000E4A00000E1A8000EE9AA0030E0
+    B10030E4B10040C19D005AC1A20058D6C00055DDC10056DAC40061DDC60070DF
+    C90050E0C5004AE9D1004DE8D10063E6CD006FE7CB0070E1CE0074E2CE0072E0
+    D50096BA8900B6C69900A5CBAB00A5CDAE00C3D9BF00E5D5AE00E6D6B100E8D6
+    B000EED7B100E9D7B400E7D8B300E7D9B400E8D8B200EDD8B200E8D9B500EEDA
+    B700E9DBB900EADDBB00EBDBBC00EADDBD00F5DBB700FCDCB700F6DDBB00F1DC
+    BD00FADEBB00FFDEBA00FDDEBC008AD5C300A5D8C30080E4D50084E8D2008FE6
+    DA008EE8DA0090E5D30093E7D70090E8D50090E8DA0096EBDD00A3E7E000A0E8
+    E500A9EDED00B0ECE700B4F1EF00BFF2F200C4DCC600D3DDC500ECDFC200ECE0
+    C100EDE1C500EEE3C800EFE4CA00F0E3C700FFE2C000F0E4CA00F0E5CD00F5E6
+    CE00F1E8D100F5E8D000F2EAD500F7EAD500FEE9D200FEEAD400FFECD600F3EC
+    DA00F4ECD900F4EEDD00FFEDD900FEEFDE00FFF0DE00CCECE200F5EFE000F5F1
+    E300F6F1E500F9F0E200F9F1E500FEF2E500FDF4E600F9F4EA00FEF5E900FBF6
+    EC00FEF7ED00FFF8ED00FBF8F000FEF9F200FFFAF400FFFCF500FEFDF900FFFF
+    FE00000000000000000000000000000000000000000000000000FFFFFF000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000000000002B1F00000000000000000000000000000000
+    000000000000000000000000003D6B1F00000000000000000000000000000000
+    480B0B0B0B0B0B0B0B0B0C0E155A8E1A50514F4F4F4E4C520000000000000000
+    0BFFFFFFFFFFFFFFFFFFFF63388585171A1A1A1A1A3ABC4E0000000000000000
+    0BFFA6A7A7A7A7A7ADB53F387979797985858585856B2F1A6500000000000000
+    0BFFA7A7ADADADADADB9049979737381818081817979796E232B000000000000
+    0BFFA7ADADADADADADB740349F6E989F9F9F9F9F9F978C7373215F0000000000
+    0BFFA7ABADADADADADADB94031C5C104120412042892C0945D731A0000000000
+    0BFFA6A6A6A6A6A6A6A8ADB63F31CB12D5B9A8A2A1183BCA8B5D573D00000000
+    0BFFF3F3F3F3F3F3F3F3F3F3FF463211FFF3F3F3FFF31A93C75B5B1800000000
+    0BFFEEEEEEEEEEEEF3FFFFFFFFFF4302F3EEEEEEEEF3BD29CCC8C91800000000
+    0BFFE9E9E9E9EEE92604040404CDF3F3EEEBEBEEF2F3E6121718182200000000
+    0BFFE9E9E9E9EBEB048F8D8D24A4F2EBEBE9EBF20243FF0F0000000000000000
+    0BFFE7E7E7E7EBEE0491887B6A1EEBEEEBEBEBF2043968100000000000000000
+    0BFFE2E2E2E2E2EB467D91797B2E1EA4A5F2F2F312875A160000000000000000
+    0BFFE2E2E2E2E2E4CE219D8679795A27170404121285855A3C00000000000000
+    0BFFE1E1E1E1E1E2E56760BF8979797979797979797979795A2D000000000000
+    0BFFE1E1E1E1E1E1E1E44660C4958A837E7E7E7E7E7373799C18000000000000
+    0BFFE1E1E1E1E1E1E1E1E4692A62C2C59A9A9A9A9AC26E975843000000000000
+    0BFFD7D7D7D7D7D7D7D7E1DED76626040404040404BE95344600000000000000
+    0BFFD2D2D2D2D2D2D2D2D7D7D7DEDEDEDEDEDEE512A034150000000000000000
+    0BFFD1D1D2D2D2D2D2D2D2D2D2D7D4EBFFFFFFFF1232634B0000000000000000
+    0BFFD1D1D1D1D1D1D1D1D1D1D1D1CFFF560607081201FF0C0000000000000000
+    0BFFD0D1D1D1D1D1D1D1D1D1D1D1D0FF06FFFFEEE4FFB74A0000000000000000
+    0BFFD0D0D0D0D0D0D0D0D0D0D0D0D0FF06FFE2D7FFAD4A000000000000000000
+    0BFFD0D0D0D0D0D0D0D0D0D0D0D0D0FF06EED7FFA84800000000000000000000
+    0BFFABADADADADADADADADADADADABFF06E2FFA8480000000000000000000000
+    0BFFA7A7ADADADADADADADADADA7A7FF06FFAD54000000000000000000000000
+    0BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD05300000000000000000000000000
+    540B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B54000000000000000000000000FFFF
+    FFFFFFFFFFFFFFFF3FFFFFFE3FFFC000003FC000003FC000001FC000000FC000
+    0007C0000007C0000003C0000003C0000003C0000003C000003FC000003FC000
+    003FC000001FC000000FC000000FC000000FC000001FC000003FC000003FC000
+    003FC000003FC000007FC00000FFC00001FFC00003FFC00007FFC0000FFF2800
+    0000180000003000000001000800000000004002000000000000000000000001
+    0000000100000000000052863500708F3C00019F59001C9A5E003F985A001D9F
+    69001F996D003F9B610007A8650000A86B0001A86C000EAA690000B06B000EA4
+    710001AC730000A9750000AD76000BAD730015A77D0001B076000EB5770000B7
+    7A000CB77A000DB27F0026A36B0026A56B0024A26E002CA6720021A87E005B9C
+    5A0062855400509676005A997800738F6900678F7100608B780055A670005FAA
+    73005DAF7C004DB07D0070A971007FAF7A0064B17D009A8625009F8524009E8A
+    2B00B9933800C6933D00C3973F0086974E00A5967700AD947400A3977A00A798
+    7900AA987B00A89B7F00C3954100C5994300C69B4600C69C4600C89C4600C69C
+    4800CDA96000CEB67A00D3B77C00D6B67F0004A9820000BF8E0011B2800017BC
+    8B0006BF9F0029B78E0034B683002BBD970035BE95003FBC970022BFA8006E9D
+    89007D9E8E007E9E90005FAF80004FB0820057B78D004FB690006AA0870065B4
+    86006CB88B007FB384007FB5870078B98F007DA8940062BA91006BBC99007EB9
+    91007FBC93007FBC94007FBE990001C28B0001C5880000CE8B0000C88F0001C7
+    910001C893000BC59F0001C89A0000CE9A0006CC9F001DCB900003D09B0001D4
+    9B0000CEA1000ACEA2000CCDA2001DCEA60007DFA00019D0A60022CAA70030CD
+    AB0039CEAA0025D2AB002AD7AC0039D2B50030DEB0005FC2A40054C9A80053CE
+    AE0056CCAD005AC9AD0054D0AB004FD2BD004CDBBB0059D4B90066CDB20070CF
+    B20063D0B00078D1B9007DD1BF006EDBC3007BD5C40079E0CB0085BB8E009BB8
+    8800B2A78700D7BE8C0086C19B0087C29D0089C0A70086C9A80086CBAE009FCA
+    A8009DCCAE00B3D4B700B7D4B800BED7BD00C4D4B300C6D8BC00E2CDA300E4D0
+    AA00E0D4AD00E5D6AF00E6D6B100E9D7B300E7D8B400E8D8B300E8D8B500E9DB
+    BA00E9DABE00EADDBC00F1DBB900F4DCB800BFDAC000BFDEC800C0DEC800EBDE
+    C000ECDDC100EDDFC600C8E0CB00DFEBDB00ECE0C200ECE0C400E5E3C900E2E3
+    CC00EEE3C800EEE4CA00EFE4CC00F2E4CA00F1E6CE00F5E6CE00E7EDDE00E8EC
+    DC00F0E6D000F2E7D400F4E8D200F2E9D500F6EBD700F3EBD800F4ECD900F3ED
+    DC00F5EDDC00F8ECDA00F8EFDF00F5EFE000E4F0E500F6F0E100F6F1E400F9F0
+    E200FAF2E500FDF3E600FDF4E700F7F4E900FEF3E800F9F4E900FCF4E800FBF6
+    EC00FCF6EC00FEF8EF00FEFAF100FEF9F4000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000FFFFFF000000000000000000000000000000000000000000000000000000
+    0000000000000000000050000000000000000000000000000000000000000000
+    004F1224000000000000000000000038313C3C3C3C3C3D3C021765012D2D2D2E
+    2F38000000000033AFC4C4C4C4C4C894466A670F0F0F0F172822000000000033
+    AFA1A1A1A1A4AA04726A6A7171716A6A440E200000000033AFA1A4A4A4A4AA27
+    4B768A7D7D7D7D847A680F5500000033AFA0A1A1A1A1A2A02B4C88052A29251C
+    8582470700000033AFCACACACACACECEBD5C1D5FD3CCBEB11B8B4D434F000033
+    AFD3D2D2D3B2ADACACCB5796D3D3D3D99454887C5B000033AFCCCCCCCE5F090D
+    0392D8D3CCCE9A969C1F930000000033AFCACACACE5F6C73651BD3CECECE5F0C
+    8E34000000000033AFC4C4C4C899497B6E161B9298AB51631523000000000033
+    AFC4C4C4C4C45681796E63140B0B0B666A454E0000000033AFC4C4C4C4C4B652
+    878374716F6F6F6A6A78070000000033AFBBBBBFBFBFC4B65A53867D7777778C
+    754A5D0000000033AFB8B8B8B8B8B8BBBB9B8D58585808804821000000000033
+    AFB7B8B8B8B8B8B8B8BBBBD3D9D961132635000000000033AFB7B7B7B7B7B7B7
+    B7B7BF9D3931321EA48F000000000033AFA8A8AFAFAFAFAFAFA8B842A8D3CEC4
+    4000000000000033AFA8A8A8A8A8A8A8A8A8B842A1C4C43F0000000000000033
+    AFA3A4A4A4A4A4A4A4A4B742A0BF42000000000000000036AFC4C4C4C4C4C4C4
+    C4C4CCA8AF90000000000000000000003E3C3C3C3C3C3C3C3C3C3C3C3F000000
+    000000000000FFFFFF00FFF7FF00FFE3FF0080000F0080000F00800007008000
+    03008000030080000100800001008000070080000F0080000F00800007008000
+    07008000070080000F0080000F0080000F0080001F0080003F0080007F008000
+    FF00C001FF002800000010000000200000000100080000000000000100000000
+    000000000000000100000001000000000000678732006B8630006E8D3B001398
+    57000F9D650000AD6F0011A073001CA2720000B176000FB1710000B07B0011B3
+    75002DA473002DA5750026AC76002CAD770026AE7D002CB077005C9A55005E98
+    7E00B7984300B8AD6C00C8A04F00CAA15700CCA65900C2AD6A00D3B17600D4B4
+    7900D9B6790000B68A0025B3830027B3840038B0830038B184004DB78D0054B6
+    88004DB8930057BA970057BC940064B3810070B589007DA4920061B8910066BB
+    930073BB92007FBD95007FBD980000C78D0000CA9A0000CB9C0000CC9D0004CC
+    9D0003E09F0000CFA00007CFA20008CFA20010CFA2002DCAA8002ADBAD0036C8
+    B2003FD8B50047C6A50041CCAC0057CCAC005BC9A90045D3B90076C2A2008BBA
+    8C00D7BA8000D9BC8300D9BD840083C29E0093C7A400A5CEAD00B0D5BC00E1CB
+    9E00E2CDA400E6D6B100E7D8B300E8D8B400EDDAB700EADCBB00EADDBD00F0DA
+    B600DCDFC300D9E0C700ECE0C200EEE3C800E8E4CC00F0E6CE00F4E5CC00F1E7
+    D000F2EAD500F9E9D400F3EBD800F4EDDB00F4EDDD00FFEEDB00F9EFDF00F5F0
+    E100F9F1E300FBF2E600F7F3E800FAF4E900FEF4E900FDF6EC00FEF9F0000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    0000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000FFFFFF00000000000000000000000000000000000000
+    0000000000000500000000000000001747474747160C09020103150000000047
+    4E4E4E540F32323738320B14000000474E505050283F4122223E421E2A000047
+    5A5C5C5C5E2C0E62594A253C07000047676768482F4B4968686B2C260E000047
+    6464660A3512686668041A0000000047606062243B3010292E060C0000000047
+    5D5D5D56263D393737323211000000475A5A5A5C552D231F1F403A4300000047
+    59595959595A5E68680813000000004757575757575760181D441D0000000047
+    525252525252601C604C0000000000474F5050505050601B4D00000000000019
+    4747474747474745000000000000FFFF0000FF7F000080070000800300008001
+    0000800100008001000080070000800700008003000080030000800700008007
+    0000800F0000801F0000803F0000}
+  Position = poScreenCenter
+  TextHeight = 15
+  object SpeedButton1: TSpeedButton
+    Left = 588
+    Top = 46
+    Width = 23
+    Height = 22
+    Caption = '...'
+    OnClick = SpeedButton1Click
+  end
+  object OKBtn: TBitBtn
+    Left = 16
+    Top = 94
+    Width = 75
+    Height = 25
+    Caption = #24320#22987
+    Font.Charset = ANSI_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = #26032#23435#20307
+    Font.Style = []
+    ParentFont = False
+    TabOrder = 0
+    OnClick = OKBtnClick
+  end
+  object BtnEdtFile: TButtonedEdit
+    Left = 16
+    Top = 46
+    Width = 569
+    Height = 23
+    ReadOnly = True
+    TabOrder = 1
+    OnClick = BtnEdtFileClick
+  end
+  object ExitBtn: TBitBtn
+    Left = 104
+    Top = 94
+    Width = 75
+    Height = 25
+    Caption = #36864#20986
+    Font.Charset = ANSI_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = #26032#23435#20307
+    Font.Style = []
+    ParentFont = False
+    TabOrder = 2
+    OnClick = ExitBtnClick
+  end
+  object StaticText1: TStaticText
+    Left = 19
+    Top = 19
+    Width = 130
+    Height = 17
+    Caption = #35831#36873#25321#25307#25237#26631#25991#20214#65306
+    Font.Charset = ANSI_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -13
+    Font.Name = #26032#23435#20307
+    Font.Style = []
+    ParentFont = False
+    TabOrder = 3
+  end
+  object OpenZipDialog: TOpenDialog
+    Filter = '*.tbjtgcl *.zbjtgcl|*.tbjtgcl;*.zbjtgcl|*.zip|*.zip'
+    Left = 552
+    Top = 78
+  end
+end

+ 93 - 0
Utils/ZJ_Encrypt/MainUnit.pas

@@ -0,0 +1,93 @@
+unit MainUnit;
+
+interface
+
+uses
+  System.SysUtils, System.Variants, System.Classes, Vcl.Forms, Vcl.Buttons,
+  Vcl.Controls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Dialogs,
+  HandleUnit;
+
+type
+  TMainForm = class(TForm)
+    OKBtn: TBitBtn;
+    OpenZipDialog: TOpenDialog;
+    BtnEdtFile: TButtonedEdit;
+    SpeedButton1: TSpeedButton;
+    ExitBtn: TBitBtn;
+    StaticText1: TStaticText;
+    procedure OKBtnClick(Sender: TObject);
+    procedure SpeedButton1Click(Sender: TObject);
+    procedure ExitBtnClick(Sender: TObject);
+    procedure BtnEdtFileClick(Sender: TObject);
+  private
+    { Private declarations }
+  public
+    { Public declarations }
+  end;
+
+var
+  MainForm: TMainForm;
+
+procedure AddLog(AString: string);
+procedure SaveLog;
+
+implementation
+
+var
+  g_Log: TStringList = nil;
+  g_LogFile: string;
+
+procedure AddLog(AString: string);
+begin
+  if g_Log = nil then
+  begin
+    g_Log := TStringList.Create;
+    g_LogFile := ExtractFilePath(Application.ExeName) + 'ZJ_Encrypt.log';
+  end;
+  g_Log.Add(AString);
+  g_Log.SaveToFile(g_LogFile);
+end;
+
+procedure SaveLog;
+begin
+  g_Log.SaveToFile(g_LogFile);
+  g_Log.Free;
+end;
+
+{$R *.dfm}
+
+procedure TMainForm.OKBtnClick(Sender: TObject);
+begin
+  if BtnEdtFile.Text <> emptyStr then
+  begin
+    startExtract(BtnEdtFile.Text, Application);
+    Application.MessageBox('УÑé³É¹¦£¡', '', 0);
+  end;
+end;
+
+procedure TMainForm.SpeedButton1Click(Sender: TObject);
+begin
+  if OpenZipDialog.Execute() then
+  begin
+    BtnEdtFile.Text := OpenZipDialog.FileName;
+  end;
+end;
+
+procedure TMainForm.BtnEdtFileClick(Sender: TObject);
+begin
+  if OpenZipDialog.Execute() then
+  begin
+    BtnEdtFile.Text := OpenZipDialog.FileName;
+  end;
+end;
+
+procedure TMainForm.ExitBtnClick(Sender: TObject);
+var
+  verifyStr: String;
+begin
+  Self.Close();
+//  verifyStr := getVerificationCode('D:/Temp/Õã½­Áªµ÷/jt-1770627144.xml');
+//  Application.MessageBox(PChar(verifyStr), '', 0);
+end;
+
+end.

+ 33 - 0
Utils/ZJ_Encrypt/ZJ_Encrypt.dpr

@@ -0,0 +1,33 @@
+program ZJ_Encrypt;
+
+uses
+  Vcl.Forms, System.SysUtils, Vcl.Dialogs,
+  MainUnit in 'MainUnit.pas' {MainForm},
+  HandleUnit in 'HandleUnit.pas';
+
+{$R *.res}
+
+var paramIdx: integer;
+   tmpParamStr: string;
+begin
+  //AddLog('Start application.');
+  Application.Initialize;
+  //AddLog('Initialized.');
+  tmpParamStr := IntToStr(ParamCount);
+  AddLog(Format('ParamCount: %d; ParamStr1: ''%s''.', [ParamCount, ParamStr(1)]));
+  if ParamCount = 1 then
+  begin
+    startExtract(ParamStr(1), Application);
+  end
+  else if ParamCount > 1 then
+  begin
+    ShowMessage('ParamStr error.');
+  end
+  else
+  begin
+    Application.MainFormOnTaskbar := True;
+    Application.CreateForm(TMainForm, MainForm);
+    Application.Run;
+  end;
+  SaveLog;
+end.

File diff suppressed because it is too large
+ 1128 - 0
Utils/ZJ_Encrypt/ZJ_Encrypt.dproj


+ 11 - 0
Utils/ZJ_Encrypt/ZJ_Encrypt.dproj.local

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject>
+	<Transactions>
+    <Transaction>2026/02/06 16:09:45.000.175,=D:\GitHome\Unit1.pas</Transaction>
+    <Transaction>2026/02/06 16:30:50.000.789,D:\GitHome\Unit1.dfm=D:\GitHome\zhejiang_hangzhou_dll\D12\MainUnit.dfm</Transaction>
+    <Transaction>2026/02/06 16:30:50.000.789,D:\GitHome\Unit1.pas=D:\GitHome\zhejiang_hangzhou_dll\D12\MainUnit.pas</Transaction>
+    <Transaction>2026/02/06 16:31:17.000.677,D:\GitHome\Project1.dproj=D:\GitHome\zhejiang_hangzhou_dll\D12\ZJ_Encrypt.dproj</Transaction>
+    <Transaction>2026/02/08 17:23:38.000.583,=D:\GitHome\zhejiang_hangzhou_dll\D12\Unit1.pas</Transaction>
+    <Transaction>2026/02/08 17:23:58.000.312,D:\GitHome\zhejiang_hangzhou_dll\D12\Unit1.pas=D:\GitHome\zhejiang_hangzhou_dll\D12\HandleUnit.pas</Transaction>
+  </Transactions>
+</BorlandProject>

BIN
Utils/ZJ_Encrypt/ZJ_Encrypt.identcache


BIN
Utils/ZJ_Encrypt/ZJ_Encrypt.res


BIN
Utils/ZJ_Encrypt/ZJ_Encrypt_Icon.ico


BIN
Utils/ZJ_Encrypt/refresh.ico


+ 11 - 0
Utils/ZJ_Encrypt/release.optset

@@ -0,0 +1,11 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup/>
+    <ProjectExtensions>
+        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
+        <Borland.ProjectType>OptionSet</Borland.ProjectType>
+        <BorlandProject>
+            <Delphi.Personality/>
+        </BorlandProject>
+        <ProjectFileVersion>12</ProjectFileVersion>
+    </ProjectExtensions>
+</Project>

+ 0 - 0
Utils/ZJ_Encrypt/本工具为64位程序.txt