Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
insombia
25-04-2013, 18:13
кто-то может сделать так чтобы 1 кнопка переводила весь язык,а то у меня там 2 кнопки,думаю кто-то разберется
http://rghost.ru/45545533
Всем привет! Наставьте, пожалуйста на путь истинный. Как извлечь имя(тип) файловой системы выбранного раздела, при выборе папки установки и записать полученное значение в виде текста(лейбла) на странице мастера. Ну, тоесть, как извлечь понятно - GetVolumeInformation и т.д - , и тут возникает проблема: упорно не желает определять тип файловой системы раздела "C:\". Делал, фактически, по следующему принципу:
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function DelSP(string: string): string;
begin
while (Pos(' ', String) > 0) do
Delete(String, Pos(' ', String), 1);
Result:= Trim(String);
end;
...
FileSystemName:= StringOfChar(' ', 32);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName);
...
Johny777
28-04-2013, 13:13
insombia,
Проверяй стоку кнопки например:
procedure OnChange(Sender:TObject);
begin
case TButton(Sender).Caption of
SetupMessage(msgButtonNext):
begin
MsgBox('A', mbInformation, MB_OK);
TButton(Sender).Caption := SetupMessage(msgButtonBack);
end;
SetupMessage(msgButtonBack):
begin
MsgBox('B', mbInformation, MB_OK);
TButton(Sender).Caption := SetupMessage(msgButtonNext);
end;
end;
end;
procedure InitializeWizard;
begin
WizardForm.NextButton.OnClick := @DirEditOnChange;
end;
заместо SetupMessage(msgButtonNext) и SetupMessage(msgButtonBack) 'твои 2 названия кнопки', а вместо месседжбоксов действия
=============================================================================================
saurn,
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
MAX_PATH = 260;
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
procedure DirEditOnChange(Sender:TObject);
var
VolumeName, FileSystemName, DriveLetter: String;
ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
VolumeName := StringOfChar(#32, MAX_PATH);
FileSystemName := StringOfChar(#32, MAX_PATH);
DriveLetter := ExtractFileDrive(TEdit(Sender).Text);
GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
WizardForm.Caption := FileSystemName;
end;
procedure InitializeWizard;
begin
WizardForm.DirEdit.OnChange := @DirEditOnChange;
DirEditOnChange(WizardForm.DirEdit);
end;
PS: в данном случае DelSP(...) не нужна, если нужно то Trim(...) http://www.delphisources.ru/pages/faq/faq_delphi_basics/Trim.php.html
insombia
28-04-2013, 21:01
странности с isexec,есть файл размером в 3 гб,установка прошла нормально,но папка с игрой пустая
ilya_klimovich
28-04-2013, 22:23
такая проблемка, вот игровые некоторые файлы обрабатывал precomp+srep и поменялось разрешение файлов, когда я их закинул в папку с игрой в процессе игры у меня у меня не считывает эти файлы, как используя precomp+srep сделать после этого нужное разрешение?
insombia
28-04-2013, 23:01
ilya_klimovich их нужно юзать для распаковки в исдоне или isexec
Johny777, спасибо за направление по верному пути :) Всё же существующая проблема не исчезла, данные о файловой системе системного раздела(в моем случае "С") не выводятся, строка пустая. С другими разделами, а так же флешками и т.д. проблем нет. На текущий момент файловая система системного раздела определяется только, если указать неизменяемую литеру:
GetVolumeInformation('C:\', VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
Немогу понять, что ему нехватает(
saurn, а не может быть такое - физический диск разбит на несколько логических, но скрипт показывает файловую систему только физического диска? У меня данный пример показывает файловую систему диска C:\, но не показывает диска D:\(логического). У меня физический диск разбит на 2 логических.
nik1967, диск разбит на три раздела - С, D, E, соответственно. Все разделы основные, логических нет. В том и дело, что скрипт показывает файловую систему D и E, но запинается на C.
Johny777
29-04-2013, 13:11
saurn, nik1967,
спасибо, что нашли ошибки!
Теперь вроде работает, замени в коде что я дал эти строки:
DriveLetter := ExtractFileDrive(TEdit(Sender).Text);
GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
WizardForm.Caption := FileSystemName;
на:
DriveLetter := AddBackslash(ExtractFileDrive(TEdit(Sender).Text));
if GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH) then WizardForm.Caption := Trim(FileSystemName);
PS: кажись функция не успевала отработать(маловероятно) и не хватало слэша(!), к тому же мы заполняем буфер 260-ю пробелами и поэтому в конечном итоге не помешает Trim()
=========
предлагаю вот этот код, может он лучше подойдёт?
[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVABLE = 2;
DRIVE_FIXED = 3;
MAX_PATH = 260;
SHGFI_ICON = $100;
SHGFI_SMALLICON = $1;
SHGFI_DISPLAYNAME = $200;
SHGFI_TYPENAME = $400;
LVM_SETEXTENDEDLISTVIEWSTYLE = $1036;
LVS_EX_FULLROWSELECT = $20;
LVM_FIRST = $1000;
LVSCW_AUTOSIZE_USEHEADER = -2;
LVM_SETCOLUMNWIDTH = LVM_FIRST + 30;
type
_SHFILEINFO = record
hIcon: HICON;
iIcon: Integer;
dwAttributes: DWORD;
szDisplayName: array [0..MAX_PATH-1] of Char;
szTypeName: array [0..79] of Char;
end;
_ULARGE_INTEGER = record
LowPart: Longint;
HighPart: DWORD;
end;
DriveInfo = record
DriveName: String;
DriveFileSystemName: String;
DriveSize: Extended;
DriveFreeSize: array [0..1] of Extended;
DriveType: String;
DriveIcon: _SHFILEINFO;
end;
function SHGetFileInfo(pszPath: String; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function BytesToSize(Bytes: Extended): String;
var
pszBuf: array [0..15] of Char;
begin
try
Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
except end;
end;
function CharArrayToString(cArray: array of Char): String;
begin
Result := '';
while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;
function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
Result := $7FFFFFFF;
Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;
procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
i, e: Integer;
iIcon: WORD;
UndefDriveLetter: String;
DriveType: UINT;
DrivePath: String;
VolumeName, FileSystemName: String;
ComponentLength, SerialNumber, FileSystemFlags: DWORD;
FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
for i := 67 to 90 do // Loop from C..Z to determine available drives
begin
UndefDriveLetter := Chr(i) + ':\';
DriveType := GetDriveType(UndefDriveLetter);
case DriveType of
DRIVE_REMOVABLE, DRIVE_FIXED: begin
VolumeName := StringOfChar(#32, MAX_PATH);
FileSystemName := StringOfChar(#32, MAX_PATH);
GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
e := GetArrayLength(DriveArray)-1;
SHGetFileInfo(UndefDriveLetter, FILE_ATTRIBUTE_DIRECTORY, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_DISPLAYNAME);
DriveArray[e].DriveName := CharArrayToString(DriveArray[e].DriveIcon.szDisplayName);
DriveArray[e].DriveFileSystemName := FileSystemName;
DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
DriveArray[e].DriveType := CharArrayToString(DriveArray[e].DriveIcon.szTypeName);
end;
DRIVE_NO_ROOT_DIR: Continue;
end;
end;
end;
procedure DriveListViewOnClick(Sender: TObject);
begin
if Assigned(TListView(Sender).Selected) then
WizardForm.DirEdit.Text := AddBackSlash(Copy(TListView(Sender).Selected.Caption, Pos('(', TListView(Sender).Selected.Caption)+1, 2)) + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;
procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
TListView(Sender).Tag := Column.Index;
with TListView(Sender) do
begin
if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
AlphaSort;
end;
end;
procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
with TListView(Sender) do
begin
if Tag = 0 then
Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
else
Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
end;
end;
procedure InitializeWizard;
var
ReadyArray: array of DriveInfo;
DriveListView: TListView;
NewColumn: TListColumn;
ListItem: TListItem;
ImgList: TImageList;
i, e: Integer;
ico: TIcon;
begin
WizardForm.OuterNotebook.Hide;
WizardForm.Width := ScaleX(700);
WizardForm.Bevel.Hide;
WizardForm.DirEdit.Parent := WizardForm;
WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));
GetDrivesInfo(ReadyArray);
e := GetArrayLength(ReadyArray)-1;
DriveListView := TListView.Create(nil);
with DriveListView do
begin
Parent := WizardForm;
ViewStyle := vsReport;
ReadOnly := True;
SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
OnClick := @DriveListViewOnClick;
OnColumnClick := @DriveListViewColumnClick;
OnCompare := @DriveListViewOnCompare;
SendMessage(Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
ImgList := TImageList.Create(DriveListView);
ImgList.BkColor := Color;
for i := 0 to e do
begin
ico := TIcon.Create;
ico.Handle := ReadyArray[i].DriveIcon.hIcon;
ImgList.AddIcon(ico);
ico.Free;
end;
SmallImages := ImgList;
NewColumn := Columns.Add;
NewColumn.Caption := 'Имя';
NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;
NewColumn := Columns.Add;
NewColumn.Caption := 'Файловая система';
NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;
NewColumn := Columns.Add;
NewColumn.Caption := 'Ёмкость';
NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;
NewColumn := Columns.Add;
NewColumn.Caption := 'Свободно';
NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;
NewColumn := Columns.Add;
NewColumn.Caption := 'Тип';
NewColumn.Width := LVSCW_AUTOSIZE_USEHEADER;
for i := 0 to e do
begin
ListItem := Items.Add;
with ListItem do
begin
Caption := ReadyArray[i].DriveName;
SubItems.Add(ReadyArray[i].DriveFileSystemName);
SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
SubItems.Add(ReadyArray[i].DriveType);
ImageIndex := i;
end;
end;
end;
end;
если пригодился то поставьте El Sanchez-у спасибо
http://forum.oszone.net/post-2030337-1311.html
========================
я горжусь своим 555-м сообщением! :)
insombia
29-04-2013, 20:05
странности с инно происходят,когда через инно сделал сетап,то во время установки такие ошибки идут http://i47.fastpic.ru/big/2013/0429/ea/22b0f4677acd4f2a14c96bb7d871fcea.jpg
и иногда просто могут быть ошибки
insombia, дословно, это означает "внешнее исключение". Иными словами смотрите в сторону процедур и функций вызываемых из внешних библиотек. Некоторые библиотеки( например IsUtils, get_hw_caps) используют WMI (Windows Management Instrumentation), которая есть в любой форточке, кроме 98. И соответственно, для их корректной работы необходимо, чтобы была включена сама WMI и ряд связанных с ней сервисов. Ну, а если используется какая-нибудь сборка системы ,где черезмерно умный сборщик отключил ненужные по его мнению службы, подобных ошибок не избежать. Inno тут ни причем. Так же, вполне вероятно, что просто ошибка в скрипте.
insombia
29-04-2013, 21:21
saurn могу дать скрипт,мож посмотреть http://rghost.ru/45646441
p.s. да,он с krinkels'а но я его переделаю под себя
ilya_klimovich
29-04-2013, 22:38
как прописать в isdone чтобы при установке игры из srep файла вылез pcf а потом prack? что здесь не так
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.srep'), ExpandConstant('{app}\1.pcf'), '', true, CallBack ) then break;
Johny777, спасибо. Склеил простенький скрипт на проверку файловой системы с выводом имени оной в TNewStaticText на SelectDirPage :) Может, кому сгодится:
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputDir=.
[Code]
const
MAX_PATH = 260;
TARGET_FILE_SYSTEM = 'NTFS';
function GetVolumeInformation(lpRootPathName: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
var
FileSystemLabel, FileSystemLabel2: TNewStaticText;
function ExtractFileSystemName(const DriveLetter: string): string;
var
VolumeName, FileSystemName: String;
ComponentLength, SerialNumber, FileSystemFlags: DWORD;
begin
VolumeName := StringOfChar(#32, MAX_PATH);
FileSystemName := StringOfChar(#32, MAX_PATH);
DriveLetter := AddBackslash( ExtractFileDrive(WizardDirValue()) );
GetVolumeInformation(DriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
Result := Trim(FileSystemName);
end;
procedure ObjectOnChange(Sender: TObject);
var
FileSystemType: String;
begin
case TEdit(Sender) of
WizardForm.DirEdit:
begin
FileSystemLabel2.Caption := ExtractFileSystemName(FileSystemType);
WizardForm.NextButton.Enabled := (ExtractFileSystemName(FileSystemType) = TARGET_FILE_SYSTEM);
if ExtractFileSystemName(FileSystemType) = TARGET_FILE_SYSTEM then
FileSystemLabel2.Font.Color := clBlack else FileSystemLabel2.Font.Color := clRed;
end;
end;
end;
procedure InitializeWizard();
begin
with WizardForm do
begin
DirEdit.OnChange := @ObjectOnChange;
FileSystemLabel := TNewStaticText.Create(nil);
with FileSystemLabel do
begin
Parent := SelectDirPage;
SetBounds(WizardForm.DiskSpaceLabel.Left, WizardForm.DiskSpaceLabel.Top - 18, 0, 0);
AutoSize := True;
Caption := 'Файловая система:';
end;
FileSystemLabel2 := TNewStaticText.Create(nil);
with FileSystemLabel2 do
begin
Parent := SelectDirPage;
SetBounds(FileSystemLabel.Left + 100, FileSystemLabel.Top, 0, 0);
AutoSize := True;
end;
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectDir: ObjectOnChange(WizardForm.DirEdit);
end;
end;
ilya_klimovich
if not ISSRepExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.srep'), ExpandConstant('{app}\1.pcf'), '', true, CallBack ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\1.pcf'), ExpandConstant('{app}\1.prack'), true) then break;
ilya_klimovich
30-04-2013, 15:45
Прописываю вот так if not ISPrecompExtract ( 0, OveralPct, 0, ExpandConstant('{app}\1.pcf'), ExpandConstant('{app}\1.rpack'), '', true, CallBack ) then break;
потом в процессе установки выбивается мол не верно задан файл для ISPrecompExtract
ilya_klimovich, а у тебя какой на выходе файл после srep вот тот и надо писать ты же написал 1.pcf
ilya_klimovich
30-04-2013, 16:07
vint56
я сначала хочу с прекомпом разобраться а потом и срэпом, строку там где срэп я пока закоментировал
insombia
30-04-2013, 16:51
ilya_klimovich зачем этот гемор? тебе же давали вроде скрипт для консольного сжатия srep+precomp
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.