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.dll
ihtiyaç 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.