09-08-2018, Saat: 01:22
Herkese hayırlı geceler,
Uzun zamandır bir şeyler yazmıyordum, Inno hakkında geçenlerde birkaç bilgi öğrendim bunları sizinle paylaşmak isterim. Inno setup bildiğiniz üzere bir uygulama paketleme yazılımıdır. Inno setup yazılımı Delphi ile ilişiği(Embarcadero eklentisi ile) ve script yazımında ki Delphi ile hemen hemen aynı diyebiliriz. Inno setup yazılımının bir diğer güzel özelliği script ile setup yazılımınıza istediğiniz özelliği ekleyebiliyorsunuz. Bu yazımda sizlere örnek teşkil etmesi açısından bir senaryo ve çözümünü sunacağım.
Senaryo: Kullanıcı uygulamayı yükledi sonrasında kaldırma işlemi yapmak istedi fakat uygulamamız çalışıyordu ve kaldırma işleminde sadece kurulumda tanımlı olan dosyalar silindi ve uygulama dosyası kaldı. Birde uygulamamızın her bilgisayar açılışında açıldığını düşünürsek; dosya olmayınca otomatikman her açılışta uygulama bazlı hatalar çıkacaktır.
Çözüm Senaryosu: Uygulama kaldırma işlemi yapılmadan önce; uygulamanın açık olup olmadığı kontrol edilir. Açık ise kapatılması istenir. Kullanıcı kapatmadığı sürece kaldırma işlemi engellenir.
Öncellikle gerekli olan bazı kütüphaneler gerekecek. Bu kütüphanemizin ismi psvince.dll. Bu kütüphane dosyamızı ilk olarak setup dosyamızı "load" edeceğiz. Sonrasında ise gerekli çağırım ve kodlar ile işlemlerimizi tamamlayacağız.
psvince.dll load edebilmek için ilk önce files bölümüne eklemelisiniz veya normal kurulum wizard penceresinde seçebilirsiniz ama yine de kod ile nasıl eklenir onu anlatayım kısaca;
Inno Setup bölüm algılama syntax biçimi diyeyim "[]" dizi şeklinde gruplandırarak işlemleri gerçekleştirir. Örneğin kod için [Code], uygulama runtime olayı için [Run] veya dosyalar için ise [Files] tümleçlerin altına yazılır. Bizde psvince.dll için script sayesinde direkt ekleme sağlayacağız.
İki adet const değeri belirterek işlemlerimize başlıyoruz:
Sonra belirli prosedürler ile uninstall.exe için geçerli olan mesaj yapımızı hazırlıyoruz:
Sonraki işlem önemli hem setup.exe hemde uninstall.exe için "load" işlemi gerçekleştireceğiz çünkü setup.exe ile paketlenip uygulama yüklendikten sonra sanırsam uninstall.exe psvinvce.dll
ihtiyaç durumunda uygulama klasöründe referans edinebilsin. Zaten script üzerinden bu durumu kolayca görebiliyoruz.
Tabi IsModuleLoaded fonksiyonu önceden tanımlı. Daha doğrusu bu fonksiyonun Install için mi Uninstall için mi geçerli olduğu bu fonksiyon ile belirtilmesi kolaylaştırlımış ve işlem devamlılığı sağlanmış.
Şimdi aşağıdaki fonksiyon ile mesaj buttonları, mesaj türü ayarlanıyor. Tabi bundan önce while ile modül load ediliyor. Fonksiyonun result değerine baktığımızda ise zaten eğer "false" değeri ile birazdan vereceğim InitializeSetup fonksiyonuyla - yani bir nevi benzetecek olursak Delphi'de create olayı gibi. - aşağıdaki kodu tetikleyeceğiz.
Bundan sonra artık "Initialize" fonksiyonuna gerekli tanımları yapıp işlemlerimizi tamamlamak.
Bu şekilde uygulama kaldırılmadan önce size sorgulama yaptıracaktır.

