PDA

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


Страниц : 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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

habib2302
08-05-2013, 23:56
люди помогите мне.я делаю русификатор.как сделать так,чтобы инсталятор сам определил где в какой папке находтся программа?

saurn
09-05-2013, 00:46
habib2302,
Указываете в качестве DefaultDirName ключ реестра, содержащий информацию о рабочей папки программы.
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\My Program}

vint56
09-05-2013, 08:05
habib2302,
Вариант1
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={code:GetInstallDir}
AppendDefaultDirName=no

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

[Code]
Function GetInstallDir(Path: String ): String;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Rockstar Games\EFLC', 'InstallPath', Path);//Какой ключ реестра ищет ...
Result := Path;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if not RegKeyExists(HKLM, 'SOFTWARE\Rockstar Games\EFLC') then
MsgBox('Игра {#SetupSetting("AppName")} не найдена! Укажите путь к папке с игрой вручную!', mbinformation, mb_ok);
end;

Вариант 2:
[Setup]
AppName=GetDeviceInfo
AppVerName=GetDeviceInfo
DefaultDirName={code:GetInstallDir}

[Code]
Function GetInstallDir( AppID: String ): String; var dir: String;
begin
if not RegQueryStringValue(HKLM, 'SOFTWARE\Company\ProgramNamePro', 'InstallLocation', dir) then
RegQueryStringValue(HKLM, 'SOFTWARE\Company\ProgramNameLight', 'InstallLocation', dir);
Result:= dir;
end;

function InitializeSetup(): Boolean;
begin
Result:= True;
if not RegKeyExists(HKLM, 'SOFTWARE\Company\ProgramNamePro') then
begin
if not RegKeyExists(HKLM, 'SOFTWARE\Company\ProgramNameLight') then
begin
MsgBox('Программа не найдена!', mberror, mb_ok);
Result:=False;
end;
end;
end;

Gnom_aka_Lexander
09-05-2013, 10:04
vint56, более корректно все-таки, это делать по AppID.да и гемора гораздо меньше. Меньше кода - меньше ошибок и глюков. Да и подавляющее большинство пачей, дополнений и тому подобной дряни - ищут программу именно по AppID в разделе Uninstall.

41275jur
09-05-2013, 12:16
Спасибо всем за помощь.
страничка с двумя эдитами - кастомная страница, создавать нужно в секции [code] »
Это мой первый скрипт и секция для меня пока сильно сложная. Буду пробовать ваять.
Пока у меня получилось только это
http://i48.fastpic.ru/thumb/2013/0509/b3/bd89e484bac91ea2a8a7bcfc82ecb5b3.jpeg (http://fastpic.ru/view/48/2013/0509/bd89e484bac91ea2a8a7bcfc82ecb5b3.png.html)
[CODE][Code]
var
DataDirPage: TInputDirWizardPage;

procedure InitializeWizard;
begin
{ Create the pages }

DataDirPage := CreateInputDirPage(wpSelectDir,
'Параметры по умолчанию', 'Установка папки по умолчанию',
'Чтобы продолжить, нажмите кнопку Далее. Если вы хотите выбрать различные папки, нажмите кнопку Обзор',
False, 'D:\');
DataDirPage.Add('');

{ Set default values, using settings that were stored last time if possible }

DataDirPage.Values[0] := GetPreviousData('DataDir', '');
end;

procedure RegisterPreviousData(PreviousDataKey: Integer);
var
UsageMode: String;
begin
{ Store the settings so we can restore them next time }
SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode);
SetPreviousData(PreviousDataKey, 'DataDir', DataDirPage.Values[0]);
end;
И то папка по умолчанию не ставится и не знаю как добавить ниже текст и эдитам.

Подскажите еще где нужно исправить в скрипте, что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку.

41275jur
09-05-2013, 13:33
Подскажите как сделать эти два файла скрытыми
[Files]
Source: {app}\Dvd_icon.ICO; DestDir: {app}; Flags: ignoreversion
Source: {app}\Dvd_uninstall.ico; DestDir: {app}; Flags: ignoreversion

