Когда только начинал знакомиться с 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;