Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Когда только начинал знакомиться с Inno Setup и переупаковывал для себя некоторые игрушки, то по умолчанию ставил путь установки в {pf}\Games\... (C:\Program Files\Games\...), а фактически ставил их в D:\Games\...
Так меня постоянно мучал вопрос, какую переменную задать, чтоб Inno понимал, что ставить надо на диск D.
Самый простой способ - это прописать в DefaultDirName=D:\Games\..., но это не универсально и вдруг на другом компьютере будет только один диск.
Одним словом решения я тогда не нашёл, но недавно увидел похожий вопрос на другом форуме и вспомнил интересовавшую меня проблему.
В результате, вот скрипт, который определяет логические диски на компьютере и предлагает установить на первый логический диск не являющийся системным (если их несколько, в противном случае будет предложен системный диск).
Скрипт
Код: Выделить весь код
; скрипт, который определяет логические диски на компьютере и предлагает установить на первый
; логический диск не являющийся системным (если их несколько, в противном случае будет предложен
; системный диск).
; Автор: Serega, http://forum.oszone.net/member.php?userid=88670

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={code:NoSD}\Games\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Code]
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: PChar): Cardinal; external 'GetDriveTypeA@kernel32.dll stdcall';

const
  DRIVE_FIXED = 3;

function NoSD(s: string): string;
var
  x, bit, i: Integer;
  tp: Cardinal;
  sd: string;
begin
  sd:= ExpandConstant('{sd}');
  Result:= sd;
  // Вызываем функцию WinAPI
  // Функция возвращает битовую маску установленных логических дисков.
  // Бит 0 определяет наличие диска А:, бит 1 - диска B и т.д.
  x:= GetLogicalDrives;
  if x <> 0 then
  // цикл по полученным битам переменной X
  for i:= 1 to 64 do
    begin
      // Накладываем битовую маску для выделения бита с поряковым номером 0
      bit:= x and 1;
      // нашли логический диск...
      if bit = 1 then
        begin
          // определяем тип логического диска
          tp:= GetDriveType(PChar(Chr(64 + i) + ':'));
          if tp = DRIVE_FIXED then
          // если диск не является системным
          if Chr(64 + i) <> Copy(sd, 1, 1) then
            begin
              Result:= Chr(64 + i) + ':';
              Break;
            end;
        end;
      // побитовый сдвиг вправо
      x:= x shr 1;
    end;
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:16, 12-09-2009 | #96