Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
Dinvin4ester
27-06-2013, 20:39
Как вы и сказали в исдон - // добавил и все .
Dinvin4ester, все работает
http://rghost.ru/47060078
Dinvin4ester
27-06-2013, 21:19
vint56,
И еще задам нубский вопрос - куда прописать саму папку и файлы ехе ? А то компилирую и ставится сам скрипт .
Dinvin4ester, отвечаю на твой последний вопрос а дальше читай справку
[Files]
Source: "C:\Games\Ubisoft\Tom Clancy's Splinter Cell Chaos Theory\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Dinvin4ester
27-06-2013, 21:36
vint56,
Все , все благодарю и удаляюсь с темы . Спасибо что возились со мной .
Dinvin4ester
28-06-2013, 22:30
Ребя и опять я . Хочу узнать как прописать в скрипте установку русификатора на выбор и таблеток тоже . Куда и что прописать ? Спасибо .
Dinvin4ester
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Types]
Name: full; Description: Full installation; Flags: iscustom
[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;
Name: nodvd; Description: Язык озвучки; Types: full; Flags: fixed
Name: nodvd\1; Description: Таблетка RELOADED; Flags: exclusive;
Name: nodvd\2; Description: Таблетка SKIDROW; Flags: exclusive;
[Files]
Source: "RusText\*"; DestDir: "{app}"; Flags: ignoreversion; Components: text\rus;
Source: "EngText\*"; DestDir: "{app}"; Flags: ignoreversion; Components: text\eng;
Source: "RusVoice\*"; DestDir: "{app}"; Flags: ignoreversion; Components: voice\rus;
Source: "EngVoice\*"; DestDir: "{app}"; Flags: ignoreversion; Components: voice\eng;
Source: "NoDVD 1\*"; DestDir: "{app}"; Flags: ignoreversion; Components: nodvd\1;
Source: "NoDVD 2\*"; DestDir: "{app}"; Flags: ignoreversion; Components: nodvd\2;
Lex_from_Belarus
29-06-2013, 00:41
подскажите, так инсталятор созданный версией 5.5.1 не распаковывается?
Lex_from_Belarus,
Если версия Inno расширенная, то и не распакуется.
habib2302
29-06-2013, 14:07
доброе время суток.Помогите мне решить одну проблему.Короче.я использую код для удаления других приложений.
[ code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
WAIT_OBJECT_0 = $0;
STARTF_USESHOWWINDOW = 1;
NORMAL_PRIORITY_CLASS = $00000020;
INFINITE = $FFFFFFFF; { Infinite timeout }
type
_STARTUPINFO = record
cb: DWORD;
#ifdef UNICODE
lpReserved, lpDesktop, lpTitle: PAnsiChar;
#else
lpReserved, lpDesktop, lpTitle: PChar;
#endif
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
wShowWindow, cbReserved2: Word;
lpReserved2: Byte;
hStdInput, hStdOutput, hStdError: THandle;
end;
_PROCESS_INFORMATION = record
hProcess: THandle;
hThread: THandle;
dwProcessId: DWORD;
dwThreadId: DWORD;
end;
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
#ifdef UNICODE
function CreateProcess(lpApplicationName, lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#else
function CreateProcess(lpApplicationName, lpCommandLine: PChar; lpProcessAttributes, lpThreadAttributes: Longint; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment, lpCurrentDirectory: PChar; const lpStartupInfo: _STARTUPINFO; var lpProcessInformation: _PROCESS_INFORMATION): BOOL; external 'CreateProcess{#A}@kernel32.dll stdcall';
#endif
function UninstallMyApp(): Boolean;
var
pi: _PROCESS_INFORMATION;
si: _STARTUPINFO;
Buff: String;
i: Integer;
begin
if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}'));
Result := Buff = '';
if not Result then
begin
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWNORMAL;
#ifdef UNICODE
if not CreateProcess('', PAnsiChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#else
if not CreateProcess('', PChar(Buff), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#endif
begin
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
Exit;
end;
try
while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
finally
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
Result := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSe tting("AppID")}_is1,UninstallString|}')) = '';
end;
end;
end;
function InitializeSetup(): Boolean;
begin
Result := UninstallMyApp();
end;
при первом запуске появляется диалог
http://img221.imageshack.us/img221/1691/e6mn.png (http://img713.imageshack.us/img713/1057/d0a.png)
но программа ранее не была установлена
вот мой скрипт (http://rghost.ru/47095373)
habib2302, если мне не изменяет память, в оригинале у Johny777 это код выглядит несколько иначе:
function GetUninstallPath(const AppIds: array of String): array of String;
var
StringList: TStringList;
i, Len: Integer;
Buff: String;
begin
for i := 0 to GetArrayLength(AppIds)-1 do
begin
Buff := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppIds[i] + '_is1,UninstallString|}'));
if Buff <> '' then
begin
Len := GetArrayLength(Result);
SetArrayLength(Result, Len+1);
Result[Len] := Buff;
end;
end;
end;
procedure UninstallApps(const UninstallPathes: array of String);
var
pi: _PROCESS_INFORMATION;
si: _STARTUPINFO;
i: Integer;
begin
for i := 0 to GetArrayLength(UninstallPathes)-1 do
begin
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWNORMAL;
#ifdef UNICODE
if not CreateProcess('', PAnsiChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#else
if not CreateProcess('', PChar(UninstallPathes[i]), 0, 0, False, NORMAL_PRIORITY_CLASS, '', '', si, pi) then
#endif
begin
MsgBox(SysErrorMessage(DLLGetLastError), mbCriticalError, MB_OK);
Exit;
end;
try
while WaitForSingleObject(pi.hProcess, INFINITE) <> WAIT_OBJECT_0 do Application.ProcessMessages;
finally
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end;
end;
function InitializeSetup:boolean;
var
i, Len: Integer;
uArray: array of String;
begin
uArray := GetUninstallPath( ['{#SetupSetting("AppID")}', APPID_AIDA_EXTREME, APPID_AIDA_BUISNES, APPID_AIDA_ENGINEER] );
Len := GetArrayLength(uArray);
Result := Len = 0;
if not Result then if MsgBox('Перед установкой необходимо удалить все старые версии приложения, вызвать программы удаления сейчас?', mbError, MB_YESNO) = IDYES then
begin
UninstallApps(uArray);
Result := InitializeSetup();
end;
end;
А вот это вот что:
if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDNO then Exit;
Зачем MsgBox вызывается в самом начале функции без каких либо условий, тогда когда его нужно вызывать только в том случае, если результат поиска установленного приложения будет True. Естественно он будет светится всегда. Что перевернули в скрипте, переворачивайте обратно и все будет работать.
P.S.
Я понимаю, что вы не ищите легких путей, однако зачем использовать такую махину для банального удаления программы, когда можно обойтись всего несколькими строчками?
Всем доброго времени суток. Объясните пожалуйста неучу, как реализовать следующее: нужно, чтобы в процессе работы инсталл периодически проверял наличие некоего файла на диске, если файл, вдруг, будет удален в процессе работы, то станет неактивной некая кнопка, если же файл появится кнопка вновь будет задействована. Самодостаточный пример не обязателен, хочу узнать сам принцип.
Johny777
30-06-2013, 12:39
saurn, создавай таймер на этапе ssInstall , а на ssPostInstall освобождай. В процедуре которую он будет выполнять опиши нужное тебе действие типа MyButton.Enabled := FileExists('...');
=============================================зачем использовать такую махину для банального удаления программы, когда можно обойтись всего несколькими строчками? »
Целью было ожидание завершение процесса создаваемого при запуске. Ожидание через WaitForSingleObject() http://fkn.ktu10.com/?q=node/633 с "бесконечным" ожиданием, пока процесс не завершится, но ей нужен хэндл (описатель) процесса, которой можно получить напрямую из структуры _PROCESS_INFORMATION, Его также можно получить по ай-ди процесса и даже по хэндлу окна, но стандартны функции инно не возвращают всего этого и ждать завершения не получитсая. Просто на ранних этапах с использованием Exec(... ,ewWaitUntilTerminated) я получал сразу несколько окон на запрос деинсталляции и окно программы установки, а теперь всё по порядку
Johny777, в том случае понятно для чего, там могло выполнятся удаление сразу нескольких приложений, но в последнем случае только одно, так что наверное будет достаточно и Exec с ewWaitUntilTerminated))
создавай таймер на этапе ssInstall »
Благодарю за подсказку, всё получилось, как нужно :)
Johny777
30-06-2013, 13:24
так что наверное будет достаточно и Exec с ewWaitUntilTerminated)) »
так точно.
habib2302, вот пример:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
AppId=wwwwwwwwwwwwww
[code ]
function UninstallMyApp(): Boolean;
var
Buff: String;
i: Integer;
begin
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then Result := not FileExists(RemoveQuotes(Buff));
if not Result then if MsgBox('Перед установкой необходимо удалить предыдущую версию приложения. Продолжить?', mbError, MB_YESNO) = IDYES then
try
Exec(RemoveQuotes(Buff), '', ExtractFilePath(RemoveQuotes(Buff)), SW_SHOW, ewWaitUntilTerminated, i);
finally
Result := not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', Buff );
if not Result then MsgBox('Удаление завершилось неудачей, бывай!', mbError, MB_OK);
end;
end;
function InitializeSetup(): Boolean;
begin
Result := UninstallMyApp();
end;
UPD: Улучшил пример!
habib2302
30-06-2013, 14:33
всем доброе время суток.как сделать,чтобы файл информации о том же самом репаке переводился в зависимости от выбранного языка?
habib2302, при помощи CustomMessages ,было уже: http://forum.oszone.net/post-2169481-665.html
habib2302
30-06-2013, 15:39
saurn, т.е ты имеешь виду перевести info.rtf
Johny777
30-06-2013, 15:56
habib2302, saurn,
info.rtf »
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl; InfoBeforeFile: Russian.rtf
Name: English; MessagesFile: compiler:Languages\English.isl; InfoBeforeFile: English.rtf
с InfoAfter, лицензионным соглашением нужно также, чтоб они отображались в зависимости от активного языка
PS habib2302,
всем доброе время суток.как сделать,чтобы файл информации о том же самом репаке переводился в зависимости от выбранного языка? »
Когда ты наконец прочитаешь долбаную справку? всё это описано в разделе [Languages]. Дальше по таким вопросам отвечать не буду!
К тому же этот вопрос уже задавался, юзай пожалуйста поиск перед тем как спрашивать!
Я б сейчас не наезжал, но такие вопросы с твоей стороны задаются слишком часто
Вот еще один пример только теперь для Лицензии
[Languages]
Name: Russian; MessagesFile: "compiler:Languages\Russian.isl"; LicenseFile: "InfoRu.rtf";
Name: English; MessagesFile: "compiler:Languages\English.isl"; LicenseFile: "InfoEn.rtf";
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.