Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: Forslay
Дата сообщения: 25.11.2008 09:58
Ещё раз всем привет!

1). Есть такой код:

[more]

[Code]
procedure InitializeWizard();
var
srcFile, destFile: String;
Begin
srcFile:= '';
if GetOpenFileName('', srcFile, '', 'Конфигурационный файл|*.cfg', 'cfg') then
    if GetSaveFileName('', destFile, '', 'Конфигурационный файл|*.cfg|', 'txt') then
        FileCopy(srcFile, destFile, True);
End;[/more]

Как сделать так, что бы это окно вылезало не вначале, а в конце установки?



2.) Ещё один вопросик...

[more]

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
DisableStartupPrompt=true
Uninstallable=false

DisableProgramGroupPage=true

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[Tasks]
Name: askini; Description: Укажите расположение ключа; GroupDescription: Configuration:

[Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Select Key File Location', 'Where is Key located?',
'Select where Key is located, then click Next.');

Page.Add('Select Key File', // caption
'Key Files (*.reg)|*.reg|All Files|*.*', // filters
'.reg'); // default extension

end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if CurPage = Page.ID then
begin
if FileExists(Page.Values[0]) then
begin
ForceDirectories('{app}\cstrike\maps\');
Result:= FileCopy(Page.Values[0], '{app}\cstrike\maps\'+ ExtractFileName(Page.Values[0]), False);
end
else Result:= False;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;[/more]

Так вот здесь я хочу проделывать тоже самое, только не с одним файлом, а с папкой. То-есть что бы пользователь мог указать директорию с файлами, а не один файл открывать...

Заранее приогромнейшее спасибо!
Автор: Don_Juan
Дата сообщения: 25.11.2008 14:08
Помогите, пожалуйста, разобраться с кодом удаления программы при повторном запуске инсталлятора. Нужно чтобы секция Tasks обнулилась. То есть если пользователь при установки программы отметил, допустим "создать значок на рабочем столе" а по умолчанию эта галочка снята, то если запустить повторно инсталлятор и удалить программу через код, то чтобы галочка была снята. А если нажать "перезаписать программу" то она стояла. Для этого я в функции удаления пишу WizardForm.TasksList.Checked[1]:= False; но при удалении появляется ошибка и ничего не происходит. Может, кто поможет, пожалуйста?

[more=Читать дальше..][Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

[Code]
var
Text: TLabel;
RadioButton_1, RadioButton_2: TRadioButton;
Uninstall: string;
ResultCode: Integer;
Page: TWizardPage;

function Page_NextButtonClick(Page: TWizardPage): Boolean;
var
hWnd: Integer;
begin
Result := True;
if RadioButton_1.Checked then
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString', Uninstall) then
UnInstall := RemoveQuotes(UnInstall);
if Exec(Uninstall, '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
WizardForm.GroupEdit.Text:= ExpandConstant('{#emit SetupSetting('DefaultGroupName')}');
// ВОТ ТУТ ПРИ УДАЛЕНИИ ВЫДАЁТ ОШИБКУ WizardForm.TasksList.Checked[1]:= False;
Result:= True;
end else
if not Exec(UnInstall, '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
//MessageBox(hWnd, 'Произошла ошибка при деинсталляции.'#13#13'' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', 'Error', MB_OK or $10)
MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK)
Result:=False
end
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString') = True then
Result:=False
end
else if RadioButton_2.Checked then
Result:=True
end;


//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//функция для создания новой страницы
function CheckInstalledPage(PreviousPageId: Integer): Integer;
var Location: String;
begin
RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','InstallLocation',Location);
Page := CreateCustomPage(2,'Previous Installation Found',
'Please choose how you want to proceed.');
with Page do
begin

Text := TLabel.Create(Page);
with Text do
begin
Parent := Page.Surface;
Caption := 'Inno Setup Scripting уже установлен в директорию '+Location+' на Вашем'+#13+'компьютере. Рекомендуется,чтобы Вы деинсталлировали текущую версию WarCraft III'+#13+'перед продолжением.'
Left := 0;
Top := 24;
AutoSize := True;
Transparent := True;
end

RadioButton_1 := TRadioButton.Create(Page);
with RadioButton_1 do
begin
Parent := Page.Surface;
Caption := 'Uninstall before continuing (recommended)';
Left := 0;
Top := 104;
Width := 233;
Height := 17;
Checked := True;
TabStop := True;
end

RadioButton_2 := TRadioButton.Create(Page);
with RadioButton_2 do
begin
Parent := Page.Surface;
Caption := 'Overwrite current version';
Left := 0;
Top := 144;
Width := 153;
Height := 17;
end

OnNextButtonClick := @Page_NextButtonClick;

Result := Page.ID;
end
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------

procedure InitializeWizard();
begin
CheckInstalledPage(wpLicense); //создание новой страницы
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = Page.ID then
if RegValueExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1','UninstallString') = False then
Result := True; //Если значение реестра отсутствует, страница будет пропущена
end;[/more]
Автор: serg_aka_lain
Дата сообщения: 25.11.2008 18:20
Forslay

Цитата:
Как сделать так, что бы это окно вылезало не вначале, а в конце установки?

[more=Так]

procedure CurStepChanged(CurStep: TSetupStep);
var
srcFile, destFile: String;
begin
if CurStep = ssPostInstall then
begin
srcFile:= '';
if GetOpenFileName('', srcFile, '', 'Êîíôèãóðàöèîííûé ôàéë|*.cfg', 'cfg') then
if GetSaveFileName('', destFile, '', 'Êîíôèãóðàöèîííûé ôàéë|*.cfg|', 'txt') then
FileCopy(srcFile, destFile, True);
end;
end;

[/more]
Автор: Forslay
Дата сообщения: 25.11.2008 18:51
Большое спасибо. Это было так легко, мне просто было лень думать.

А вот на счёт второго варианта, я реально не соображу 8*(



Цитата:

[more]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
DisableStartupPrompt=true
Uninstallable=false

DisableProgramGroupPage=true

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[Tasks]
Name: askini; Description: Укажите расположение ключа; GroupDescription: Configuration:

[Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Select Key File Location', 'Where is Key located?',
'Select where Key is located, then click Next.');

Page.Add('Select Key File', // caption
'Key Files (*.reg)|*.reg|All Files|*.*', // filters
'.reg'); // default extension

end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if CurPage = Page.ID then
begin
if FileExists(Page.Values[0]) then
begin
ForceDirectories('C:\123\');
Result:= FileCopy(Page.Values[0], 'C:\123\'+ ExtractFileName(Page.Values[0]), False);
end
else Result:= False;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;[/more]

Так вот здесь я хочу проделывать тоже самое, только не с одним файлом, а с папкой. То-есть что бы пользователь мог указать директорию с файлами, а не один файл открывать...





И ещё один вопрос. В Inno существует возможность отображения двойного прогресс бара? То-есть одна линия показывает общую установку, а другая каждый копируемый файл. В общем, кто меня непонял, привожу пример:

WINRAR - распаковка или упаковка, там два прогресс бара...

Спасибо заранее. Помогите если знаете...
Автор: Serega0675
Дата сообщения: 25.11.2008 20:16
Здравствуйте, как можно сделать, чтоб при повторном запуске инсталлятора появлялось окно с выбором удалить программу или изменить выбор установленных компонентов, [more=пример] [/more]
Автор: skryabinsoft
Дата сообщения: 25.11.2008 20:34
Подскажите срочно плиз! Столкнулся с такой проблемой, перепаковываю игру Red Alert 3, там есть такое дело:
[more][HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3\1.0]
"ProgramGroup"="C:\\Documents and Settings\\All Users\\Главное меню\\Программы\\Electronic Arts\\"
[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3]
"Folder"="C:\\Documents and Settings\\All Users\\Главное меню\\Программы\\Electronic Arts\\Command & Conquer™ Red Alert™ 3\\"[/more]

Я прописал так:
[more]Root: HKLM; Subkey: Software\Electronic Arts\Electronic Arts\Red Alert 3\1.0; Flags: uninsdeletevalue; ValueType: string; ValueName: ProgramGroup; ValueData: {{group}
Root: HKLM; Subkey: Software\Electronic Arts\Electronic Arts\Red Alert 3; Flags: uninsdeletevalue; ValueType: string; ValueName: Folder; ValueData: {group}[/more]

Но у меня так в реестр и прописалось:
[more][HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3\1.0]
"ProgramGroup"="{group}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3]
"Folder"="{group}"[/more]

Как нужно правильно прописать в скрипте?
Заранее благодарен.
P.S.: Зачеркнул, т.к проблема решена, спасибо Serega0675!
Автор: Serega0675
Дата сообщения: 25.11.2008 20:59
skryabinsoft

Цитата:
Столкнулся с такой проблемой, перепаковываю игру Red Alert 3,
[more]
Root: HKLM; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3\1.0; ValueType: string; ValueName: ProgramGroup; ValueData: {commonprograms}\Electronic Arts\
Root: HKLM; SubKey: SOFTWARE\Electronic Arts\Electronic Arts\Red Alert 3; ValueType: string; ValueName: Folder; ValueData: {commonprograms}\Electronic Arts\Command & Conquer™ Red Alert™ 3\
[/more]
Автор: Forslay
Дата сообщения: 26.11.2008 09:19
А мне помогите пожалуйста... Просто срочно нужно....
Автор: SotM
Дата сообщения: 26.11.2008 10:02
Forslay

Цитата:
В Inno существует возможность отображения двойного прогресс бара?

В Inno нет такой возможности, но можно попробовать что-то похожее сделать. А как это сделать нужно смотреть в "Коллекция скриптов", скрипт "Progress_Double.iss". Ведь они для этого в шапке и выложены, чтобы можно было скачать и посмотреть, а только затем уже спрашивать здесь...
Автор: Forslay
Дата сообщения: 26.11.2008 10:12
Знаешь, я скачал и посмотрел ещё ранее. И нечего мне это не дало. Я так и непонял как его использовать. Может дашь справку....


И ещё с этим мне кто нибудь поможет?

[more][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
DisableStartupPrompt=true
Uninstallable=false

DisableProgramGroupPage=true

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}

[Tasks]
Name: askini; Description: Укажите расположение ключа; GroupDescription: Configuration:

[Code]
var
Page: TInputFileWizardPage;

procedure InitializeWizard();
begin
Page := CreateInputFilePage(wpSelectTasks,
'Select Key File Location', 'Where is Key located?',
'Select where Key is located, then click Next.');

Page.Add('Select Key File', // caption
'Key Files (*.reg)|*.reg|All Files|*.*', // filters
'.reg'); // default extension

end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result:= True;
if CurPage = Page.ID then
begin
if FileExists(Page.Values[0]) then
begin
ForceDirectories('C:\123\');
Result:= FileCopy(Page.Values[0], 'C:\123\'+ ExtractFileName(Page.Values[0]), False);
end
else Result:= False;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsTaskSelected('askini') then
Result:= True;
end;[/more]

Так вот здесь я хочу изменить так, что бы пользователь выбирал не один файл, а директорию с файлами... А файлы, которые находятся в той директории, которую выбрал пользователей, копировался в определённый каталог, ну куда они копироваться будут я уже сам разберусь...
Автор: pimkinsv
Дата сообщения: 26.11.2008 21:23
Нужна большая помощь! Суть проблемы:
Имеется около сотни ломаных казуалок разных категорий (карты, стратегии, скроллеры и т.д.) Все стоят в папке D:\Games каждая в своей папке. Хочу создать инсталлятор с выбром устанавливаемых игр в виде дерева по категориям (типа: '+[V]Карты', нажимаешь на '+' и раскрывается ветка с карточными играми и напротив каждой игры флажок для выбора).
Затем чтобы в папке {pf} создавалась папка с подпапками ярлыков к играм по категориям (с этим почти разобрался).
И в конце создавался не обычный деинсталлятор, а с возможностью выбора – ‘все’ либо ‘выборочно’ (ведь не всегда нужно удалять все игры сразу), и чтобы отображались только установленные игры.
Просто надоело знакомым объяснять как все это с диска скопировать, к какому файлу в какой игре ярлык для запуска создавать и в какую категорию пихать, а иногда все самому приходится делать. А тут - бац и все как у людей. Прошу, у кого есть достаточно знаний и времени, помочь небольшим примером (пара категорий с парой игр), если конечно такое вообще можно сделать в IS.
Автор: Gideon Vi
Дата сообщения: 27.11.2008 09:01
Если ли переменная, чтобы автоматически ставится в папку юзера (что-то типа: C:\Documents and Settings\Gideon Vi\, где Gideon Vi - папка с именем залогиненного юзера)?
Автор: noiseless
Дата сообщения: 27.11.2008 09:16
Gideon Vi
Уважаемый! Прочтите, пожалуйста, хоть разик справку к INNO
Вот оттудова, выбирайте:

{userappdata} & {commonappdata}
The path to the Application Data folder.
{userdesktop} & {commondesktop} *
The path to the desktop folder.
{userdocs} & {commondocs}
The path to the My Documents folder (or on NT 4.0, the Personal folder).

{userfavorites} & {commonfavorites} *
The path to the Favorites folder. Usage of these constants requires a MinVersion setting of at least "4.1, 4". Only Windows 2000 and later supports {commonfavorites}; if used on previous Windows versions, it will translate to the same directory as {userfavorites}.
{userprograms} & {commonprograms} *
The path to the Programs folder on the Start Menu.
{userstartmenu} & {commonstartmenu} *
The path to the top level of the Start Menu.

{userstartup} & {commonstartup} *
The path to the Startup folder on the Start Menu.
{usertemplates} & {commontemplates} *
The path to the Templates folder. Only Windows 2000 and later supports {commontemplates}; if used on previous Windows versions, it will translate to the same directory as {usertemplates}.
Автор: Artem_Butenko
Дата сообщения: 27.11.2008 11:25
pimkinsv - для реализации выборочного удаления подойдет Inno Setup Upgrade от уважаемого Victor_Dobrov, а вот как быть с выборочным удалением ключей реестра, я не знаю.
Автор: mikutu
Дата сообщения: 27.11.2008 11:52
К моему вопросу на прошлой странице, а может в [Tasks] Description можно указать строку из активного файла языка (если можно то как это будет выглядеть). Помогите пожалуйста очень надо.
Автор: noiseless
Дата сообщения: 27.11.2008 11:59
mikutu
См. примеры к INNO, конкретно "Languages.iss"
Автор: ExpeditorR
Дата сообщения: 27.11.2008 12:46
pimkinsv

Цитата:
Хочу создать инсталлятор с выбром устанавливаемых игр в виде дерева по категориям (типа: '+[V]Карты', нажимаешь на '+' и раскрывается ветка с карточными играми и напротив каждой игры флажок для выбора).


Если так не подойдёт [more][Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe

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

[Components]
Name: "Component1"; Description: "Карты"; Types: full
Name: "Component1\Children1"; Description: "Игра 1"; Flags: checkablealone; Types: full
Name: "Component1\Children2"; Description: "Игра 2"; Flags: checkablealone; Types: full
Name: "Component2"; Description: "Стратегии"; Types: full
Name: "Component2\Children1"; Description: "Игра 1"; Flags: checkablealone; Types: full
Name: "Component2\Children2"; Description: "Игра 2"; Flags: checkablealone; Types: full

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags:
Source: "C:\games\Карты\setup1.exe"; DestDir: "{app}\"; Components: "Component1\Children1"; Flags: ignoreversion
Source: "C:\games\Карты\setup2.exe"; DestDir: "{app}\"; Components: "Component1\Children2"; Flags: ignoreversion
Source: "C:\games\Стратегии\setup1.exe"; DestDir: "{app}\"; Components: "Component2\Children1"; Flags: ignoreversion
Source: "C:\games\Стратегии\setup2.exe"; DestDir: "{app}\"; Components: "Component2\Children2"; Flags: ignoreversion

[Icons]
Name: "{group}\Unintall"; IconFilename: "{app}\unins000.exe"; Filename: "{app}\unins000.exe"

[Code]
procedure InitializeWizard();
begin
WizardForm.TYPESCOMBO.Visible:= false;
end;[/more], то сделать реальный плюсик который сворачивает/разворачивае узел похоже нельзя, а создавать TreeView на WinApi это убийство, хотя может кто и сделает

Автор: Forslay
Дата сообщения: 27.11.2008 15:05
Помогите мне пожалуйста... Пост выше...
Автор: Don_Juan
Дата сообщения: 27.11.2008 16:25
Ребят и мне помогите, пожалуйста, с моим вопросом выше. Есть ли решение данной проблемы или нет?

Добавлено:
Ребят и мне помогите, пожалуйста, с моим вопросом выше. Есть ли решение данной проблемы или нет?
Автор: Serega0675
Дата сообщения: 27.11.2008 21:10
pimkinsv
Цитата:
Хочу создать инсталлятор с выбром устанавливаемых игр в виде дерева по категориям (типа: '+[V]Карты', нажимаешь на '+' и раскрывается ветка с карточными играми и напротив каждой игры флажок для выбора).
Sampron на 31 странице давал ссылки на китайский сайт, где в одном из примеров есть раскрывающийся список компонентов.
P.S. Сказать откровенно, я сам с ним не разобрался, вылетают ошибки. Непонятные обозначения: ComponentsListTVStyle=true, Flags: Collapsed...
Может кто-нибудь, сможет привести его в работоспособное состояние или хотя бы объяснит, что и где не хватает - было бы хорошо.
Автор: Victor_Dobrov
Дата сообщения: 28.11.2008 01:47
Serega0675

Чтобы получить раскрывающий список компонентов (и многие другие возможности), установи ispack-5.2.3.exe (обязательно с препроцессором), а затем обнови Inno Setup до расширенной версии от ResTools, запустив вот этот SFX-архив (0,9 Мб).
Автор: Gideon Vi
Дата сообщения: 28.11.2008 03:04
noiseless, спасибо за совет про справку, ценю. Однако, насколько я понимаю, ни один из предоставленных Вами примеров (о которы я, впринципе, знаю ) не удовлтворяет моим условиям.
Фактически мне нужно попасть по такому пути: C:\Documents and Settings\Gideon Vi\Local Settings\Application Data\. Но вполне бы хватило и более короткого (читай: более универсального): C:\Documents and Settings\Gideon Vi\. Предложенные же Вами варианты уводят в дебри рабочих столов и меню "Пуск".
Автор: Serega0675
Дата сообщения: 28.11.2008 07:53
Victor_Dobrov

Цитата:
а затем обнови Inno Setup до расширенной версии от ResTools
Огромное спасибо!
Только вчера, скажем просто из интереса скачал ResTools, а тут оказывается именно он и нужен, буду вечером разбираться, что к чему...
СПАСИБО!!!
P.S.
Я думаю, не мешало бы добавить ссылку, которую дал Victor_Dobrov, в шапку темы.
Автор: Diawer
Дата сообщения: 28.11.2008 15:51
У меня просьба к людям со знанием Английского на “ТЫ”, нужно перевести эту подборку, у меня конечно перевод есть, но при помощи неважного знания языка и кривых переводчиков - качеством и не пахнет. Хочется Грамотный перевод. Если не в лом.

- Вероятно, игра была перемещена, удалена или переименована.
- Обнаружена установленная версия
- Пожалуйста, выберите необходимое действие.
- Установка в системную папку
- Удалить перед продолжением (рекомендуется)
- Перезаписать текущую версию
- Выбранный путь включает в себя системную папку! Вы уверены, что необходимо продолжать установку?
- Выбор ассоциации файловых расширений
- Какие файловые расширения Вы хотите ассоциировать?
- Выберите файловые расширения, которые Вы хотели бы ассоциировать с "My Program", после этого нажмите «Далее»:
- Программа установки обнаружила, что "My Program" уже установлена на Вашем компьютере. Вы можете сначала удалить текущую версию (рекомендуется) или установить повторно. Нажмите «Далее», когда Вы будете готовы продолжить.
- Вы хотите удалить настройки и сохранения игры?
- Некоторые элементы не были удалены.
- Выбранный путь включает в себя системную папку! Вы уверены, что необходимо продолжать установку?
- Создать дополнительный значок в меню Пуск
- Вы хотите удалить настройки и сохранения игры?
- Наведите курсор мыши на компонент, чтобы прочитать его описание.
- "My Program" защищенный файл или директория! Вы хотите удалить файл с атрибутом "Только чтение"?
- Ассоциация файловых расширений:
Автор: Serega0675
Дата сообщения: 28.11.2008 16:30
Gideon Vi
Цитата:
Фактически мне нужно попасть по такому пути: C:\Documents and Settings\Gideon Vi\Local Settings\Application Data\.

{localappdata}

Добавлено:
Gideon Vi
Цитата:
Но вполне бы хватило и более короткого (читай: более универсального): C:\Documents and Settings\Gideon Vi\.
{sd}\Documents and Settings\{username}
Автор: skryabinsoft
Дата сообщения: 28.11.2008 20:52
Удалите эту месагу плиз, сам разобрался...
Автор: Genri
Дата сообщения: 29.11.2008 12:29
Serega0675

Цитата:
{sd}\Documents and Settings\{username}
-- лучше использовать только константы. Например:
Source: "MyProg.exe"; DestDir: "{userdocs}\.."
Автор: Serega0675
Дата сообщения: 29.11.2008 13:11
Genri

Цитата:
-- лучше использовать только константы. Например:
Source: "MyProg.exe"; DestDir: "{userdocs}\.."
Да, согласен, но это путь к папке Мои документы, а Gideon Vi спрашивал
Цитата:
C:\Documents and Settings\Gideon Vi\.
из этого и следует:
Source: MyProg.exe; DestDir: {sd}\Documents and Settings\{username}
т.е. файл MyProg.exe будет установлен по пути C:\Documents and Settings\Gideon Vi\MyProg.exe
Автор: Forslay
Дата сообщения: 29.11.2008 14:15
Почему я немогу зашифровать инсталлятор? При исполнении скомпелированного файла выдаётся вот такая вот ошибка:




Добавлено:
Добавляю, что файл ISCrypt.dll у меня есть, и в состав кода он входит, хотя его необязательно прописывать в файлах...

Если взять обычный простой скрипт, то всё нормально, а именно мой... Может у меня много всякой дряни в скрипте?... Помогите, что делать? И есть ли другие способы защиты от распаковщиков?
Автор: htuos
Дата сообщения: 29.11.2008 14:46
спрашивали в личке, но вроде такие вопросы и раньше проскакивали, поэтому отвечу здесь
копирование файлов с двумя прогрессбарами (один отображает общий ход копирования, второй - текущего файла). Обращаю внимание, что копирование внешних файлов, а не отображение процесса распаковки файлов включенных в инсталлятор. такой пример есть в шапке

в общем вот что я успел написать. дальше красоту и доп. показатели сами можете поставить
[more=пример][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

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

[Code_]
type
TMsg = record
hwnd: HWND;
message: UINT;
wParam: Longint;
lParam: Longint;
time: DWORD;
pt: TPoint;
end;

const
BlockSize = 65536;
PM_REMOVE = 1;
WM_QUIT = $0012;

var
Page: TInputDirWizardPage;
PB,PB2: TNewProgressBar;
L1,L2,L3:TNewStaticText;
DS,CS:Extended;
CancelBtn:TButton;
CancelOperation:boolean;

function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

procedure AppProcessMessage;;
var
Msg: TMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

procedure CopyFile_(Source,Target:string);
var
FileSize,ElapsedSize,CopySize:LongWord;
SourceStream,TargetStream:TFileStream;
a:Extended;
begin
SourceStream:=TFileStream.Create(Source,fmOpenRead);
TargetStream:=TFileStream.Create(Target,fmCreate);
ElapsedSize:=SourceStream.Size-SourceStream.Position;
FileSize:=SourceStream.Size;
PB.Max:=100;
PB.Position:=0;
L1.Caption:=ExtractFileName(Source);
L2.Caption:='0 %';
while ElapsedSize>0 do begin
if ElapsedSize<BlockSize then CopySize:=ElapsedSize else CopySize:=BlockSize;
TargetStream.CopyFrom(SourceStream,CopySize);
ElapsedSize:=SourceStream.Size-SourceStream.Position;
a:=(ElapsedSize div FileSize)*100;
a:=100-a; //хз че здесь за глюки, но писать эти действия в одну строчку нельзя
PB.Position:=Round(a);//SourceStream.Position;
L2.Caption:=IntToStr(PB.Position)+' %'
L2.Invalidate;
CS:=CS+BlockSize;//(1024*1024);
a:=CS*100; //такая же ересь, написав все
a:=a/DS //в одну строку ни хрена не считается
PB2.Position:=Round(a);//Round(CS*100/DS);
L3.Caption:=IntToStr(PB2.Position)+' %'
AppProcessMessage;
if CancelOperation then Break;
end;
//FileSetDate(TargetStream.Handle,FileGetDate(SourceStream.Handle));
//дату файла надобы сменить на старую, да возиться лень
TargetStream.Free;
SourceStream.Free;
if CancelOperation then DeleteFile(Target);
end;

procedure CopyDir(const FromDir,ToDir,FileMask:string;IncludeSubDirs:boolean);
var
FindRec:TFindRec;
sFileName,fd,td:string;
// i,j:Int64;
ii:integer;
begin
fd:=AddBackslash(FromDir);
td:=AddBackslash(ToDir);
ForceDirectories(td);
if FindFirst(fd+FileMask,FindRec) then begin
try
repeat
sFileName:=fd+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td+FindRec.Name)
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
CopyDir(sFileName,td+FindRec.Name,FileMask,IncludeSubDirs);
AppProcessMessage;
until not (FindNext(FindRec) and not CancelOperation);
finally
FindClose(FindRec);
end;
end;
end;

procedure GetDirSize(const Dir,FileMask:string;IncludeSubDirs:boolean);
var
FindRec:TFindRec;
sFileName,d:string;
// i:Int64;
begin
d:=AddBackslash(Dir);
if FindFirst(d+FileMask,FindRec) then begin
try
repeat
sFileName:=d+FindRec.Name;
if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then DS:=DS+4294967295*FindRec.SizeHigh+FindRec.SizeLow
else
if IncludeSubDirs then
if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then GetDirSize(sFileName,FileMask,IncludeSubDirs);
AppProcessMessage;
until not (FindNext(FindRec) and not CancelOperation);
finally
FindClose(FindRec);
end;
end;
end;

procedure CancelBtnClick(Sender:TObject);
begin
CancelOperation:=True;
end;

procedure InitializeWizard();
begin
Page:=CreateInputDirPage(wpSelectTasks,'Пример копирования файлов', 'Укажите каталоги','',False,'NewFolder');
Page.Add('Откуда копировать');
Page.Values[0] := 'e:\1\1';//'c:\';//ExpandConstant('{userappdata}');
Page.Add('Куда копировать');
Page.Values[1] := 'e:\1\2';//'c:\';
PB:=TNewProgressBar.Create(WizardForm);
with PB do begin
Left:=0;
Top:=130;
Width:=Page.Surface.Width;
Parent:=Page.Surface;
end;
L1:=TNewStaticText.Create(WizardForm);
with L1 do begin
Left:=0;
Top:=115;
AutoSize:=False;
Width:=Page.Surface.Width-30;
Parent:=Page.Surface;
end;
L2:=TNewStaticText.Create(WizardForm);
with L2 do begin
Left:=Page.Surface.Width-30;
Top:=115;
AutoSize:=False;
Width:=30;
//Alignment:=taRightJustify;
Parent:=Page.Surface;
end;
PB2:=TNewProgressBar.Create(WizardForm);
with PB2 do begin
Left:=0;
Top:=170;
Width:=Page.Surface.Width;
Parent:=Page.Surface;
end;
L3:=TNewStaticText.Create(WizardForm);
with L3 do begin
Left:=Page.Surface.Width-30;
Top:=155;
AutoSize:=False;
Width:=30;
//Alignment:=taRightJustify;
Parent:=Page.Surface;
end;
CancelBtn:=TButton.Create(WizardForm);
with CancelBtn do begin
Left:=Page.Surface.Width-150;
Top:=200;
Width:=150;
Parent:=Page.Surface;
Caption:='Отменить копирование';
OnClick:=@CancelBtnClick;
end;

end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:=True;
if CurPageID=Page.ID then begin
L1.Caption:='Подсчет размера "'+Page.Values[0]+'"';
L2.Caption:='';
L3.Caption:='';
DS:=0;
PB.Position:=0;
PB.Max:=100;
PB2.Position:=0;
PB2.Max:=100;
CS:=0;
CancelOperation:=False;
WizardForm.NextButton.Enabled:=False;
WizardForm.CancelButton.Enabled:=False;
WizardForm.BackButton.Enabled:=False;
GetDirSize(Page.Values[0],'*.*',True);
CopyDir(Page.Values[0],Page.Values[1],'*.*',True);
WizardForm.NextButton.Enabled:=True;
WizardForm.CancelButton.Enabled:=True;
WizardForm.BackButton.Enabled:=True;
end;
end;
[/more]
а мне в гости пора

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.