Скрипты Inno Setup. Помощь и советы [часть 5]

Ответить
 • Просмотры: 22
Аватара пользователя
AlexLAN

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение AlexLAN »

Доброго времени суток.

Недавно загорелся идеей создать репак игры, все шло хорошо до того момента когда понадобилось в ini файле игры прописать путь до нее самой, но при этом чтобы не была указана буква диска.



Нужно чтобы значение ключа принимало примерно такой вид:



Код:

Код: Выделить всё

IDPath=\Game\Нэнси Дрю. Секреты могут убивать

Пробовал писать функцию с командой delete, но так как познания паскаля давно забыты, ничего не вышло. Писал примерно следующее:



Код:

Код: Выделить всё

[INI]
Filename: "{app}\Game.ini"; Section: "Nancy Data"; Key: "IDPath"; String: {code:CutString|{app}};
Function CutString(CutStr: string): String;
Begin
  delete (CutStr,1,2);
end;

Прошу людей с прямыми руками (не такими как у меня Изображение) помочь довести до ума.
Аватара пользователя
El Sanchez

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение El Sanchez »

Здорово!

задача посложнее



Код:

Код: Выделить всё

[Files]
Source: {tmp}\DotNet.exe; DestDir: {tmp}; Components: framework; MinVersion: 0.0,5.01; Flags: deleteafterinstall
[Run]
Filename: {tmp}\DotNet.exe; Parameters: /S /nolang; StatusMsg: Microsoft .NET Framework устанавливается...Ждите...; Components: framework; MinVersion: 0.0,5.01
[Components]
Name: framework; Description: Microsoft .NET Framework 1.1 - 4.0; Check: IsX86; MinVersion: 0.0,5.01

нужно реализовать запуск с каждым ключом по отдельности, с запретом одновременного запуска

Перепакованный M$ .NET Framework (все версии)
Аватара пользователя
AlexLAN

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение AlexLAN »

El Sanchez

Спасибо, строка создалась верно.



Mailchik

Ваш способ не пробовал, но думаю что он тоже будет рабочим.



Спасибо за уделенное время Изображение
Аватара пользователя
SatHan

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение SatHan »

Всем привет. Подскажите, могу ли в функции



Код:

Код: Выделить всё

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);

вызывать



Код:

Код: Выделить всё

if IsTaskSelected('pintotaskbar') then

Вернее не то что могу ли, а будет ли от такого вызова толк. Отработает ли что при установке я ткнул нужнуб галку(сработало IsTaskSelected('pintotaskbar')).



Заранее спасибо.



El Sanchez



Вот окончательный мой код, работает и на х86 и на х64 системах, устанавливается и удаляется с таскбара корректно. Спасибо за помощь



Код:

Код: Выделить всё

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
	hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb, sVBSFile: String;
  objShell, colVerbs, oFile: Variant;
begin
  if (GetWindowsVersion shr 24 < 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF < 1)) then Exit; // Windows 7 check
  if not FileExists(Filename) then Exit;
  if IsPin then Res := 5386 else Res := 5387;
  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;
      oFile    := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename));
      colVerbs := oFile.Verbs;
      if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
        sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');
        SaveStringToFile (sVBSFile, \
          'Set oShell=CreateObject("Shell.Application")'  + #13 + \
          'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
          'For Each oVerb In oVerbs'											+ #13 + \
          '  If (oVerb="' + strVerb + '") Then'						+ #13 + \
          '    oVerb.DoIt'														    + #13 + \
          '    Exit For'															    + #13 + \
          '  End If'															        + #13 + \
          'Next'																, False);
        exec( ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
        DeleteFile (sVBSFile);
      end else begin
        for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin
			    if (IsPin and oFile.IsLink) then
				    DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (Filename));
          colVerbs.Item[i].DoIt;
          Break;
        end;
      end;
    finally
      FreeDLL(hInst);
    end;
  end;
end;
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Цитата Johny777:



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




не то. в случае может быть много обновлений. каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет?





такой вопрос. как сделать чтоб инсталятор обнаруживал запущенную программу и если она запущена то инсталятор выдал сообщение с предупреждением и закрылся?




Цитата Nasedkin Nikita:



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




панель нужна?

взято
отсюда
то что в первом посте.

в вложении прикрутил.
Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

Цитата Nasedkin Nikita:



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




Это скрипт
Need for Speed™ Undercover
Юршата, только поменяны картинки и стиль, не более. хотя, да, для многих замена картинки является поводом достаточным, чтоб решить, что скрипт уже совершенно другой, как это ни прискорбно. Куда мы катимся?
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
Johny777

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Johny777 »

А можно ли отрезать от страницы, к примеру SelectDirPage, маленький кусок размером, к примеру 190*30? Просто мне на этом месте InnerPage нужна, SelectDirPage загораживает!!! Спасибо!
Аватара пользователя
Ivan_009

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Ivan_009 »