Bu şekilde uygulama kapatılmadığı sürece bu mesaj "yeniden dene" butonuna bassa bile tekrarlayacaktır.
Scriptin bütün hali aşağıda yer almaktadır:
Referans Linkler:
psvince.dll
Close a program before reinstalling it
InnoSetup
Umarım bu makale işinize yarar niteliğinde olur.
Saygılarımla,
İyi çalışmalar.
Uzun zamandır bir şeyler yazmıyordum, Inno hakkında geçenlerde birkaç bilgi öğrendim bunları sizinle paylaşmak isterim. Inno setup bildiğiniz üzere bir uygulama paketleme yazılımıdır. Inno setup yazılımı Delphi ile ilişiği(Embarcadero eklentisi ile) ve script yazımında ki Delphi ile hemen hemen aynı diyebiliriz. Inno setup yazılımının bir diğer güzel özelliği script ile setup yazılımınıza istediğiniz özelliği ekleyebiliyorsunuz. Bu yazımda sizlere örnek teşkil etmesi açısından bir senaryo ve çözümünü sunacağım.
Senaryo: Kullanıcı uygulamayı yükledi sonrasında kaldırma işlemi yapmak istedi fakat uygulamamız çalışıyordu ve kaldırma işleminde sadece kurulumda tanımlı olan dosyalar silindi ve uygulama dosyası kaldı. Birde uygulamamızın her bilgisayar açılışında açıldığını düşünürsek; dosya olmayınca otomatikman her açılışta uygulama bazlı hatalar çıkacaktır.
Çözüm Senaryosu: Uygulama kaldırma işlemi yapılmadan önce; uygulamanın açık olup olmadığı kontrol edilir. Açık ise kapatılması istenir. Kullanıcı kapatmadığı sürece kaldırma işlemi engellenir.
Öncellikle gerekli olan bazı kütüphaneler gerekecek. Bu kütüphanemizin ismi psvince.dll. Bu kütüphane dosyamızı ilk olarak setup dosyamızı "load" edeceğiz. Sonrasında ise gerekli çağırım ve kodlar ile işlemlerimizi tamamlayacağız.
psvince.dll load edebilmek için ilk önce files bölümüne eklemelisiniz veya normal kurulum wizard penceresinde seçebilirsiniz ama yine de kod ile nasıl eklenir onu anlatayım kısaca;Inno Setup bölüm algılama syntax biçimi diyeyim "[]" dizi şeklinde gruplandırarak işlemleri gerçekleştirir. Örneğin kod için [Code], uygulama runtime olayı için [Run] veya dosyalar için ise [Files] tümleçlerin altına yazılır. Bizde psvince.dll için script sayesinde direkt ekleme sağlayacağız.
[Files]
Source: psvince.dll; DestDir: {app}
Source: psvince.dll; flags: dontcopy
İki adet const değeri belirterek işlemlerimize başlıyoruz: const ProgramName = 'UygulamaAdi'; ProgramExeName = 'UygulamaAdi.exe';
Sonra belirli prosedürler ile uninstall.exe için geçerli olan mesaj yapımızı hazırlıyoruz:ProgramRunningOnUninstallMessage = ProgramName + ' adlı uygulama şu anda çalışıyor. ' + #13 + #13 + 'Lütfen uygulamayı kapatın ve "Yeniden Dene" butonuna basınız.'; UninstallationCanceledMessage = 'Kaldırılma işlemi iptal edildi.';
Sonraki işlem önemli hem setup.exe hemde uninstall.exe için "load" işlemi gerçekleştireceğiz çünkü setup.exe ile paketlenip uygulama yüklendikten sonra sanırsam uninstall.exe psvinvce.dllihtiyaç durumunda uygulama klasöründe referans edinebilsin. Zaten script üzerinden bu durumu kolayca görebiliyoruz.
function IsModuleLoadedI(modulename: String ): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
function IsModuleLoadedU(modulename: String ): Boolean;
external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
Tabi IsModuleLoaded fonksiyonu önceden tanımlı. Daha doğrusu bu fonksiyonun Install için mi Uninstall için mi geçerli olduğu bu fonksiyon ile belirtilmesi kolaylaştırlımış ve işlem devamlılığı sağlanmış.function IsModuleLoaded( modulename: String; isUninstallation: Boolean ): Boolean; begin if isUninstallation then Result := IsModuleLoadedU( modulename ) else Result := IsModuleLoadedI( modulename ); end;
Şimdi aşağıdaki fonksiyon ile mesaj buttonları, mesaj türü ayarlanıyor. Tabi bundan önce while ile modül load ediliyor. Fonksiyonun result değerine baktığımızda ise zaten eğer "false" değeri ile birazdan vereceğim InitializeSetup fonksiyonuyla - yani bir nevi benzetecek olursak Delphi'de create olayı gibi. - aşağıdaki kodu tetikleyeceğiz. function UygulamaKaldirmaIptal( message: String; isUninstallation: Boolean ): Boolean; var ButtonPressed : Integer; begin ButtonPressed := IDRETRY; while IsModuleLoaded( ProgramExeName, isUninstallation ) and ( ButtonPressed <> IDCANCEL ) do begin ButtonPressed := MsgBox( message , mbError, MB_RETRYCANCEL ); end; Result := Not IsModuleLoaded( ProgramExeName, isUninstallation ); end;
Bundan sonra artık "Initialize" fonksiyonuna gerekli tanımları yapıp işlemlerimizi tamamlamak.function InitializeUninstall(): Boolean;
begin
Result := UygulamaKaldirmaIptal( ProgramRunningOnUninstallMessage, True );
UnloadDLL(ExpandConstant('{app}\psvince.dll'));
if not Result then
begin
MsgBox( UninstallationCanceledMessage, mbInformation, MB_OK );
end;
end;
Bu şekilde uygulama kaldırılmadan önce size sorgulama yaptıracaktır.

