Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
{ RedesignWizardFormBegin } // Не удалять эту строку! // Не изменять эту секцию. Она создана автоматически. var NewCheckBox1: TNewCheckBox; const BackupDir = 'PatchBackup'; PatchFile = 'MyPatch.dat'; function vpatch(parentwnd: Integer; pluginname, funcname, param1, param2, param3: PChar): Integer; external 'vpatch@files:callvpatch.dll stdcall'; function PatchFileFunc(FileName: string): Integer; begin Result := vpatch(1, ExpandConstant('{tmp}VPatch.dll'), 'vpatchfile', ExpandConstant('{tmp}' + PatchFile), ExpandConstant('{app}' + BackupDir + '' + FileName), ExpandConstant('{app}' + FileName)); end; procedure BackupFile(FileName: string); begin if not FileExists(ExpandConstant('{app}' + BackupDir + '' + Filename)) then FileCopy(ExpandConstant('{app}' + Filename), ExpandConstant('{app}' + BackupDir + '' + Filename), True); end; procedure RestoreFile(FileName: string); begin FileCopy(ExpandConstant('{app}' + BackupDir + '' + Filename), ExpandConstant('{app}' + Filename), False); DeleteFile(ExpandConstant('{app}' + BackupDir + '' + Filename)); end; procedure InitializeWizard(); begin ExtractTemporaryFile('VPatch.dll'); ExtractTemporaryFile('MyPatch.dat'); WizardForm.ReadyMemo.Height := ScaleY(0); NewCheckBox1 := TNewCheckBox.Create(WizardForm); with NewCheckBox1 do begin Parent := WizardForm.SelectDirPage; SetBounds(ScaleX(8), ScaleY(120), ScaleX(200), ScaleY(17)); Caption := 'Создать резервные копии файлов'; end; end; // Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения function NextButtonClick(CurPage: Integer): Boolean; var s: string; begin Result := True; if CurPage = 6 then begin if (FileSearch('myprog.exe', ExpandConstant('{app}')) = '') //Вставьте полное имя файла выше для проверки на присутствие then begin s := 'Извините, в директории ' + ExpandConstant('{app}') + '' #13 'не обнаружены оригинальные файлы.' #13#13 'Пожалуйста, выберите правильный путь к папке для установки обновления.'; MsgBox(s, mbError, mb_Ok); Result := False end; end; end; //Не забываем вставить порверку на присутствие проверяемого файла procedure CurPageChanged(CurPageID: Integer); var MD5, s: string; begin if CurPageID = 12 then begin MD5 := GetMD5OfFile(ExpandConstant('{app}myprog.exe')); if not (MD5 = 'fafdf9dca5f7faec44b4e18c1a7df1a8') //Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ! then begin s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.'; MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются. WizardForm.Close; //Закрытие инсталлятора Exit; //Прерывание и откат всех действий end; end; end; //Не забываем дописать еще такую процедуру procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean); begin Cancel := True; if CurPage = 12 //Это непосредственно страница с индикатором выполнения then begin Confirm := False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена end; end; procedure CurStepChanged(CurStep: TSetupStep); var MD5, s: string; err : Boolean; begin if CurStep = ssInstall then begin if NewCheckBox1.Checked then // Если стоит галка на чекбоксе begin // то выполняем действия от сих err := False; // ошибки пока еще нет CreateDir(ExpandConstant('{app}' + BackupDir)); BackupFile('myprog.exe'); case PatchFileFunc('myprog.exe') of 0: WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position + 33; 1: begin RestoreFile('myprog.exe'); err := True; // если не удалось пропачить, то говорим, что была ошибка end; end; case err of // проверяем состояние ошибки и выводим соответствующее сообщение True : MsgBox('При русификации произошла ошибка!',mbError,MB_OK); False: MsgBox('Программа успешно русифицирована!',mbInformation,MB_OK); end; end; // до сих end; end; //Вставьте полные имена файлов выше на каждую процедуру отдельно
Есть два отличных кода от безрукости пользователей - Убить процесс при установке и Убить процесс при деинсталляции. Они по отдельности прекрасно работают. А вот как их соединить вместе??? Есть необходимость процесс убить как и при установке так и при удалении русификатора.
Установка
function KillTask(ExeFileName: string): Integer; external 'KillTask@files:ISTask.dll stdcall delayload'; function RunTask(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@files:ISTask.dll stdcall delayload'; //**************************************************// function InitializeSetup(): Boolean; begin If RunTask('Вася.exe', false) then begin if MsgBox('Программа Вася используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then begin KillTask('Вася.exe'); Result:= True; end else Exit; end; Result:=True; end;
Удаление
function RunTask(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly'; function KillTask(ExeFileName: string): Integer; external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly'; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usUninstall then if RunTask('Вася.exe', False) then begin // прячем форму UninstallProgressForm.Visible:= False; if MsgBox('Программа Вася используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then begin KillTask('Вася.exe'); UnloadDll(ExpandConstant('{app}ISTask.dll')); // показываем форму UninstallProgressForm.Visible:= True; end else begin MsgBox('Завершите работу Вася, затем снова запустите программу удаления.', mbInformation, MB_OK); UnloadDll(ExpandConstant('{app}ISTask.dll')); Abort; end; end;
function KillTask_S(ExeFileName: string): Integer; external 'KillTask@files:ISTask.dll stdcall delayload'; function RunTask_S(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@files:ISTask.dll stdcall delayload'; function RunTask_U(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly'; function KillTask_U(ExeFileName: string): Integer; external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly'; //**************************************************// function InitializeSetup(): Boolean; begin if RunTask_S('Вася.exe', false) then begin if MsgBox('Программа Вася используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then begin KillTask_S('Вася.exe'); Result := True; end else Exit; end; Result := True; end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); begin if CurUninstallStep = usUninstall then if RunTask_U('Вася.exe', False) then begin // прячем форму UninstallProgressForm.Visible := False; if MsgBox('Программа Вася используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then begin KillTask_U('Вася.exe'); UnloadDll(ExpandConstant('{app}ISTask.dll')); // показываем форму UninstallProgressForm.Visible := True; end else begin MsgBox('Завершите работу Вася, затем снова запустите программу удаления.', mbInformation, MB_OK); UnloadDll(ExpandConstant('{app}ISTask.dll')); Abort; end; end; end;
Убить процесс при установке - мне понадобилось убить два процесса при установке, правильно или нет, но работает. Если что - поправь.
function KillTask(ExeFileName: string): Integer; external 'KillTask@files:ISTask.dll stdcall delayload'; function RunTask(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@files:ISTask.dll stdcall delayload'; //**************************************************// function InitializeSetup3(): Boolean; begin If RunTask('SoftCAT.exe', false) then begin if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then begin KillTask('SoftCAT.exe'); Result:= True; end else Exit; end; Result:=True; begin If RunTask('SoftCATSysTray.exe', false) then begin KillTask('SoftCATSysTray.exe'); Result:= True; end else Exit; end; end;
А вот Убить процесс при деинсталляции - как сделать убиение двух процессов?
function KillTask(ExeFileName: string): Integer; external 'KillTask@files:ISTask.dll stdcall delayload setuponly'; function RunTask(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@files:ISTask.dll stdcall delayload setuponly'; //**************************************************// function KillTaskU(ExeFileName: string): Integer; external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly'; function RunTaskU(FileName: string; bFullpath: Boolean): Boolean; external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly'; //**************************************************// function InitializeSetup(): Boolean; begin Result:= True; If RunTask('SoftCAT.exe', false) then begin if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then begin KillTask('SoftCAT.exe'); If RunTask('SoftCATSysTray.exe', false) then KillTask('SoftCATSysTray.exe'); end else Result:= False; end; end; //**************************************************// function InitializeUninstall(): Boolean; begin Result:= True; If RunTaskU('SoftCAT.exe', false) then begin if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then begin KillTaskU('SoftCAT.exe'); If RunTaskU('SoftCATSysTray.exe', false) then KillTaskU('SoftCATSysTray.exe'); end else Result:= False; end; end;
Не забыть в файлах прописать ISTask.dll в папку установки.
Не работает. Если запущены два екзешника - то убивает процессы, если запущен первый екзкшник - то убивает процесс, если запущен второй екзкшник - убиение не происходит. Это происходит как при установке так и при удалении русификатора.
Просто юникод-версия инно не знает типа Pchar. Объясняется это тем, что изначально был Char и указатель на него Pchar. Потом появился юникод и появился расширенный тип widechar, на который стал указывать Pchar а старый стали более явно указывать AnsiChar. Но в юникодную инно почему-то PWideghar не включили, поэтому, видимо и Pchar она не знает. Шапку сейчас поправлю, хотя с таким исправлением можно попробовать и на юникоде - если сама библиотека нормально работает, то достаточно исправить этот тип.
Цитата: Kopejkin
но дальше полезли другие ошибки.
там просто нужно строку кода завершить знаком точка с запятой. вот эту: RestoreFile("wylek.exe"); Поправленый скрипт для юникода:
[Setup]DisableFinishedPage=True AppName=Themes Creator AppVerName=3.0 UsePreviousAppDir=true DefaultDirName={pf}Sony EricssonThemes Creator Uninstallable=false Compression=lzma SolidCompression=true OutputBaseFilename=Themes Creator LicenseFile=embeddedLicense.rtf WizardImageFile=embeddedWizModernImage-Is.bmp WizardSmallImageFile=embeddedWizardSmallImage.bmp SetupIconFile=embeddedWXICON.ico [Files]Source: callvpatch.dll; Flags: dontcopy Source: VPatch.dll; Flags: dontcopy Source: MyPatch.dat; Flags: dontcopy [_Code] const BackupDir = 'PatchBackup'; PatchFile = 'MyPatch.dat'; function vpatch(parentwnd: Integer; pluginname, funcname, param1, param2, param3: PAnsiChar): Integer; external 'vpatch@files:callvpatch.dll stdcall'; function PatchFileFunc(FileName: string): Integer; begin Result := vpatch(1, ExpandConstant('{tmp}VPatch.dll'), 'vpatchfile', ExpandConstant('{tmp}' + PatchFile), ExpandConstant('{app}' + BackupDir + '' + FileName), ExpandConstant('{app}' + FileName)); // Result : // 0 = іЙ№¦ // 1 = К§°Ь end; procedure BackupFile(FileName: string); begin if not FileExists(ExpandConstant('{app}' + BackupDir + '' + Filename)) then FileCopy(ExpandConstant('{app}' + Filename), ExpandConstant('{app}' + BackupDir + '' + Filename), True); end; procedure RestoreFile(FileName: string); begin FileCopy(ExpandConstant('{app}' + BackupDir + '' + Filename), ExpandConstant('{app}' + Filename), False); DeleteFile(ExpandConstant('{app}' + BackupDir + '' + Filename)); end; procedure InitializeWizard(); begin ExtractTemporaryFile('VPatch.dll'); ExtractTemporaryFile('MyPatch.dat'); end; // Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения function NextButtonClick(CurPage: Integer): Boolean; var s: string; begin Result := True; if CurPage = 6 then begin if (FileSearch('wylek.exe', ExpandConstant('{app}')) = '') //Вставьте полное имя файла выше для проверки на присутствие then begin s := 'Извините, в директории ' + ExpandConstant('{app}') + '' #13#10 'не обнаружены оригинальные файлы.' #13#10#13#10 'Пожалуйста, выберите правильный путь к папке для установки обновления.'; MsgBox(s, mbError, mb_Ok); Result := False; end; end; end; //Не забываем вставить порверку на присутствие проверяемого файла procedure CurPageChanged(CurPageID: Integer); var MD5, s: string; begin if CurPageID = wpInstalling then begin MD5 := GetMD5OfFile(ExpandConstant('{app}wylek.exe')); if not (MD5 = '9711713d2e4173cccfeeea1ffd76f129') //Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ! then begin s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.'; MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются. WizardForm.Close; //Закрытие инсталлятора Exit; //Прерывание и откат всех действий end; end; end; //Не забываем дописать еще такую процедуру procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean); begin Cancel := True; if CurPage = 12 //Это непосредственно страница с индикатором выполнения then begin Confirm := False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена end; end; procedure CurStepChanged(CurStep: TSetupStep); begin if CurStep = ssInstall then begin CreateDir(ExpandConstant('{app}' + BackupDir)); BackupFile('wylek.exe'); if PatchFileFunc('wylek.exe') = 1 then RestoreFile('wylek.exe'); WizardForm.PROGRESSGAUGE.POSITION := 33; end; end; //Вставьте полные имена файлов выше на каждую процедуру отдельно