Войти

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


Страниц : 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

Gnom_aka_Lexander
18-07-2012, 20:34
mismatched or misplaced quotes on parameter "Filename" »
несоответствие или неуместные кавычки в параметре "Filename"
убери кавычки, у меня их не было.Filename: {uninstallexe}; »

AndreY33_80
18-07-2012, 21:32
А окно при деинсталяции как можно скрыть ?

Gnom_aka_Lexander
18-07-2012, 21:45
[Icons]
Name: {group}\{cm:UninstallProgram, My Application}; Filename: {uninstallexe}; Parameters: /VERYSILENT;

t16bz
19-07-2012, 05:36
Возможно ли как-то изменить окно выбора папки установки? Если да, поделитесь, пожалуйста, примером.

mariolast
19-07-2012, 09:54
[q=El Sanchez]определение рабочей папки процесса:
« скрыть
Код:

#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
TH32CS_SNAPPROCESS = $2;
INVALID_HANDLE_VALUE = -1;
PROCESS_QUERY_INFORMATION = $400;
PROCESS_VM_READ = $10;
MAX_PATH = 260;

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';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
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';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@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 GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
hProcessSnap, hProc: THandle;
pe32: TPROCESSENTRY32;
szExeFile: array [0..MAX_PATH-1] of Char;
szProcName: String;
i, iLen: Integer;
begin
SetArrayLength(Result, 0);
hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := sizeof(pe32);
if not Process32First(hProcessSnap, pe32) then Exit;
while Process32Next(hProcessSnap, pe32) do
begin
szProcName := '';
while not (pe32.szExeFile[Length(szProcName)] = #0) do szProcName := szProcName + pe32.szExeFile[Length(szProcName)];
if CompareText(szProcName, ProcessName) = 0 then
begin
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
iLen := GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH);
if iLen > 0 then
begin
SetArrayLength(Result, GetArrayLength(Result)+1);
for i := 0 to iLen-1 do Result[GetArrayLength(Result)-1] := Result[GetArrayLength(Result)-1] + szExeFile[i];
Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
end;
CloseHandle(hProc);
end;
end;
CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
szArray: TArrayOfString;
i: Integer;
begin
//хочу знать откуда калькуляторы запущены
szArray := GetProcessWorkingDirectory('calc.exe');
if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;

С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет.
Может кто поправить?

Gnom_aka_Lexander
19-07-2012, 10:44
реестр для меня тёмный лес »
Без разницы, в принципе. если запускать деинсталл напрямую - то тихого удаления не будет в любом случае. Тогда уж нужно объединять ярлык и реестр - ярлык дает тихое удаление из меню пуск а реестр - из панели управления.

Johny777
19-07-2012, 11:44
Gnom_aka_Lexander,

можно так (спасибо El Sanchez-у)
тихое удаление (с месседжбоксом "Да Нет" вначале и в конце (удаление завершено Ок)):

#define MyAppName "DisksInfo"

[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
Errorcode: Integer;
begin
Result := False;

if not UninstallSilent then
begin
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
Exit;
end;

if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
begin
Result := True;
MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
end
else Result := False;
end;


полностью тихое удаление:

[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
ErrorCode: Integer;
begin
Result := False;

if not UninstallSilent then
begin
Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
Exit;
end;

Result := True;
end;


=======================================================================

Возможно ли как-то изменить окно выбора папки установки? Если да, поделитесь, пожалуйста, примером. »
t16bz, выдираю у себя из скрипта! :)


[Setup]
AppId=The_Most_Beautiful_and_Unicue_AppId_Ever_Made
AppName=The_Best_App
VersionInfoVersion=7.1
AppVerName=The_Best
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\The_Best_App}


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


[CustomMessages]
Russian.Reset=Сброс
English.Reset=Reset


[code]
var
BrowseForm: TSetupForm;
DirTreeView: TFolderTreeView;
Edit: TNewEdit;


procedure DirFolderChange(Sender: TObject);
begin
if DirTreeView.Directory <> WizardForm.DirEdit.Text then
Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}' else
Edit.Text := DirTreeView.Directory;
end;


procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
case TButton(Sender).Tag of
15: Edit.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));

16: begin
DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
end;

17: if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
end;
end;



procedure BrowseClick(Sender: TObject);
begin
BrowseForm := CreateCustomForm();
with BrowseForm do
begin
Width := ScaleX(389);
Height := ScaleY(390);
Caption := SetupMessage(msgBrowseDialogTitle);
CenterInsideControl(WizardForm, False);

with TLabel.Create(nil) do
begin
SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
Caption := SetupMessage(msgBrowseDialogLabel);
Parent := BrowseForm;
Font.Size := 8;
end;

DirTreeView := TFolderTreeView.Create(nil)
with DirTreeView do
begin
SetBounds(ScaleX(4), ScaleY(52), ScaleX(376), ScaleY(265));
OnChange := @DirFolderChange;
Parent := BrowseForm;
end;