Цитата SatHan:



каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет?
Скрипты Inno Setup. Помощь и советы [часть 5]




хз



ну да ладно


Цитата SatHan:



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




намутячил код Изображение (на основе модифицированного поиска по маске из шапки от Serega) и "Получение всех файлов в папке, с полными путями" Gnom_aka_Lexander



работает так

ищем сначала файлы по расширению (в данном случае .exe)

используя имена файлов добавляем эти самые имена в цикле в чеклистбокс состоящий из одних чекбоксов

имя файла = имя чекбокса

тут же это имя файла и путь пишется в статичный массив записей длиной в 201 элемент (извиняй. Здесь подошёл бы лучше динамичный, но я только начал знакомится с массивами)

те у нас например снаружи 10 экзешников(апдейтов) = 10 чекбоксов = 10 записей в массиве(в массиве с полными путями)



ну и на этапе утановки каком хочешь мы в зависимости от отмеченного чекбокса(-ов) запускаем тот или иной экзешник



код:


читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
[  Code]
var
  UpudatePage: TWizardPage;
  updList: TNewCheckListBox;
  arrUpd:array [0..200] of string;
procedure Find_Files_By_Mask(Path,Mask:string;cbBox:TNewCheckListBox);
var
  FSR: TFindRec;
  FindResult: Boolean;
  i:Integer;
begin
  i := 0;
  if Path[Length(Path)]  '\' then Path:= Path + '\';
  FindResult:= FindFirst(Path + Mask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
      begin
        cbBox.AddCheckBox(FSR.Name, '', 0, True, True, True, True, nil);
        arrUpd[i] := Path + FSR.Name;
        i := i + 1;
      end;
      FindResult:= FindNext(FSR);
    end;
  finally
    FindClose(FSR);
  end;
end;
procedure InitializeWizard();
begin
  UpudatePage := CreateCustomPage(wpWelcome, 'Список Файлов обновления', 'что установить ?');
  updList := TNewCheckListBox.Create(WizardForm);
  with updList do
  begin
    Parent := UpudatePage.Surface;
    SetBounds(ScaleX(0),ScaleY(0),UpudatePage.SurfaceWidth,UpudatePage.SurfaceHeight - ScaleY(30));
  end;
  Find_Files_By_Mask(ExpandConstant('{src}'),'*.exe',updList);
  updList.Items.Delete(updList.Items.IndexOf('setup.exe'));
  MsgBox(arrUpd[1], mbInformation, MB_OK);  
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
  i, ErrorCode: Integer;
begin
  i:=0
  if CurStep = ssInstall then
  begin
    repeat
      if updList.Checked[i] then Exec(arrUpd[i], '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
      MsgBox(IntToStr(i), mbInformation, MB_OK);
      i := i + 1;
    until i = updList.ItemCount;
  end;
end;








Цитата SatHan:



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




в шапке есть 2 кода на определение работающего процесса

оба кода возвращают булев значение

попробуй ка сам на основе этого сообщения с кодом и функций из шапки сделать себе пример

Скрипты Inno Setup. Помощь и советы [часть 5]
Аватара пользователя
Gnom_aka_Lexander

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Gnom_aka_Lexander »

Цитата Johny777:



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




я пробовал сам на основе рунтаск. вот код


читать дальше »




Код:

Код: Выделить всё

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy
[#Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function InitializeSetup(): Boolean;
begin
  If RunTask('notepad.exe', false) then
    begin
      MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation,  MB_OK);
          Exit;
    end;
Result:=True;
end;



на большее мозгов не хватает.это по крайне мере лучший вариант

не устраивает ISTask.dll. хотелось бы без него обойтись еси можна.
Аватара пользователя
Ivan_009

Re: Скрипты Inno Setup. Помощь и советы [часть 5]

Сообщение Ivan_009 »

Цитата SatHan:



не устраивает ISTask.dll. хотелось бы без него обойтись еси можна.
Скрипты Inno Setup. Помощь и советы [часть 5]






Код:

Код: Выделить всё

const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';
function IsProcessRunning(FileName: String): Boolean;
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
begin
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
  pe32.dwSize := sizeof(pe32);
  if not Process32First(hProcessSnap, pe32) then Exit;
  while not Result and Process32Next(hProcessSnap, pe32) do
  begin
    szExeFile := '';
    while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
    Result := LowerCase(FileName) = LowerCase(szExeFile);
  end;
  CloseHandle(hProcessSnap);
end;
function InitializeSetup(): Boolean;
begin
  If IsProcessRunning('notepad.exe') then begin
    MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation,  MB_OK);
    Exit;
  end;
Result:=True;
end;
Ответить

Вернуться в «Автоматическая установка приложений»