Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

insombia
25-04-2013, 18:13
кто-то может сделать так чтобы 1 кнопка переводила весь язык,а то у меня там 2 кнопки,думаю кто-то разберется
http://rghost.ru/45545533

saurn
28-04-2013, 07:05
Всем привет! Наставьте, пожалуйста на путь истинный. Как извлечь имя(тип) файловой системы выбранного раздела, при выборе папки установки и записать полученное значение в виде текста(лейбла) на странице мастера. Ну, тоесть, как извлечь понятно - 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

saurn
29-04-2013, 09:42
Johny777, спасибо за направление по верному пути :) Всё же существующая проблема не исчезла, данные о файловой системе системного раздела(в моем случае "С") не выводятся, строка пустая. С другими разделами, а так же флешками и т.д. проблем нет. На текущий момент файловая система системного раздела определяется только, если указать неизменяемую литеру:
GetVolumeInformation('C:\', VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH)
Немогу понять, что ему нехватает(

nik1967
29-04-2013, 10:22
saurn, а не может быть такое - физический диск разбит на несколько логических, но скрипт показывает файловую систему только физического диска? У меня данный пример показывает файловую систему диска C:\, но не показывает диска D:\(логического). У меня физический диск разбит на 2 логических.

saurn
29-04-2013, 10:36
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
и иногда просто могут быть ошибки

saurn
29-04-2013, 20:56
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;

saurn
30-04-2013, 00:28
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;

vint56
30-04-2013, 13:08
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

vint56
30-04-2013, 16:02
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