Edit := TNewEdit.Create(nil);
with Edit do
begin
SetBounds(ScaleX(4), ScaleY(25), ScaleX(376), ScaleY(21));
Text := DirTreeView.Directory;
Parent := BrowseForm;
Font.Color := clWindowText;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonCancel);
Cursor := crHand;
ModalResult := mrCancel;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := ExpandConstant('{cm:Reset}');
Tag := 15;
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonNewFolder);
Tag := 16;
Cursor := crHand;
OnClick := @BrowseForm_Buttons_OnClick;
end;

with TButton.Create(nil) do
begin
SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
Parent := BrowseForm;
Caption := SetupMessage(msgButtonOK);
Tag := 17;
OnClick := @BrowseForm_Buttons_OnClick;
Cursor := crHand;
ModalResult := mrOk;
end;

DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
ShowModal;
Free;
end;
end;

procedure InitializeWizard;
begin
WizardForm.DirBrowseButton.Hide;

with TButton.Create(nil) do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
Caption := SetupMessage(msgButtonBrowse);
OnClick := @BrowseClick;
Cursor := crHand;
end;
end;


отличия:
у меня по определённым причинам новая папка имеет название New Folder
здесь вернул константу
изменил координаты расположения окна (у меня окно инсталла больше стандартного и поэтому координаты другие)

L1nk3R
19-07-2012, 21:13
Привет.
Может кто подскажет,возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма?
На примере этого поста http://forum.oszone.net/post-1954373-453.html, только не выкатывалась а появлялась, ну в общем почти как контекстное меню.

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Icons]
Name: "{commondesktop}\Моя программа"; Filename: "{app}\MyProg.exe"

[*Code]
var
Button: TNewButton;
procedure RedesignWizardForm;
begin
Button := TNewButton.Create(WizardForm);
with Button do
begin
Name := 'Button';
Parent := WizardForm.SelectProgramGroupPage;
Left := ScaleX(342);
Top := ScaleY(104);
Width := ScaleX(75);
Height := ScaleY(25);
end;

Button.TabOrder := 5;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end;
Спасибо.

L1nk3R
20-07-2012, 03:14
Где посмотреть? Тихое удаление не нужно. Причём тут тихое удаление?
Надо чтоб например рядом с кнопкой [Обзор] была такая кнопочка со стрелочкой при нажатии на которую выпадала форма как контекстное меню. Только чтоб находилась рядом с кнопкой (под кнопкой), чтоб нельзя было двигать и не было крестика закрыть. Кликнул - Открылась, кликнул ещё раз или на основную форму или даже на рабочем столе, то она сама закрылась.

Почти так
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Icons]
Name: "{group}\My Application"; Filename: "{app}\MyProg.exe"

[*Code]
var
Button: TNewButton;

procedure Button1Click(Sender: TObject); forward;

function CreateForm: Integer;
begin
with CreateCustomForm do
begin
ClientWidth := ScaleX(256);
ClientHeight := ScaleY(256);
Position := poScreenCenter;
ShowModal;
Free;
end;
end;

procedure Button1Click(Sender: TObject);
begin
CreateForm;
end;

procedure RedesignWizardForm;
begin
with WizardForm.DirBrowseButton do
begin
Left := ScaleX(310);
end;

with WizardForm.DirEdit do
begin
Width := ScaleX(300);
end;

Button := TNewButton.Create(WizardForm);
with Button do
begin
Name := 'Button';
Parent := WizardForm.SelectDirPage;
Left := ScaleX(384);
Top := ScaleY(67);
Width := ScaleX(27);
Height := ScaleY(23);
Caption := '..';
OnClick := @Button1Click;
end;
end;

procedure InitializeWizard();
begin
RedesignWizardForm;
end; но не так.
Даже не знаю как объяснить.

Johny777
20-07-2012, 12:01
L1nk3R, ну ты чувак спросил
возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма? »
Где посмотреть? »
во второй половине адресованной товарищу t16bz пример в которм при нажатии на кнопку "обзор" создаётся форма обзора *(кастомная). Это самый точный ответ и был! :)
теперь я начал понимать...
ты ведь типа такого хочешь (контекстное меню = PopUp Menu выпадает из кнопки)?

пример:

#ifdef IS_ENHANCED
#if (Ver < 0x5020300) || (Pos('ee', IS_Ver_Str) < 1)
#pragma error 'Enhanced edition of Inno Setup (5.2.3.ee1 or higher) is required to compile this script'
#endif
#else
#error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[code]
var
PupMnu: TPopupMenu;
btn: TButton;

procedure BtnOnClick(Sender: TObject);
var
p: TPoint;
begin
p.x := btn.Left;
p.y := btn.Top + btn.Height;
p := Wizardform.ClientToScreen(p);
PupMnu.Popup(p.x, p.y);
end;

