1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

FAQ FAQ по Inno Setup

Тема в разделе "Inno Setup", создана пользователем Shegorat, 16 июн 2011.

Метки:
  1. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как сделать анимированный баннер?
    О: Так (спасибо El Sanchez)
    Код (Inno):
    1. [Setup]
    2. AppName=test
    3. AppVerName=test
    4. DefaultDirName={tmp}
    5. Uninstallable=no
    6. CreateUninstallRegKey=no
    7. OutputDir=.
    8.  
    9. [Languages]
    10. Name: ru; MessagesFile: compiler:Languages\russian.isl
    11.  
    12. [Files]
    13. Source: "giphy.gif"; Flags: dontcopy solidbreak
    14.  
    15. [Code]
    16. #define A = (Defined UNICODE) ? "W" : "A"
    17. const
    18.   WS_CHILD = $40000000;
    19.   WS_VISIBLE = $10000000;
    20.   WS_DISABLED = $08000000;
    21.  
    22. // ATL Functions
    23. function AtlAxWinInit: BOOL; external 'AtlAxWinInit@atl.dll stdcall';
    24. function AtlAxCreateControl(lpszName: string; hWnd: HWND; pStream, ppUnkContainer: Longint): HResult; external 'AtlAxCreateControl@atl.dll stdcall';
    25.  
    26. // Window Functions
    27. function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';
    28. function CreateWindowEx(dwExStyle: DWORD; lpClassName, lpWindowName: string; dwStyle: DWORD; x, y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance, lpParam: Longint): HWND; external 'CreateWindowEx{#A}@user32.dll stdcall';
    29. function DestroyWindow(hWnd: HWND): BOOL; external 'DestroyWindow@user32.dll stdcall';
    30.  
    31. var
    32.   GIFWndHandle: HWND;
    33.  
    34. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    35. function ShowAnimatedGIF(AWndParent: HWND; ALeft, ATop, AWidth, AHeight: Integer; AUrl: string; AColor: TColor): HWND;
    36. (*
    37. Parameters:
    38.   AWndParent...: A handle to the parent window
    39.   ALeft........: The initial horizontal position of the window
    40.   ATop.........: The initial vertical position of the window
    41.   AWidth.......: The width of the window
    42.   AHeight......: The height of the window
    43.   AUrl.........: The URL or full path of the GIF file
    44.   AColor.......: Color background
    45. Return value:
    46.   A handle to ActiveX control host window
    47. *)
    48. var
    49.   HTMLStr: string;
    50.   ResultCode: HResult;
    51. begin
    52.   if not AtlAxWinInit then Exit;
    53.   Result := CreateWindowEx(0, 'AtlAxWin', '', WS_CHILD or WS_VISIBLE or WS_DISABLED, ALeft, ATop, AWidth, AHeight, AWndParent, 0, 0, 0);
    54.   if Result = 0 then
    55.     RaiseException(SysErrorMessage(DLLGetLastError));
    56.  
    57.   if AColor < 0 then
    58.     AColor := GetSysColor(AColor and $0000FF);
    59.   HTMLStr := Format('about:<html><body leftmargin="0" topmargin="0" scroll="no" bgcolor="#%.2x%.2x%.2x"><p align="center"><img src="%s" height="100%%"></img></p></body></html>', [AColor and $0000FF, AColor and $00FF00 shr 8, AColor and $FF0000 shr 16, AUrl]);
    60.  
    61.   ResultCode := AtlAxCreateControl(HTMLStr, Result, 0, 0);
    62.   if ResultCode <> 0 then
    63.     RaiseException(SysErrorMessage(ResultCode));
    64. end;
    65.  
    66. ///////////////////////////
    67. procedure InitializeWizard;
    68. begin
    69.   ExtractTemporaryFile('giphy.gif');
    70.   GIFWndHandle := ShowAnimatedGIF(WizardForm.SelectDirPage.Handle,
    71.     0, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + ScaleY(5), WizardForm.SelectDirPage.Width, WizardForm.DiskSpaceLabel.Top - WizardForm.DirEdit.Top - WizardForm.DirEdit.Height - ScaleY(5),
    72.      ExpandConstant('{tmp}\giphy.gif'), WizardForm.SelectDirPage.Color);
    73. end;
    74.  
    75. ////////////////////////////
    76. procedure DeinitializeSetup;
    77. begin
    78.   if GIFWndHandle <> 0 then
    79.     DestroyWindow(GIFWndHandle);
    80. end;
    81.  
     
    Adil, YURSHAT, Хамик и ещё 1-му нравится это.
  2. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как сделать HexToStr и StrToHex?
    О: Так
    Код (Inno):
    1. [Setup]
    2. AppName=test
    3. AppVerName=test
    4. DefaultDirName={tmp}
    5. Uninstallable=no
    6. CreateUninstallRegKey=no
    7. OutputDir=.
    8.  
    9. [Languages]
    10. Name: ru; MessagesFile: compiler:Languages\russian.isl
    11.  
    12. [Code]
    13. function HexToStr(str_hex: string): string;
    14. var
    15.   i: Integer;
    16. begin
    17.   Result:= '';
    18.   StringChange(str_hex, ',', '');
    19.   for i:= 1 to Length(str_hex) div 2 do
    20.     Result:= Result +  Chr(StrToInt('$' + Copy(str_hex, (i-1)*2+1, 2)));
    21. end;
    22.  
    23. function StrToHex(str: string): string;
    24. var
    25.   i: Integer;
    26. begin
    27.   Result:= '';
    28.   for i:= 1 to Length(str) do
    29.     Result:= Result +  Format('%.2x', [Ord(str[i]), Ord(str[i])]);
    30. end;
    31.  
    32. procedure InitializeWizard;
    33. var
    34.   S: string;
    35. begin
    36.   S := HexToStr('6D6F757365');
    37.   MsgBox(S, mbInformation, MB_OK);
    38.   S := StrToHex('mouse');
    39.   MsgBox(S, mbInformation, MB_OK);
    40. end;
    41.  
     
    Adil, YURSHAT и Хамик нравится это.
  3. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как отрисовать миниатюру?
    О: Так
    Код (Inno):
    1. [Setup]
    2. AppName=MainForm
    3. AppVerName=MainForm 1.0
    4. DefaultDirName={pf}\MainForm
    5. // Нужно вырубить эту страницу т.к. там ставится фокус на кнопку Next
    6. DisableReadyPage=yes
    7. OutputDir=.
    8.  
    9. [Code]
    10. function GetForegroundWindow: HWND; external 'GetForegroundWindow@user32.dll stdcall delayload';
    11. function SetForegroundWindow(hWnd: HWND): BOOL; external 'SetForegroundWindow@user32.dll stdcall delayload';
    12.  
    13. procedure MShow(Sender: TObject);
    14. begin
    15.   MainForm.Show;
    16. if GetForegroundWindow = WizardForm.Handle then
    17.   SetForegroundWindow(MainForm.Handle);
    18. end;
    19.  
    20. procedure DirOnClick(Sender: TObject);
    21. var
    22.   UserSelectDir: String;
    23. begin
    24.   UserSelectDir:= WizardForm.DirEdit.Text;
    25. if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), UserSelectDir, True) then
    26.   WizardForm.DirEdit.Text:= UserSelectDir;
    27. end;
    28.  
    29. procedure InitializeWizard();
    30. var
    31.   r: TRect;
    32. begin
    33. with MainForm do
    34. begin
    35.   Width:= WizardForm.Width;
    36.   Height:= WizardForm.Height;
    37.   BorderIcons := WizardForm.BorderIcons;
    38.   BorderStyle := WizardForm.BorderStyle;
    39.   Position:= poDesktopCenter;
    40. with TBitmapImage.Create(MainForm) do
    41. begin
    42.   Parent:= MainForm;
    43.   Width:= MainForm.ClientWidth;
    44.   Height:= MainForm.ClientHeight;
    45. with Bitmap do begin
    46.   Width:= Width;
    47.   Height:= Height;
    48.   Canvas.Brush.Color:= clWindow;
    49.   r.Left:=0;
    50.   r.Top:=0;
    51.   r.Right:=WizardfOrm.ClientWidth;
    52.   r.Bottom:=WizardForm.ClientHeight;
    53.   Canvas.FillRect(r);
    54. end;
    55. end;
    56. end;
    57.   WizardForm.Left:= -10000;
    58.   WizardForm.OnShow:= @MShow;
    59. //
    60.   WizardForm.NextButton.Parent:= MainForm;
    61.   WizardForm.BackButton.Parent:= MainForm;
    62.   WizardForm.CancelButton.Parent:= MainForm;
    63.   WizardForm.OuterNotebook.Parent:= MainForm;
    64.   WizardForm.Bevel.Parent:= MainForm;
    65.   WizardForm.DirBrowseButton.OnClick:= @DirOnClick;
    66. end;
    67.  
    68. function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
    69. function EnableMenuItem(hMenu: THandle; uIDEnableItem: Longword; uEnable: Longword): Boolean; external 'EnableMenuItem@user32.dll stdcall';
    70.  
    71. const
    72.   MF_BYCOMMAND = 0;
    73.   MF_ENABLED = 0;
    74.   MF_GRAYED = 1;
    75.   MF_DISABLED = 2;
    76.   SC_CLOSE = 61536;
    77.  
    78. procedure CurPageChanged(CurPageID: Integer);
    79. begin
    80. if CurPageID=wpSelectDir then
    81.   WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
    82. if CurPageID=wpFinished then
    83.   EnableMenuItem(GetSystemMenu(MainForm.Handle, false), SC_CLOSE, MF_DISABLED or MF_BYCOMMAND);
    84. end;
    85.  
    p.s. 3-ий год скрипту, не знаю почему сюда не выложил еще, забыл наверное. :D
    http://krinkels.org/threads/wintb.1952/page-2#post-25893
     
    Последнее редактирование: 22 май 2018
    ffmla, Adil, Winst@n и 2 другим нравится это.
  4. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как менять формат в Языковых параметрах для приложения на момент запуска?
    О: Пример с Dead Space 3
    Код (Inno):
    1. [Setup]
    2. AppName=Language
    3. AppVersion=1.0
    4. DefaultDirName=no
    5. CreateUninstallRegKey=no
    6. SetupIconFile=101.ico
    7. Uninstallable=no
    8. Compression=none
    9. OutputDir=.
    10.  
    11. [Code]
    12. #include "Modules\ExecAndWait.iss"
    13.  
    14. function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';
    15.  
    16. var
    17.   lang, switch: string;
    18.  
    19. function InitializeSetup(): Boolean;
    20. begin
    21.   ShowWindow(Application.Handle, 0);
    22. if (FileExists(ExpandConstant('{src}\deadspace3_Game.exe')) and FileExists(ExpandConstant('{src}\GDFBinary_en_US.dll'))) or (FileExists(ExpandConstant('{src}\deadspace3_Game.exe')) and FileExists(ExpandConstant('{src}\GDFBinary_ru_RU.dll'))) then
    23. begin
    24.   RegQueryStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', lang);
    25. if FileExists(ExpandConstant('{src}\GDFBinary_en_US.dll')) then
    26.   switch:= 'en-US';
    27. if FileExists(ExpandConstant('{src}\GDFBinary_ru_RU.dll')) then
    28.   switch:= 'ru-RU';
    29. if switch<>lang then
    30.   RegWriteStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', switch);
    31. if ExtractFileName(ExpandConstant('{srcexe}'))<>'deadspace3_Game.exe' then
    32.   ExecAndWait(ExpandConstant('{src}\deadspace3_Game.exe'), '', SW_SHOW, true, 0);
    33. if switch<>lang then
    34.   RegWriteStringValue(HKEY_CURRENT_USER, 'Control Panel\International', 'LocaleName', lang);
    35. end else
    36.   MsgBox('Error!', mbError, MB_OK);
    37.   Result:= False;
    38. end;
     

    Вложения:

    Последнее редактирование: 30 июн 2018
    Adil и agent555 нравится это.
  5. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как сменить раскладку? (пример для англ.)
    О: Так
    Код (Inno):
    1. [Setup]
    2. AppName=LoadKeyboard
    3. AppVersion=1.0
    4. DefaultDirName=no
    5. CreateUninstallRegKey=no
    6. SetupIconFile=102.ico
    7. OutputBaseFilename=Start
    8. Uninstallable=no
    9. Compression=none
    10. OutputDir=.
    11.  
    12. [Code]
    13. #include "Modules\ExecAndWait.iss"
    14.  
    15. function LoadKeyboardLayout(hWnd: string; uType: cardinal): Integer; external 'LoadKeyboardLayoutW@user32.dll stdcall';
    16. function GetKeyboardLayout(id: integer): Integer; external 'GetKeyboardLayout@user32.dll stdcall';
    17.  
    18. function GetActiveKbdLayout: LongWord;
    19. begin
    20.   result:= GetKeyboardLayout(0) shr $10;
    21. end;
    22.  
    23. function InitializeSetup(): Boolean;
    24. begin
    25. if FileExists(ExpandConstant('{src}\bio4.exe')) then
    26. begin
    27. if GetActiveKbdLayout<>1033 then
    28.   LoadKeyboardLayout('00000409', 1);
    29. if ExtractFileName(ExpandConstant('{srcexe}'))<>'bio4.exe' then
    30.   ExecAndWait(ExpandConstant('{src}\bio4.exe'), '', SW_SHOW, false, 0);
    31. end else
    32.   MsgBox('Error!', mbError, MB_OK);
    33.   Result:= False;
    34. end;
    35.  
    p.s. и тут re4 :D

    Если вы хотите загрузить и активировать раскладку клавиатуры для всего процесса, вы можете попытаться объединить флаг KLF_ACTIVATE с помощью KLF_SETFORPROCESS
    KLF_ACTIVATE or KLF_SETFORPROCESS
    const KLF_SETFORPROCESS = $00000100;
     
    Последнее редактирование: 6 сен 2018
    Adil и agent555 нравится это.
  6. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    Adil, Winst@n, agent555 и 2 другим нравится это.
  7. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.329
    Симпатии:
    867
    В: Как передать параметры приложению?
    О: Так
    Код (Inno):
    1. [Code]
    2. function Param: string;
    3. begin
    4.   Result:= Copy(GetCmdTail, pos(ExtractFileName(ExpandConstant('{srcexe}')),GetCmdTail)+Length(ExtractFileName(ExpandConstant('{srcexe}')))+1, Length(GetCmdTail));
    5. end;
    6.  
     
    Adil, Хамик, Nemko и 2 другим нравится это.
  8. Пользователь

    Регистрация:
    28 май 2013
    Сообщения:
    53
    Симпатии:
    9
    В: Как сделать чтобы при выборе или отмене компонента и задачи добавлялась или удалялась часть команды в секции Run?
    О: Примерно так
    Код (Inno):
    1.  
    2. ; Скрипт создан через Мастер Inno Setup Script.
    3. ; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!
    4.  
    5. #define MyAppName "Моя программа"
    6. #define MyAppVersion "1.5"
    7. #define MyAppPublisher "Моя компания, Inc."
    8. #define MyAppURL "http://www.сайт.com/"
    9. #define MyAppExeName "MyProg.exe"
    10.  
    11. [Setup]
    12. ; Примечание: Значение AppId идентифицирует это приложение.
    13. ; Не используйте одно и тоже значение в разных установках.
    14. ; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
    15. AppId={{E2E39178-ECF3-423F-A832-45E6AF629577}
    16. AppName={#MyAppName}
    17. AppVersion={#MyAppVersion}
    18. ;AppVerName={#MyAppName} {#MyAppVersion}
    19. AppPublisher={#MyAppPublisher}
    20. AppPublisherURL={#MyAppURL}
    21. AppSupportURL={#MyAppURL}
    22. AppUpdatesURL={#MyAppURL}
    23. DefaultDirName={pf}\{#MyAppName}
    24. DefaultGroupName={#MyAppName}
    25. Compression=lzma
    26. SolidCompression=yes
    27.  
    28. [Languages]
    29. Name: "english"; MessagesFile: "compiler:Languages\English.isl"
    30. Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
    31. Name: "ukrainian"; MessagesFile: "compiler:Languages\Ukrainian.isl"
    32.  
    33. [Tasks]
    34. Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
    35.  
    36. [Run]
    37. Filename: msiexec.exe; Parameters: "/I ""{tmp}\Setup.msi"" /qf ALL_USERS=1 EULA_ACCEPTED=1 LAUNCH_FINEREADER=0 INSTALLDIR=""{app}"" {code:GetParam_1} {code:GetParam_2} {code:GetParam_3} {code:GetParam_4} {code:GetParam_5} {code:GetParam_6}"; Check: not WizardSilent; Flags: waituntilterminated hidewizard;
    38.  
    39. [Ini]
    40. filename: {src}\script.ini; section: "Command"; key: "LANG"; string: "TRANSFORMS=1049.mst"; Languages: russian;
    41. filename: {src}\script.ini; section: "Command"; key: "LANG"; string: "TRANSFORMS=1033.mst"; Languages: english;
    42. filename: {src}\script.ini; section: "Command"; key: "LANG"; string: "TRANSFORMS=1058.mst"; Languages: ukrainian;
    43. filename: {src}\script.ini; section: "Command"; key: "SHCTDESKTOP"; string: "SHCTDESKTOP=1"; Tasks: desktopicon;
    44. filename: {src}\script.ini; section: "Command"; key: "EXPLORER"; string: "EXPLORER=1"; Components: ABBYYFN\EXPLORER;
    45. filename: {src}\script.ini; section: "Command"; key: "HF"; string: "HF=1"; Components: ABBYYFN\HF;
    46. filename: {src}\script.ini; section: "Command"; key: "SSR"; string: "SSR=1"; Components: ABBYYFN\SSR;
    47. filename: {src}\script.ini; section: "Command"; key: "COMPARATOR"; string: "COMPARATOR=1"; Components: ABBYYFN\COMPARATOR;
    48. filename: {src}\script.ini; section: "Command"; key: "SHCTDESKTOP"; string: "SHCTDESKTOP=0"; Tasks: not desktopicon;
    49. filename: {src}\script.ini; section: "Command"; key: "EXPLORER"; string: "EXPLORER=0"; Components: not ABBYYFN\EXPLORER;
    50. filename: {src}\script.ini; section: "Command"; key: "HF"; string: "HF=0"; Components: not ABBYYFN\HF;
    51. filename: {src}\script.ini; section: "Command"; key: "SSR"; string: "SSR=0"; Components: not ABBYYFN\SSR;
    52. filename: {src}\script.ini; section: "Command"; key: "COMPARATOR"; string: "COMPARATOR=0"; Components: not ABBYYFN\COMPARATOR;
    53.  
    54. [Components]
    55. Name: ABBYYFN; Description: "ABBYY FineReader 14"; Flags: checkablealone;
    56. Name: ABBYYFN\EXPLORER; Description: "Интеграция с Проводником Windows"; Flags: checkablealone;
    57. Name: ABBYYFN\HF; Description: "ABBYY Hot Folder"; Flags: checkablealone;
    58. Name: ABBYYFN\SSR; Description: "ABBYY Screenshot Reader"; Flags: checkablealone;
    59. Name: ABBYYFN\COMPARATOR; Description: "ABBYY Сравнение документов"; Flags: checkablealone;
    60.  
    61. [code]
    62. function GetParam_1(s: String): String;
    63. begin
    64.   Result:=GetIniString('Command', 'LANG', '', ExpandConstant('{src}\script.ini'));
    65. end;
    66. function GetParam_2(s: String): String;
    67. begin
    68.   Result:=GetIniString('Command', 'SHCTDESKTOP', '', ExpandConstant('{src}\script.ini'));
    69. end;
    70. function GetParam_3(s: String): String;
    71. begin
    72.   Result:=GetIniString('Command', 'EXPLORER', '', ExpandConstant('{src}\script.ini'));
    73. end;
    74. function GetParam_4(s: String): String;
    75. begin
    76.   Result:=GetIniString('Command', 'HF', '', ExpandConstant('{src}\script.ini'));
    77. end;
    78. function GetParam_5(s: String): String;
    79. begin
    80.   Result:=GetIniString('Command', 'SSR', '', ExpandConstant('{src}\script.ini'));
    81. end;
    82. function GetParam_6(s: String): String;
    83. begin
    84.   Result:=GetIniString('Command', 'COMPARATOR', '', ExpandConstant('{src}\script.ini'));
    85. end;
    86.  
     
    Adil нравится это.
  9. Old Men Проверенный

    Регистрация:
    17 июн 2011
    Сообщения:
    469
    Симпатии:
    448
    Пол:
    Мужской
    Понадобилось получить размер установленной игры (именно установленной уже), ну типа размер папки.
    Наткнулся у себя на такой скрипт (да простит меня автор, не помню, откуда взял, или кто мне дал :( (скрипт конечно же)).
    Код (Inno):
    1.  
    2. [Setup]
    3. AppName=My Application
    4. AppVersion=1.5
    5. DefaultDirName={pf}\My Application
    6.  
    7. [code]
    8. function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
    9.  
    10. function BytesToSize(Bytes: Extended): String;
    11. var
    12.     pszBuf: array [0..15] of Char;
    13. begin
    14.     try
    15.         Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    16.     except end;
    17. end;
    18.  
    19. function GetFileSize(FilePath:string):Extended;            // размер файла
    20. var
    21.        oFS: Variant;
    22. begin
    23.        try
    24.                if not FileExists(FilePath) then Exit;
    25.                oFS := CreateOleObject('Scripting.FileSystemObject');
    26.                Result := oFS.GetFile(FilePath).Size;
    27.        except
    28.                Result:= 0;
    29.     end;
    30. end;
    31.  
    32. function GetFolderSize(path: String): Extended;            // размер папки
    33. var
    34.     oFS: Variant;
    35. begin
    36.     try
    37.         if not DirExists(path) then Exit;
    38.         oFS:= CreateOleObject('Scripting.FileSystemObject');
    39.         Result:= oFS.GetFolder(path).Size;
    40.     except
    41.         Result:= 0;
    42.     end;
    43. end;
    44.  
    45. function FileVersion(FilePath:string):string;              // версия файла
    46. var
    47.   oFS: Variant;
    48. begin
    49.   oFS := CreateOleObject('Scripting.FileSystemObject');
    50.   Result := oFS.GetFileVersion(FilePath);
    51. end;
    52.  
    53. function DriveName(FilePath:string):string;                // получение буквы жёсткого диска на котором лежит файл
    54. var
    55.   oFS: Variant;
    56. begin
    57.   oFS := CreateOleObject('Scripting.FileSystemObject');
    58.   Result := oFS.GetDriveName(FilePath);
    59. end;
    60.  
    61. function CreateFolderUniqueName:string;                    // генерирование уникального имени папки для использования её в %Temp%
    62. var
    63.   oFS: Variant;
    64. begin
    65.   oFS := CreateOleObject('Scripting.FileSystemObject');
    66.   Result := oFS.GetTempName;
    67. end;
    68.  
    69. function DriveExists(Drive:string):boolean;                // проверка наличия жёсткого диска по букве:
    70. var
    71.   oFS: Variant;
    72. begin
    73.   oFS := CreateOleObject('Scripting.FileSystemObject');
    74.   Result := oFS.DriveExists(Drive);
    75. end;
    76.  
    77. function FolderExists(Folder:string):boolean;              // альтернатива функции DirExists
    78. var
    79.   oFS: Variant;
    80. begin
    81.   oFS := CreateOleObject('Scripting.FileSystemObject');
    82.   Result := oFS.FolderExists(Folder);
    83. end;
    84.  
    85. procedure InitializeWizard();
    86. begin
    87. if DriveExists('C') then MsgBox('ok', mbInformation, MB_OK);
    88. if FolderExists('C:\Program Files') then MsgBox('ok', mbInformation, MB_OK);
    89.   MsgBox(BytesToSize(GetFileSize('D:\Games\S.T.A.L.K.E.R. - Lost Alpha\gamedata.dba')), mbInformation, MB_OK);
    90.   MsgBox(FileVersion('C:\Windows\regedit.exe'), mbInformation, MB_OK);
    91.   MsgBox(DriveName('C:\Windows\regedit.exe'), mbInformation, MB_OK);
    92.   MsgBox(CreateFolderUniqueName, mbInformation, MB_OK);
    93.   MsgBox(BytesToSize(GetFolderSize('F:\Games\R.G. Catalyst\The Sinking City')), mbInformation, MB_OK);
    94. end;
    95.  
    Может кому и будет полезно.
    Для себя переписал
    Код (Inno):
    1.  
    2. [Setup]
    3. AppName=My Application
    4. AppVersion=1.5
    5. DefaultDirName={pf}\My Application
    6.  
    7. [code]
    8. function NumToStr(Float: Extended): String;
    9. begin
    10.   Result:= Format('%.0n', [Float]);
    11.   StringChange(Result, ',', '.');
    12. while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
    13.   SetLength(Result, Length(Result)-1);
    14. end;
    15.  
    16. function MbOrTb(Byte: Extended): String;
    17. begin
    18.   if Byte < 1024 then Result:= NumToStr(Byte)+'mb' else
    19.     if Byte/100 < 1024 then Result:= NumToStr((Byte/1024*100)/100)+'gb' else
    20.       Result:= NumToStr((Byte/(1024*1024)*100)/100)+'tb';
    21. end;
    22.  
    23. function GetFolderSize(path: String): Extended;            // размер папки
    24. var
    25.     oFS: Variant;
    26. begin
    27.     try
    28.         if not DirExists(path) then Exit;
    29.         oFS:= CreateOleObject('Scripting.FileSystemObject');
    30.         Result:= oFS.GetFolder(path).Size div 1048576;
    31.     except
    32.         Result:= 0;
    33.     end;
    34. end;
    35.  
    36. procedure InitializeWizard();
    37. begin
    38.   MsgBox(MbOrTb(GetFolderSize('F:\Games\R.G. Catalyst\The Sinking City')), mbInformation, MB_OK);
    39.   //MsgBox(NumToStr(GetFolderSize('F:\Games\R.G. Catalyst\The Sinking City')), mbInformation, MB_OK);   //если нужно в мегабайтах
    40. end;
    41.  
    А, это
    В: Как узнать размер папки?
    О: Вот так.

    А, еще, вдруг кто не знал, как сделать необходимое количество цифр после запятой
    Код (Inno):
    1.  
    2. Result:= format('%.0n', [Float]); StringChange(Result, ',', '.'); Целые
    3. Result:= format('%.1n', [Float]); StringChange(Result, ',', '.'); Десятые
    4. Result:= format('%.2n', [Float]); StringChange(Result, ',', '.'); Сотые
    5. Result:= format('%.3n', [Float]); StringChange(Result, ',', '.'); Тысячные
    6.  
    P.S. Не знаю, как на 7-ке, а на 10-ке нельзя получить размер некоторых папок с системного диска. Разрешения, будь они неладны.
     
    Последнее редактирование: 5 июл 2019
    Косой, Carlos, agent555 и 4 другим нравится это.

Поделиться этой страницей