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

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 6]

Аватара для El Sanchez

Ветеран


Contributor


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


Конфигурация

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


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

Аватара для Tco 03

Пользователь


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

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


Цитата Johny777:
Короче зацени function ExtractResource(var ResourceList: TStringList): Boolean; »
Заценил!
После удаления программы в папке TEMP остаётся мусор, ровно такого размера, что и unins000.exe
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:11, 03-04-2013 | #71



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Tco 03, Ну, джонни еще многое нужно узнать об элементарных правилах кодинга. Хотя - убирать за собой - можно назвать одним из основополагающих. Но при этом одним из самых трудновыполнимых. так что не суди строго, возьми да сам сделай зачистку темпа при выходе, это несложно.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 15:10, 03-04-2013 | #72


Аватара для Tco 03

Пользователь


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

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


Gnom_aka_Lexander
Да я вообще ничего плохово сказать не хотел, так сказать расказал о своих наблюдениях. Ну и от таких наблюдений, я думаю, Джонни доведёт всё до совершенства.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 03-04-2013 | #73


Аватара для Johny777

Ветеран


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

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


Tco 03, Спасибо за внимательность! Хорошо, что есть люди которые помогают сделать лучше! Назвал имя батника удаления в твою честь из благодарности!

to All
теперь собственно о файле:
1. Он зовётся именем процесса деинсталятора и деинсталятор держит его пока процесс не убьётся, а значит удалить файл через код напрямую нельзя ни на каком этапе или процедуре связанных с деинсталятором
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно
например попробуйте установить и удалить этот скрипт и в темпе останется похожий файл:
Код: Выделить весь код
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
Но путём изврата удалось реализовать метод его удаления:
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса
(функция function GetCurrentProcessId(): DWORD; всё упрощает)
мы получаем путь к тому самому файлу... и удаляем его малость модифицированным мной примером Genri (самоудаление) (исходник http://forum.ru-board.com/topic.cgi?...8&start=1280#3 )
вот исправленный пример с ботвой:
читать дальше »
Код: Выделить весь код
#include "botva2.iss"

[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png

[Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    AXEL_YELLOW = $48c1ca;
    RT_RCDATA = 10;
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;



function ExtractResource(var ResourceList: TStringList): Boolean;
var
    ResStreams: array of TResourceStream;
    ResName, ResFile: String;
    i: Integer;
begin
    if ResourceList = nil then Exit;
    Result := ResourceList.Count > 0;
    SetArrayLength(ResStreams, ResourceList.Count);
    try
        for i := 0 to ResourceList.Count-1 do
        try
            ResName := Trim( Copy(ResourceList.Strings[i], 1, Pos(',', ResourceList.Strings[i])-1) );
            ResFile := Trim( Copy(ResourceList.Strings[i], Pos(',', ResourceList.Strings[i])+1, Length(ResourceList.Strings[i])-Pos(',', ResourceList.Strings[i])) );
            ResStreams[i] := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
            ResStreams[i].SaveToFile(ExpandConstant('{tmp}\') + ResFile);
            Result := Result and FileExists(ExpandConstant('{tmp}\') + ResFile);
        finally
            ResStreams[i].Free;
        end;
    finally
        ResourceList.Free;
    end;
end;


function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
    szExeFile: array [0..MAX_PATH-1] of Char;
    hProc: THandle;
begin
    hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
    if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
    begin
        Result := '';
        while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
        Result := RemoveBackSlash(Result);
    end;
end;



procedure InitializeWizard;
var
    PicHandle: THandle;
    ResList: TStringList;
begin
    ResList := TStringList.Create;
    ResList.Add('_IS_BOTVA, botva2.dll');  // 'Имя ресурса, имя файла'
    ResList.Add('_IS_BPIC, bPic.png');
    ResList.Add('_IS_LIPIC, LiPic.png');
    ResList.Add('_IS_APIC, aPic.png');

    

    with WizardForm do
    begin
        WelcomePage.Color := AXEL_YELLOW;
        MainPanel.Color := AXEL_YELLOW;

        if ExtractResource(ResList) then
        begin
            PicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
            WizardBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(WelcomePage.Handle);

            PicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
            WizardBitmapImage2.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(FinishedPage.Handle);

            PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeSetup;
begin
    if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
end;

/////////////////////////////////////////////////////////////////////


procedure SelfDelete(const FileName: String);
var
    BatName: String;
    ResultCode: Integer;
begin
    BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
    if SaveStringToFile(BatName,
        '@echo off' + #10#13 +
        ':LOOP'     + #10#13 +
        'del ' + '"' + FileName + '"' + #10#13 +
        'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
        'del ' + '"' + BatName + '"',
    False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;



procedure InitializeUninstallProgressForm();
var
    PicHandle: THandle;
    ResList: TStringList;
begin
    MsgBox('путь к файлу от которого исходит процесс нашей программы:' +#13#10 + GetMyProcName(), mbInformation, MB_OK);

    with UninstallProgressForm do
    begin
        MainPanel.Color := AXEL_YELLOW;
        
        ResList := TStringList.Create;
        ResList.Add('_IS_BOTVA, botva2.dll');
        ResList.Add('_IS_LIPIC, LIPic.png');

        if ExtractResource(ResList) then
        begin
            PicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
            WizardSmallBitmapImage.Hide;
            ImgSetVisibility(PicHandle, True);
            ImgApplyChanges(MainPanel.Handle);
        end;
    end;
end;


procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown;
    SelfDelete(GetMyProcName);
end;


вот просто пример удаления этого файла:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup

[ Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

function GetCurrentProcessId(): DWORD; external 'GetCurrentProcessId@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

procedure SelfDelete(const FileName: String);
var
    BatName: String;
    ResultCode: Integer;
begin
    BatName := ExtractFilePath(FileName) + 'Tco03_Happy_Del.cmd';
    if SaveStringToFile(BatName,
        '@echo off' + #10#13 +
        ':LOOP'     + #10#13 +
        'del ' + '"' + FileName + '"' + #10#13 +
        'if exist ' + '"' + FileName + '"' + ' goto LOOP' + #10#13 +
        'del ' + '"' + BatName + '"',
    False) then Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;


function GetMyProcName(): String; // узнать путь с имененм своего процесса
var
    szExeFile: array [0..MAX_PATH-1] of Char;
    hProc: THandle;
begin
    hProc := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, GetCurrentProcessId() );
    if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
    begin
        Result := '';
        while not (szExeFile[Length(Result)] = #0) do Result := Result + szExeFile[Length(Result)];
        Result := RemoveBackSlash(Result);
    end;
end;

procedure DeinitializeUninstall();
begin
    SelfDelete(GetMyProcName);
end;


Цитата Gnom_aka_Lexander:
Хотя - убирать за собой - можно назвать одним из основополагающих »
Походу в Restools не принято, ведь файл оставляет инно по умолчанию без участия автора инсталла!

PS: просьба потестировать на всякий случай!

Последний раз редактировалось Johny777, 03-04-2013 в 17:48.

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

Отправлено: 17:40, 03-04-2013 | #74


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
Походу в Restools не принято »
Но они и не обновляли очень давно. Я лично пользуюсь своей сборкой, на базе инно именно 5.5.1 и соответствующей версией расширенной. то-есть апдейт Inno Setup Compiler(build 121216)ни в коем случае не использую, поскольку он уже на базе 5.5.2, скорей всего не страшно, но я люблю ,чтоб все соответствовало, ибо только так можно добиться безглючности и стабильности. так вот. в простейшем варианте папка темп у меня отлично удаляется сама собой, хотя подчистка временной папки на выходе у меня всегда на всякий случай есть.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 17:57, 03-04-2013 | #75


Аватара для Johny777

Ветеран


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

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


Gnom_aka_Lexander,
читать дальше »
читать дальше »
читать дальше »
Gnom_aka_Lexander, пока никакой инно не пользуюсь, она стоит только чтоб на форуме помогать тк переношу/реализую проект инсталла халфы на дельфи(2010 пока что) по некоторым причинам не в пользу инно, но проект всё ещё в зародыше.

Цитата Gnom_aka_Lexander:
хотя подчистка временной папки на выходе у меня всегда на всякий случай есть. »
можешь пожалуйста показать мне исходник как чистишь темп после инно? (Такой пример я б себе сохранил на всякий случай)

И кстати кто хорошо знает Вин Апи или/и реестр? Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки

Последний раз редактировалось Johny777, 03-04-2013 в 18:23.


Отправлено: 18:03, 03-04-2013 | #76


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
Можно ли как-то добавить задачу винде на то же самое удаление например (не после перезагрузки). Что-то вроде задержки »
както так:
Код: Выделить весь код
var
  res ; integer;
begin
  Exec('cmd', '/c at 12:00 C:\MyProga.exe',ExpandConstant('{win}'), SW_Hide, ewNoWait, res);
Только вот журнал заданий может быть отключен или даже выпилен пользователем, а чаще г-сборщиком "за ненадобностью"

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 18:38, 03-04-2013 | #77


Аватара для Tco 03

Пользователь


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

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


Цитата Johny777:
просьба потестировать на всякий случай! »
Теперь всё чисто! Что создалось, то и удалилось.
Чище только так: cd /d "%temp%" && rd /s /q "."
Только я бы вписал вместо: LOOP - trydel и соответственно: goto trydel ну это так, каждый хочет поумничить
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:13, 03-04-2013 | #78


Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата Johny777:
2. Теперь никакого прямого обращения к контролам через оконную процедуру - всё обращение теперь на чистом WinApi »
Johny777, что так? Ты ж не из другого потока к контролам обращаешься.
Цитата Johny777:
это гарантированно избавит от возможных ошибок »
Johny777, от каких?
Цитата Johny777:
if Msg = PBM_SETPOS then
begin
UndefPosition := SendMessage(hInstallProgressBar, PBM_GETPOS, 0, 0); »
Johny777, первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
Цитата Johny777:
(UndefPosition*100)/UndefMax »
Johny777, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.
Цитата Johny777:
2. Этот файл кстати остаётся даже после простейшего скрипта, что говорит о возможной недоработке Инно »
Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:24, 03-04-2013 | #79


Аватара для Johny777

Ветеран


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

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


El Sanchez,
Цитата El Sanchez:
от каких? Ты ж не из другого потока к контролам обращаешься.»
В том то и дело, думал что это поток. Вспомнил маты винды на указатели, переполнение стека и прочее когда к контролам обращался из каллбэка твоей имплементации 7-zip в инно
Цитата El Sanchez:
первые 2 вызова PBM_GETPOS в обработчике PBM_SETPOS при данной реализации вернут 0, поэтому 100% ты никогда не увидишь. Используй wParam.
, проверяй UndefMax на 0, вдруг SendMessage с PBM_GETRANGE обделается.»
Вернулся назад к обращению к контролам. Код стал проще и короче. Думаю это финальная версия. (отредактировал предыдущий пост http://forum.oszone.net/post-2124681-69.html )
Цитата El Sanchez:
Johny777, это нормальное поведение. tmp-файл деинсталлятора удалится при следующей перезагрузке. »
не знал . Вот винда удивится, когда этот файл не найдёт...
===========
Спасибо тебе большое за исправления. Теперь я знаю и умею больше!
PS: просьба и дальше делать: El_Sanchez.Сообщение.Текст := Ошибка(неверный_код^) + #13#10 + Исправление; , когда у меня будут ошибки или недоработки!
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:23, 04-04-2013 | #80



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59




 
Переход