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

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: Vadikan
Дата: 22-05-2012
Описание: Закрыто
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]


Продолжение обсуждения
Скрипты Inno Setup. Помощь и советы [часть 5]

Отправлено: 18:01, 29-08-2011

 

Аватара для kotkovets

Ветеран


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

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


Цитата Лександер:
никто не думал над тем, как удалять этот ярлык при деинсталляции? »
изменить идентификатор 5386 на 5387, далее уже ясно как:
Код: Выделить весь код
or i := 0 to LoadString(hInst, 5387, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]);
В русскоязычной оси 5386 - Закрепить на &панели задач
В русскоязычной оси 5387 - Открепить от &панели задач

-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

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

Отправлено: 15:54, 03-01-2012 | #551



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

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


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата El Sanchez:
может антивирь не дает в shell32.dll »
не антивирь
Цитата El Sanchez:
уверен, что на этой? »
уверен, раскладываел ее на составляющие:
Код: Выделить весь код
for i := 0 to 
LoadString(hInst, 5386, buf[0], 255)-1 
do 
strVerb := strVerb + Chr(Buf[i]);
на выделенном виснет навсегда

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

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

Отправлено: 17:21, 03-01-2012 | #552


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

Ветеран


Contributor


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

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


Цитата Лександер:
на выделенном виснет навсегда »
Лександер, ок, а без Chr?:
Код: Выделить весь код
...
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external  LoadStringA@user32.dll stdcall';
...
buf: array [0..255] of char;
...
for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
...
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:03, 03-01-2012 | #553


Аватара для Gnom_aka_Lexander

Ветеран


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

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


El Sanchez, так-же:

Компилю на юникоде, замена вызова LoadStringA на LoadStringW вообще дает ошибку невозможно загрузить длл
Возможно. косяк системы - Скрипт Кастомного шрифта, у меня тоже не работает - виснет на оповещении системы.
ПРичем, это косяк не инно - пробовал делать длл, и вызывать функцию из нее - результат аналогичный.

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


Последний раз редактировалось Gnom_aka_Lexander, 03-01-2012 в 20:53.

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

Отправлено: 20:01, 03-01-2012 | #554


Ветеран


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

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


El Sanchez, извиняюсь, но немного подправил ваш скрипт Закрепить ярлык на панели задач в Windows 7 (вариант №2).
Сделал в виде примера с кнопками...
Подробнее

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[Code]
const
  BUF_SIZE = 1024;
  LOAD_LIBRARY_AS_DATAFILE = 2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExA@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: UINT; lpBuffer: PChar; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';


function GetDllResourceStr(const Index: Integer): string;
var
  hLibrary: THandle;
  iSize: Integer;
begin
  Result := '';
  hLibrary := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
  if hLibrary <> 0 then
  try
    SetLength(Result, BUF_SIZE);
    iSize := LoadString(hLibrary, Index, PChar(Result), BUF_SIZE);
    if iSize > 0 then
      SetLength(Result, iSize)
    else
      Result := '';
  finally
    FreeDLL(hLibrary);
  end;
end;

function AddTaskbarWin7(const FileName: string): Boolean;
var
  i: Integer;
  strVerb: string;
  objShell, colVerbs: Variant;
begin
  strVerb := GetDllResourceStr(5386);
  if not FileExists(Filename) or (strVerb = '') then Exit;
  try
    objShell := CreateOleObject('Shell.Application');
  except
    ShowExceptionMessage;
    Exit;
  end;
  colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
  for i := colVerbs.Count downto 1 do
    if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Result := True;
        Break;
      end;
end;

function DelTaskbarWin7(const FileName: string): Boolean;
var
  i: Integer;
  strVerb: string;
  objShell, colVerbs: Variant;
begin
  strVerb := GetDllResourceStr(5387);
  if not FileExists(Filename) or (strVerb = '') then Exit;
  try
    objShell := CreateOleObject('Shell.Application');
  except
    ShowExceptionMessage;
    Exit;
  end;
  colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
  for i := colVerbs.Count downto 1 do
    if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Result := True;
        Break;
      end;
end;

procedure AddButtonClick(Sender: TObject);
begin
  // Присобачим Блокнот на панель задач
  if AddTaskbarWin7('c:\windows\notepad.exe') then
    MsgBox('ok', mbInformation, MB_OK)
  else
    MsgBox('no', mbInformation, MB_OK);
end;

procedure DelButtonClick(Sender: TObject);
begin
  // Удялим Блокнот из панели задач
  if DelTaskbarWin7('c:\windows\notepad.exe') then
    MsgBox('ok', mbInformation, MB_OK)
  else
    MsgBox('no', mbInformation, MB_OK);
end;