Gnom_aka_Lexander
09-05-2013, 13:46
41275jur, hidden добавить во флаги. в справке-же есть.

saurn
09-05-2013, 13:49
И то папка по умолчанию не ставится и не знаю как добавить ниже текст и эдитам.
Подскажите еще где нужно исправить в скрипте, что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку. »
[Code]
var
DataDirPage: TInputDirWizardPage;

function InitializeSetup(): Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
begin
MsgBoxEx(0, 'Данная программа уже установленна', '', MB_OK, 0, 0)
Result := False
end else
Result := True;
end;

procedure InitializeWizard;
begin
DataDirPage := CreateInputDirPage(wpSelectDir, 'Параметры по умолчанию', 'Установка папки по умолчанию', 'Чтобы продолжить, нажмите кнопку Далее. Если вы хотите выбрать различные папки, нажмите кнопку Обзор', False, '');
DataDirPage.Add('');
DataDirPage.Add('');

DataDirPage.Values[0] := 'D:\';
DataDirPage.Values[1] := 'D:\';
end;

Подскажите как сделать эти два файла скрытыми »
[Files]
Source: {app}\Dvd_icon.ICO; DestDir: {app}; Flags: ignoreversion; attribs: hidden;
Source: {app}\Dvd_uninstall.ico; DestDir: {app}; Flags: ignoreversion; attribs: hidden;


Советую прикрутить сюда код для автоопределения диска установки из шапки http://forum.oszone.net/post-1217528-97.html , мало ли, вдруг у конечного пользователя не будет диска D

El Sanchez
09-05-2013, 14:05
{code:settingsdir|workdir} - что оно обозначает »
41275jur, означает, что строковая константа есть результат функции settingsdir(param: String): String со значением переданного в нее строкового параметра, равным 'workdir', и описанной в секции Code. Подробнее: Inno Setup Help - Pascal Scripting - Scripted Constants.

В реестре оригинальный инсталлятор прописывает ключ
Код:
[HKEY_LOCAL_MACHINE\SOFTWARE\DVD Rebuilder]
"Working_Path"="D:\\"
"Output_Path"="D:\\" »
SetPreviousData(PreviousDataKey, 'UsageMode', UsageMode);
SetPreviousData(PreviousDataKey, 'DataDir', DataDirPage.Values[0]); »
Оригинальный инсталлятор читает эти пути из своего раздела реестра, необходимости в SetPreviousData нет, значение по умолчанию (D:\) не должно быть жестко заданным, у пользователя может оказаться только один логический диск. Можно взять первый логический диск после системного, а при отсутствии других дисков кроме системного брать сам системный. По крайней мере так я и реализовал.

что бы программа перед установкой определяла установлена ли программа (AviSynth) или нет. Если не установлена, то запускала установку. »
41275jur, оригинал лезет в реестр в раздел деинсталлятора AviSynth и проверяет на пустое значение параметр DisplayName. Такой подход провалится, если программы на компе уже нет, а реестровые хвосты остались, поэтому лучше находить в реестре параметр, содержащий путь, и по полученному пути определить жив ли какой-либо файл по этому пути. Такая двойная проверка увеличивает шансы корректного определения наличия программы. У Inno немного таких параметров с путями, первый - InstallLocation - выдаст программную папку приложения, в ней уже можно проверить наличие или отсутствие, скажем, главного исполняемого файла программы, второй - UninstallString - выдаст полный путь к файлу деинсталлятора. У AviSynth в наличии только параметр UninstallString, его-то и будем использовать.



[Code]
#define A = (Defined UNICODE) ? "W" : "A"

const
MAX_PATH = 260;
DRIVE_FIXED = 3;

function GetLogicalDriveStrings(nBufferLength: DWORD; var lpBuffer: Char): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';

var
FoldersPage: TInputDirWizardPage;

//////////////////////////////////////////////////
function settingsdir(const param: String): String;
begin
case param of
'workdir': Result := FoldersPage.Values[0];
'finishdir': Result := FoldersPage.Values[1];
end;
end;

