FileVer.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. unit FileVer;
  2. interface
  3. Uses Windows, SysUtils, Classes, Dialogs, Controls, FileCtrl;
  4. function GetFileVerLang(FileName :String; var Lang :String) :String;
  5. // Return : -1 Version1 < Version2
  6. // 0 Version1 = Version2
  7. // +1 Version1 > Version2
  8. function CompareVer(Version1, Version2 :String) :Integer;
  9. function InstallFile(FilesList :TStringList;
  10. SourceDir, DestDir, SourceFile :String) :Boolean;
  11. implementation
  12. Type
  13. TL_DWord =packed record
  14. Hi :Word;
  15. Lo :Word;
  16. end;
  17. PL_DWord =^TL_DWord;
  18. function GetFileVerLang(FileName :String; var Lang :String) :String;
  19. Var
  20. viResult :DWord;
  21. verSize :Integer;
  22. verBuff,
  23. verResult :Pointer;
  24. verLang :PL_DWord;
  25. verLangStr :String;
  26. begin
  27. Result :='?';
  28. Lang :='?';
  29. verBuff :=Nil;
  30. verResult :=Nil;
  31. try
  32. verSize :=GetFileVersionInfoSize(PChar(FileName), viResult);
  33. if (verSize>0) then
  34. begin
  35. GetMem(verBuff, verSize+2);
  36. GetFileVersionInfo(PChar(FileName), 0, verSize, verBuff);
  37. VerQueryValue(verBuff, PChar('\VarFileInfo\Translation'),
  38. Pointer(verLang), viResult);
  39. verLangStr :=IntToHex(verLang^.Hi, 4)+IntToHex(verLang^.Lo, 4);
  40. SetLength(Lang, MAX_PATH);
  41. VerLanguageName(DWord(verLang^), PChar(Lang), MAX_PATH);
  42. Lang :=PChar(Lang);
  43. VerQueryValue(verBuff, PChar('\StringFileInfo\'+verLangStr+'\FileVersion'),
  44. verResult, viResult);
  45. Result :=PChar(verResult);
  46. end;
  47. finally
  48. if (verBuff<>Nil) then FreeMem(verBuff);
  49. end;
  50. end;
  51. function CompareVer(Version1, Version2 :String) :Integer;
  52. Var
  53. ver1, ver2 :String;
  54. pos1, pos2 :Integer;
  55. last :Boolean;
  56. begin
  57. last :=False;
  58. repeat
  59. pos1 :=Pos('.', Version1);
  60. pos2 :=Pos('.', Version2);
  61. if (pos1>1)
  62. then begin
  63. ver1 :=Copy(Version1, 1, pos1-1);
  64. Delete(Version1, 1, pos1);
  65. end
  66. else begin
  67. ver1 :=Version1;
  68. Version1 :='';
  69. last :=True;
  70. end;
  71. if (pos2>1)
  72. then begin
  73. ver2 :=Copy(Version2, 1, pos2-1);
  74. Delete(Version2, 1, pos2);
  75. end
  76. else begin
  77. ver2 :=Version2;
  78. Version2 :='';
  79. last :=True;
  80. end;
  81. if (ver1<ver2)
  82. then Result := -1
  83. else begin
  84. if (ver1=ver2)
  85. then begin
  86. Result := 0;
  87. if last then
  88. begin
  89. if (Version1<>'')
  90. then Result := 1 //esempio : 1.0.x è maggiore di 1.0
  91. else if (Version2<>'')
  92. then Result := -1;
  93. end;
  94. end
  95. else Result := 1;
  96. end;
  97. Until (Result<>0) or last;
  98. end;
  99. function InstallFile(FilesList :TStringList;
  100. SourceDir, DestDir, SourceFile :String) :Boolean;
  101. Var
  102. Ver1,
  103. Ver2,
  104. Lang1,
  105. Lang2 :String;
  106. begin
  107. Result :=True;
  108. (* Ma cumu mai nun funziona................?
  109. M'a 'e fari sempri a manu????
  110. viResult :=VerInstallFile(0,
  111. PChar(SourceFile), PChar(SourceFile),
  112. PChar(SourceDir), PChar(DestDir),
  113. PChar(viPrevFile), PChar(viTempFile), viSizeTemp);
  114. Result :=Not((viResult and VIF_SRCOLD<>0) or
  115. (viResult and VIF_DIFFLANG<>0) or
  116. (viResult and VIF_DIFFCODEPG<>0));
  117. if Not(Result) then
  118. *)
  119. if FileExists(DestDir+SourceFile) then
  120. begin
  121. Ver1 :=GetFileVerLang(DestDir+SourceFile, Lang1);
  122. Ver2 :=GetFileVerLang(SourceDir+SourceFile, Lang2);
  123. Result :=(MessageDlg('Overwrite File '+DestDir+SourceFile+#13#10+
  124. ' Version= '+Ver1+' Language= '+Lang1+#13#10+
  125. 'With Version= '+Ver2+' Language= '+Lang2+#13#10, mtConfirmation, [mbYes, mbNo], 0)
  126. =mrYes);
  127. end;
  128. if Result then
  129. begin
  130. ForceDirectories(ExtractFilePath(DestDir+SourceFile));
  131. Result :=CopyFile(PChar(SourceDir+SourceFile),
  132. PChar(DestDir+SourceFile), False);
  133. if (FilesList<>Nil) then FilesList.Add(DestDir+SourceFile);
  134. end;
  135. end;
  136. end.