Bu şekilde uygulama kapatılmadığı sürece bu mesaj "yeniden dene" butonuna bassa bile tekrarlayacaktır.
Scriptin bütün hali aşağıda yer almaktadır:; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "UygulamaAdi"
#define MyAppVersion "BETA"
#define MyAppPublisher "Halil Han Badem, Developer"
#define MyAppExeName "UygulamaAdi.exe"
#define MyAppCopyright "Developer by Halil Han Badem"
[Setup]
AppId={{A3D45299-0E0E-4E4C-8482-54E88F52B7B0}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
LicenseFile=C:\Users\Windows_User\Desktop\Licen.txt
InfoBeforeFile=C:\Users\Windows_User\Desktop\Info.txt
OutputDir=C:\Users\Windows_User\Desktop
OutputBaseFilename=UygulamaAdi_beta_setup
SetupIconFile=C:\Users\Windows_User\Desktop\UygulamaKlasoru\img\icon.ico
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler: Default.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "C:\Users\Windows_User\Desktop\UygulamaKlasoru\UygulamaAdi.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: psvince.dll; DestDir: {app}
Source: psvince.dll; flags: dontcopy
[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[UninstallDelete]
Type: filesandordirs; Name: "{app}"
[Code]
const
ProgramName = 'UygulamaAdi';
ProgramExeName = 'UygulamaAdi.exe';
ProgramRunningOnUninstallMessage = ProgramName + ' adlı uygulama şu anda çalışıyor. ' + #13 + #13 +
'Lütfen uygulamayı kapatın ve "Yeniden Dene" butonuna basınız.';
UninstallationCanceledMessage = 'Kaldırılma işlemi iptal edildi.';
function IsModuleLoadedI(modulename: String ): Boolean;
external 'IsModuleLoaded@files:psvince.dll stdcall setuponly';
function IsModuleLoadedU(modulename: String ): Boolean;
external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ;
function IsModuleLoaded( modulename: String; isUninstallation: Boolean ): Boolean;
begin
if isUninstallation then
Result := IsModuleLoadedU( modulename )
else
Result := IsModuleLoadedI( modulename );
end;
function PromptUntilProgramClosedOrInstallationCanceled(
message: String;
isUninstallation: Boolean ): Boolean;
var
ButtonPressed : Integer;
begin
ButtonPressed := IDRETRY;
while IsModuleLoaded( ProgramExeName, isUninstallation ) and ( ButtonPressed <> IDCANCEL ) do
begin
ButtonPressed := MsgBox( message , mbError, MB_RETRYCANCEL );
end;
Result := Not IsModuleLoaded( ProgramExeName, isUninstallation );
end;
function InitializeSetup(): Boolean;
begin
Result := PromptUntilProgramClosedOrInstallationCanceled( ProgramRunningOnInstallMessage, False );
if Not Result then
begin
MsgBox( InstallationCanceledMessage, mbInformation, MB_OK );
end;
end;
function InitializeUninstall(): Boolean;
begin
Result := PromptUntilProgramClosedOrInstallationCanceled( ProgramRunningOnUninstallMessage, True );
UnloadDLL(ExpandConstant('{app}\psvince.dll'));
if not Result then
begin
MsgBox( UninstallationCanceledMessage, mbInformation, MB_OK );
end;
end;
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: runascurrentuser nowait postinstall skipifsilent
Referans Linkler:
psvince.dll
Close a program before reinstalling it
InnoSetup
Umarım bu makale işinize yarar niteliğinde olur.
Saygılarımla,
İyi çalışmalar.