procedure Menu1OnClick(Sender: TObject);
begin
MsgBox('Menu 1 OnClick!', mbInformation, MB_OK);
end;

procedure Menu2OnClick(Sender: TObject);
begin
MsgBox('Menu 2 OnClick!', mbInformation, MB_OK);
end;

procedure InitializeWizard();
var
Mnu: TMenuItem;
begin
PupMnu := TPopupMenu.Create(WizardForm);
// Menu 1
Mnu := TMenuItem.Create(WizardForm);
Mnu.Caption := 'Menu 1';
Mnu.OnClick := @Menu1OnClick;
PupMnu.Items.Add(Mnu);
// Menu 2
Mnu := TMenuItem.Create(WizardForm);
Mnu.Caption := 'Menu 2';
Mnu.OnClick := @Menu2OnClick;
PupMnu.Items.Add(Mnu);
// btn
btn := TButton.Create(WizardForm);
btn.Caption := 'Popup Menu';
btn.SetBounds(ScaleX(10), ScaleY(320), ScaleX(100), ScaleY(28));
btn.Parent := WizardForm;
btn.OnClick := @BtnOnClick;
btn.PopupMenu := PupMnu;
end;


и убери пожалуйста оба своих кода дополнительно под спойлер в твой код

El Sanchez
20-07-2012, 13:21
С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет. »

mariolast, все из-за GetModuleFileNameEx:

However, it will result in an error (ERROR_PARTIAL_COPY) when a 32-bit client is calling this function on a 64-bit process.

Переделал (http://forum.oszone.net/post-1945281-380.html) через GetProcessImageFileName, как на MSDN советовали.

Johny777
20-07-2012, 13:42
El Sanchez,
может есть более быстрый способ определения размера папки с выводом Integer?
http://forum.oszone.net/post-1953820-451.html
если нет, то не проблема
могу просто проверить само наличие папки :)

Gnom_aka_Lexander
20-07-2012, 13:53
IsProc2.dll поскольку проект IsProc был заброшен, по всей видимости, (я чего-то даже ссылку сейчас не нашел...) и давно не соответствует реалиям жизни (кривая работа в Windows Vista и выше), набросал аналог, с учетом именно этих систем. Работа в системе ниже ХР не гарантируется.
Точнее, могу гарантировать ошибки на системе ниже ХР :)
Итак, встречаем:
Библиотека, выводящая список процессов в указанной папке, с возможностью их закрытия.
Скачать (http://forum.oszone.net/attachment.php?attachmentid=85211&d=1342778008)
Тестим, отписываемся.
С закрытием процессов - аккуратнее, внимательнее указываем папку процесса. потом встрою защиту от закрытия процессов из системных папок.
А я пока, в деревню на грядки поехал :)

El Sanchez
20-07-2012, 15:35
может есть более быстрый способ определения размера папки с выводом Integer? »
Johny777, нету. Только считать.

Библиотека, выводящая список процессов в указанной папке, с возможностью их закрытия. »
Gnom_aka_Lexander, не импортируются функции - Cannot import dll бла-бла. WinXP SP3 x86.
P.S. Из-за QueryFullProcessImageName. Эта функция от Vista и выше.

Gnom_aka_Lexander
20-07-2012, 15:45
El Sanchez, Юникод? писал под анси, там явный вызов именно ансишных функций.

El Sanchez
20-07-2012, 16:44
Юникод? писал под анси, там явный вызов именно ансишных функций »
Gnom_aka_Lexander, у меня ANSI. Дело не в компиляторе, проблема в вызове функции QueryFullProcessImageName (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx) (читать статью и Community Additions), которая находится в kernel32.dll, начиная с Vista.

Gnom_aka_Lexander
20-07-2012, 16:55
El Sanchez,Уже понял, обойдусь без нее. Как всегда придется через задницу делать.. Но возможности задницы, как известно, практически неограниченны :D

L1nk3R
20-07-2012, 21:02
Привет.
теперь я начал понимать...
ты ведь типа такого хочешь (контекстное меню = PopUp Menu выпадает из кнопки)? »Именно оно самое. Только чтоб форма выпадала на которую можно б было повесить кнопочку или тот же GroupBox.

Johny777, а там препроцессор обязателен или как то можно обойтись без него?

alert30
23-07-2012, 19:12
Добрый вечер! После копирование архивов *.arc и его распаковки, я хочу удалить. После удаления, удаляется только архив *.arc, а вот распакованный архив нет. Как сделать так, чтобы вместе удалились и где дописывать этот код, чтобы удалить вместе с файлом, который распаковался из *.arc? Вот скрипт.

Johny777
23-07-2012, 20:06
может так
[UninstallDelete]
Type: filesandordirs; Name: {app} // трет всю папку в которую уcтановил




© OSzone.net 2001-2012