procedure InitializeWizard();
begin
  if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
      with TButton.Create(WizardForm) do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Добавить';
          OnClick := @AddButtonClick;
        end;

      with TButton.Create(WizardForm) do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(128), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Удалить';
          OnClick := @DelButtonClick;
        end;
    end;
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Последний раз редактировалось Serega, 04-01-2012 в 20:27. Причина: исправления

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

Отправлено: 21:21, 03-01-2012 | #555


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

Ветеран


Contributor


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

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


Serega, Лександер, спасибо за багрепорт, пофиксил скрипт для ANSI/Unicode:
читать дальше »

Код: Выделить весь код
[code]
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';

function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
    hInst: THandle;
    buf: array [0..255] of char;
    i, Res: Integer;
    strVerb: String;
    objShell, colVerbs: Variant;
begin
    if not FileExists(Filename) then Exit;
    if IsPin then Res := 5386 else Res := 5387;
    if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
        hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
        if hInst <> 0 then
        try
            for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
            try
                objShell := CreateOleObject('Shell.Application');
            except
                ShowExceptionMessage;
                Exit;
            end;
            colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
            for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        finally
            FreeDLL(hInst);
        end;
    end;
end;

procedure InitializeWizard();
begin
    PinToTaskbarWin7('c:\windows\notepad.exe', True);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:50, 03-01-2012 | #556


Ветеран


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

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


El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу, хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее...
Посмотрите функцию GetDllResourceStr в моём сообщении выше.

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.

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

Отправлено: 01:03, 04-01-2012 | #557


Аватара для XXXler

Ветеран


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

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


Цитата Лександер:
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции? »
дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет

есть еще один подводный камень - т.к. сам инсталятор 32bit и создаваемый OLE тоже выполняется в 32bit-контексте, закрепить программу из нативной x64 папки по нормальному не удаётся - ярлык закрепляется, но запущенная программа отображается отдельной кнопкой, которую можно/нужно закрепить вручную

Отправлено: 02:22, 04-01-2012 | #558


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Serega, проблема тут, теперь:

ПРимер El Sanchez, заработал.
Общий пример както так:

читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[*Code]
const
  LOAD_LIBRARY_AS_DATAFILE = $2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';

var
  AddBtn : TButton;
  Pined:Boolean;

function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
    hInst: THandle;
    buf: array [0..255] of char;
    i, Res: Integer;
    strVerb: String;
    objShell, colVerbs: Variant;
begin
    if not FileExists(Filename) then Exit;
    if IsPin then Res := 5386 else Res := 5387;
    if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
        hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
        if hInst <> 0 then
        try
            for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
            try
                objShell := CreateOleObject('Shell.Application');
            except
                ShowExceptionMessage;
                Exit;
            end;
            colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
            for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        finally
            FreeDLL(hInst);
        end;
    end;
end;

procedure AddDelClick(Sender: TObject);
begin
  case Pined of
    False:
    begin;
      // Присобачим Блокнот на панель задач
      PinToTaskbarWin7('c:\windows\notepad.exe', True);
      AddBtn.Caption := 'Удалить';
      Pined:=True;
    end;
    True:
    begin;
      // Уберем Блокнот на панель задач
      PinToTaskbarWin7('c:\windows\notepad.exe', False);
      AddBtn.Caption := 'Добавить';
      Pined:=False;
    end;
   end;
end;

procedure InitializeWizard();
begin
  if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
      AddBtn:= TButton.Create(WizardForm);
      with AddBtn do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Добавить';
          OnClick := @AddDelClick;
        end;
      Pined:=False;
    end;
end;


Цитата XXXler:
дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет »
Покажи мне, неумному, как это будет через секцию [Icons] выглядеть?

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

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

Отправлено: 10:43, 04-01-2012 | #559


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

Ветеран


Contributor


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

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


Цитата Лександер:
Serega, проблема тут, теперь:
читать дальше » »
Лександер, для юникода сменить тип переменной i на integer.

Цитата Serega:
El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу»
Serega, реализация мне понятна, но я выбрал цикл.

Цитата Serega:
хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее... »
Цитата El Sanchez:
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do »
В циклах со счетчиком начальные/конечные значения переменной цикла вычисляются один раз, поэтому LoadString не будет работать вхолостую.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:03, 04-01-2012 | #560



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Test ferget Тест-форум 0 24-08-2011 01:25
test ! ! Aaa ! ! Тест-форум 0 23-04-2011 11:29
test Santa aka Snt Тест-форум 0 16-04-2011 22:35
test xolod. Программное обеспечение Linux и FreeBSD 0 19-04-2009 21:03
Test memory KEugeNik Хочу все знать 11 23-11-2003 23:11




 
Переход