/////////////////////////////////////////////////////////////////
function GetFirstDriveAfterSystem(const Default: String): String;
var
i: Integer;
buf: array [0..MAX_PATH-1] of Char;
begin
Result := Default;
while i < GetLogicalDriveStrings(SizeOf(buf), buf[0])-3 do
begin
Result := Format('%s:\', [buf[i]]);
if (GetDriveType(Result) = DRIVE_FIXED) and (CompareText(Result, Default) <> 0) then Break;
i := i + 4;
end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
FoldersPage := CreateInputDirPage(wpSelectProgramGroup, CustomMessage('titleset'), CustomMessage('explset'), SetupMessage(msgSelectDirBrowseLabel), False, '');
FoldersPage.Add(CustomMessage('WorkFolder'));
FoldersPage.Add(CustomMessage('OutFolder'));
FoldersPage.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\DVD Rebuilder,Working_Path|{code:GetFirstDriveAfterSystem|{sd}\}}');
FoldersPage.Values[1] := ExpandConstant('{reg:HKLM\SOFTWARE\DVD Rebuilder,Output_Path|{code:GetFirstDriveAfterSystem|{sd}\}}');
end;

////////////////////////////////////
function InitializeSetup(): Boolean;
var
ResultCode: Integer;
begin
Result := FileExists(RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal l\AviSynth,UninstallString|}')));
if not Result then
begin
if MsgBox(ExpandConstant('{cm:noAviSynth1}{cm:noAviSynth2}{cm:noAviSynth3}{cm:noAviSynth4}'), mbError, MB_YESNO) = IDYES then
begin
ExtractTemporaryFile('AviSynth_255.exe');
Exec(ExpandConstant('{tmp}\AviSynth_255.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
Result := ResultCode = 0;
if not Result then MsgBox(ExpandConstant('{cm:noAviSynth5}{cm:noAviSynth6}{cm:noAviSynth7}{cm:noAviSynth8}'), mbError, MB_OK);
end;
end;
end;

Johny777
09-05-2013, 22:56
портировал с делфи интересную функцию ( GetEnvironmentVariable(...) ), кому надо забирайте:

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

// Environment Variables:

// ALLUSERSPROFILE
// APPDATA
// BDS
// CLIENTNAME
// CommonProgramFiles
// COMPUTERNAME
// ComSpec
// Cor_Debugging_Control_424242
// DBCONFIG
// DBROOT
// DBWORK
// HOMEDRIVE
// HOMEPATH
// INCLUDE
// LIB
// LOGONSERVER
// NUMBER_OF_PROCESSORS
// OS_ROOTDIR
// OS_TMPDIR
// OS
// Path
// PATHEXT
// PROCESSOR_ARCHITECTURE
// PROCESSOR_IDENTIFIER
// PROCESSOR_LEVEL
// PROCESSOR_REVISION
// ProgramFiles
// SESSIONNAME
// SystemDrive
// SystemRoot
// TEMP
// TMP
// USERDOMAIN
// USERNAME
// USERPROFILE
// windir

function GetEnvironmentVariable(lpName, lpBuffer: String; nSize: DWORD): DWORD; external 'GetEnvironmentVariable{#A}@kernel32.dll stdcall';

function GetEnvVar(const VariableName: String): String;
var
Len: DWORD;
begin
Len := GetEnvironmentVariable(VariableName, '', 0);
if Len > 0 then
begin
SetLength(Result, Len);
GetEnvironmentVariable(VariableName, Result, Len);
end;
end;


procedure InitializeWizard();
begin
MsgBox(GetEnvVar('PROCESSOR_IDENTIFIER'), mbInformation, MB_OK);
end;

ABBAT
10-05-2013, 07:47
Johny777, низкий поклон Вам за помощь с скриптами (удачи будте Счастливы http://www.kolobok.us/smiles/big_standart/hi.gif ) http://www.kolobok.us/smiles/rpg/wizard.gif

evoll@vk
11-05-2013, 00:14
помогите распотрошить и воссоздать полностью этот инсталлер как есть. http://rghost.ru/45906542

audiofeel
11-05-2013, 01:00
evoll@vk, да вроде ни че там такого нет (нужно что то конкретное узнать, )
там прекомп 038, унарк 2010 года, да рт консоль. Вам что нужно внешнее сходство без исдон или с исдон

evoll@vk
11-05-2013, 08:40
evoll@vk, да вроде ни че там такого нет (нужно что то конкретное узнать, )
там прекомп 038, унарк 2010 года, да рт консоль. Вам что нужно внешнее сходство без исдон или с исдон »
у меня банально почему то не выходит правильно распаковать чтобы был правильный iss

insombia
11-05-2013, 10:29
evoll@vk примерно так как тебе нужно,http://rghost.ru/45911273
добавишь isdone,примеры для текстурирования папок есть в закосе под механиков

saurn
12-05-2013, 05:47
Всем привет. С прошедшими праздниками! В шапке есть пример http://forum.oszone.net/post-1444931-2009.html по закреплению ярлыка в панели задач семерки. Вопрос, как сделать так, чтобы процедура выполнения *.vbs пропускалась, если такой ярлык уже есть. Пробовал так:
if not FileExists(AddBackslash(ExpandConstant('{userappdata}')) + AddBackslash('Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar') + '{#ApplicationName}.lnk') then
ShellExec('Open', AddBackslash(ExpandConstant('{tmp}')) + 'PinToTasckbar.vbs', '"""' + AddBackslash(ExpandConstant('{app}')) + 'Binaries\Win32\{#GameExe}' + '"""', ExpandConstant('{tmp}'), SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
Не выходит. Выполняется в любом случае - есть ярлык или нет его.

habib2302
12-05-2013, 17:45
saurn,
мне автор давал доработанный скрипт.держи
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExW@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadStringW@user32.dll stdcall';

// 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;

а вот так юзать:
при инсталле - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
при удалениее - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);

только я не знаю как этот код присвоить к секции tasks т.е чтобы можно было выбрать создавать ярлык или нет.и незнаю куда этот код пихать
при инсталле - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
при удалениее - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);
и что нужно писать в секции icons
если этот скрипт будет работать,то скинь мне его

saurn
12-05-2013, 18:13
только я не знаю как этот код присвоить к секции tasks т.е чтобы можно было выбрать создавать ярлык или нет »
if IsTaskSelected('ляляля') then
PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
и незнаю куда этот код пихать »
По логике:
В CurStepChanged на шаге ssPostInstall - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
В CurUninstallStepChanged на шаге usUninstall - PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), False);
В секции icons писать ничего не нужно, тут все делается через code. Спасибо. Попробую позже.

audiofeel
12-05-2013, 18:23
evoll@vk, помогите распотрошить и воссоздать полностью этот инсталлер как есть. »
Смотрю я опаздал, но не выкидывать же, я сделал вместе с исдон - держите = http://rghost.ru/45948186

by_gangster
13-05-2013, 09:40
Здравствуйте, возник вопрос по скрипту который качает файлы из интернета... Проблема в том что он после скачивания из временной папки (temp) должен перенести файл в указанную папку при инсталляции, но он этого не делает... В строке itd_addfile('http://sayt.ru/1.rar',expandconstant('{tmp}\1.rar')); tmp менял на src (т.е что бы файл лежал рядом с инсталлом) тогда он ложит файл рядом с инсталломЮ но опятть же его он не переносит в указанную папку...


[_Code]
procedure InitializeWizard();
begin
itd_init;
itd_addfile('http://sayt.ru/1.rar',expandconstant('{tmp}\1.rar'));


//Start the download after the "Ready to install" screen is shown
itd_downloadafter(wpReady);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin //Lets install those files that were downloaded for us
filecopy(expandconstant('{src}\1.rar'),expandconstant('{app}\1.rar'),false);

end;
end;




© OSzone.net 2001-2012