Inno Setup ile MSDE Kurulumu

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Inno Setup ile MSDE Kurulumu

Mesaj gönderen sabanakman »

Merhaba. Bu yazının amacı SQL Server 2000 - MSDE kurulumunu inno setup kullanarak kurdurmayı sağlamak. Hatta bu kuruluma müdahele edilerek projeye entegre edilebilir. Ayrıca Inno Setup ile alakalı bir çok ip uçları da bulunmaktadır.

En başta MSDE (SP4) kurulumu yapan paketi indirmemiz gerekmektedir. Bu dosyayı indirip kurduğunuz vakit c:\MSDE_SQL2KSP4 klasörüne kurulum dosyaları açılıyor ve burada Setup.ini dosyasına kurulumla alakalı ayarları yazıp (veya Setup.exe'ye ayar parametreleri göndererek) kurulum yapılabiliyor. İşte bu ayarlardan en önemlilerini bir arayüz kullanarak kurmak daha şık olacağından böyle bir kurulum iş görebilir. Her şey bir yana 107 MB'lık kurulumun InternalCompressLevel=ultra ve Compression=lzma/ultra ayarları sayesinde 37,8 MB olmaktadır.

Inno Setup dosyasını MSDE.iss isminde kayıt edelim ve bu dosyanın bulunduğu klasörün içinde Kur\MSDE_SQL2KSP4 klasörü oluşturalım. İndirilen MSDE kurulum dosyalarını da bu klasörün içine taşıyalım. Hazırlanan kurulum ise Kur klasörünün altına MSDE.exe isminde oluşacaktır.

Ayrıca Inno Setup programını istool ve bazı hazır kodları paket halinde bünyesinde bulunduran kurulumu indirip kurduktan sonra bir de Türkçe dil paketini olan Turkish.isl dosyasını C:\Program Files\Inno Setup 5\Languages klasörüne kopyalamak gerekecektir.

Örnek Kurulum..:http://rapidshare.com/files/81126353/MSDE.exe.html


Not:Inno Script içinde Kod olarak StartNTService fonksiyonu bulunmaktadır ve PChar parametresi için nil atamasını yapamadığımdan SQL kurulumunun ardından her SQL Server hizmetinin başlatılamadı. mesajı getirilebilir. Bknz. DeinitializeSetup(); prosedürü. Bu servisi Inno Setup ile başlatamadığımdan AlwaysRestart=true satırı ile kurulumun ardından bilgisayarı yeniden başlatma yoluna gidildi. Eğer inno kodları ile servis başlatmanın bir yolunu bilen varsa bu kuruluma bir katkıda bulunabilir ;) .

Uyarı:Bu kurulum SQL Server yüklü olmayan sisteme sa kullanıcısına boş şifre vererek ve SQL Mode olarak otomatik olarak kurulmaktadır. Bu seçeneği kullanmadan ayarların ekranda kalmasını isteyen CurPageChanged prosedüründe bulunan wpSelectTasks bloğu içindeki SendMessage satırlarını silmeli.

MSDE.iss dosyası. Rapid'e atılan Önekten sonra çok ufak bazı değişiklikleri oldu.

Kod: Tümünü seç

[Setup]
InternalCompressLevel=ultra
Compression=lzma/ultra
OutputDir=Kur
OutputBaseFilename=MSDE
AppName=MSDE
AppVerName=SP3
DefaultDirName=C:\MSDE_SQL2KSP4\
DisableProgramGroupPage=true
UsePreviousGroup=false
UsePreviousSetupType=false
DisableReadyPage=true
ShowTasksTreeLines=true
Uninstallable=false
DirExistsWarning=no
DisableFinishedPage=true
DisableDirPage=true
SolidCompression=true
AlwaysRestart=true

[Languages]
Name: tr; MessagesFile: compiler:Languages\Turkish.isl

[Dirs]
Name: {app}
Name: {app}\Msi
Name: {app}\MSM
Name: {app}\MSM\1033
Name: {app}\Setup

[Tasks]
Name: DisableNetworkProtocols; Description: Ağ kontrolleri olmasın (DisableNetworkProtocols=0); Flags: unchecked
Name: SecurityMode; Description: SQL Modunda kur (Mixed Mode)

[Files]
Source: Kur\MSDE_SQL2KSP4\Msi\InstMsi.exe; DestDir: {app}\Msi
Source: Kur\MSDE_SQL2KSP4\Msi\InstMsi20.exe; DestDir: {app}\Msi
Source: Kur\MSDE_SQL2KSP4\Msi\InstMsiW.exe; DestDir: {app}\Msi
Source: Kur\MSDE_SQL2KSP4\Msi\InstMsiW20.exe; DestDir: {app}\Msi
Source: Kur\MSDE_SQL2KSP4\MSM\1033\DMO_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\DTS_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\MSXMLSQLR32.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\REPL_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\SEM_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\SQLAGENT_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\SQLBASE.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\SQLSVR_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\1033\TOOLS_RES.MSM; DestDir: {app}\MSM\1033
Source: Kur\MSDE_SQL2KSP4\MSM\atl.msm; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\CONNECT.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\DEV_SCM.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\DMO.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\DTC.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\DTS.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\mfc42.msm; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\msstkprp.msm; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\msvcirt.msm; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\msvcrt.msm; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\MSXMLSQL32.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\QFEPATCH.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\REPL.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\SEM.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\SHARED.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\SQLAGENT.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\SQLSVR.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\TOOLS.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\MSM\UPGRADE.MSM; DestDir: {app}\MSM
Source: Kur\MSDE_SQL2KSP4\Setup\Sql01P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql02P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql03P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql04P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql05P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql06P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql07P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql08P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql09P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql10P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql11P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql12P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql13P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql14P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql15P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql16P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\sql17P.msp; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\Sql2000.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun.cab; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun01.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun02.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun03.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun04.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun05.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun06.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun07.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun08.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun09.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun10.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun11.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun12.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun13.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun14.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun15.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\Setup\SqlRun16.msi; DestDir: {app}\Setup
Source: Kur\MSDE_SQL2KSP4\autorun.inf; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\license.txt; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\msvcr71.dll; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\readme.txt; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\ReadmeSql2k32desksp4.htm; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\setup.exe; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\setup.ini; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\setup.rll; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\sqdedev.dll; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\sqlresld.dll; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\sqlsut.dll; DestDir: {app}\
Source: Kur\MSDE_SQL2KSP4\sqlunirl.dll; DestDir: {app}\

[Run]
Filename: {app}\setup.exe; WorkingDir: {app}; StatusMsg: SQL Server sisteminizi yapılandırırken lütfen bekleyin

(.Code.) //<-BBCode'u bozdu köşeli parantez içinde olmalı
type
  LPCSTR = PChar;
  TStringFunction=function(const Liste:TStrings):Boolean;
  LPARAM = Longint;
  WPARAM = Longint;
  LRESULT = Longint;
  SC_HANDLE = THandle;

  _SERVICE_STATUS = record
    dwServiceType: DWORD;
    dwCurrentState: DWORD;
    dwControlsAccepted: DWORD;
    dwWin32ExitCode: DWORD;
    dwServiceSpecificExitCode: DWORD;
    dwCheckPoint: DWORD;
    dwWaitHint: DWORD;
  end;
  SERVICE_STATUS = _SERVICE_STATUS;
  TServiceStatus = _SERVICE_STATUS;

var
  cmpToplayici:TComponent;
  InstanceNames:TStringList;

  SQLVer,InstanceName:String;
  SQLYuklu,Yuklendi:Boolean;

  lblSQLAdi:TLabel;
  edtSQLAdi:TEdit;
  TasksList:TNewCheckListBox;
  cbxBlankSAPWD:TCheckBox;
  edtSAPWD,edtSAPWD_OK:TEdit;

  AktifEditRengi,PasifEditRengi:TColor;

const
  WM_LBUTTONDOWN      = $0201;
  WM_LBUTTONUP        = $0202;

  iniSec='Options';
  Ara=3;

  SERVICE_STOPPED                = $00000001;
  SERVICE_START_PENDING          = $00000002;
  SERVICE_STOP_PENDING           = $00000003;
  SERVICE_RUNNING                = $00000004;
  SERVICE_CONTINUE_PENDING       = $00000005;
  SERVICE_PAUSE_PENDING          = $00000006;
  SERVICE_PAUSED                 = $00000007;

  ERROR_SERVICE_ALREADY_RUNNING = 1056;

  STANDARD_RIGHTS_REQUIRED = $000F0000;
  SC_MANAGER_CONNECT             = $0001;
  SC_MANAGER_CREATE_SERVICE      = $0002;
  SC_MANAGER_ENUMERATE_SERVICE   = $0004;
  SC_MANAGER_LOCK                = $0008;
  SC_MANAGER_QUERY_LOCK_STATUS   = $0010;
  SC_MANAGER_MODIFY_BOOT_CONFIG  = $0020;

  SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or
                           SC_MANAGER_CONNECT or
                           SC_MANAGER_CREATE_SERVICE or
                           SC_MANAGER_ENUMERATE_SERVICE or
                           SC_MANAGER_LOCK or
                           SC_MANAGER_QUERY_LOCK_STATUS or
                           SC_MANAGER_MODIFY_BOOT_CONFIG);

  SERVICE_QUERY_CONFIG           = $0001;
  SERVICE_CHANGE_CONFIG          = $0002;
  SERVICE_QUERY_STATUS           = $0004;
  SERVICE_ENUMERATE_DEPENDENTS   = $0008;
  SERVICE_START                  = $0010;
  SERVICE_STOP                   = $0020;
  SERVICE_PAUSE_CONTINUE         = $0040;
  SERVICE_INTERROGATE            = $0080;
  SERVICE_USER_DEFINED_CONTROL   = $0100;

  SERVICE_ALL_ACCESS             = (STANDARD_RIGHTS_REQUIRED or
                                    SERVICE_QUERY_CONFIG or
                                    SERVICE_CHANGE_CONFIG or
                                    SERVICE_QUERY_STATUS or
                                    SERVICE_ENUMERATE_DEPENDENTS or
                                    SERVICE_START or
                                    SERVICE_STOP or
                                    SERVICE_PAUSE_CONTINUE or
                                    SERVICE_INTERROGATE or
                                    SERVICE_USER_DEFINED_CONTROL);

function OpenSCManager(lpMachineName,lpDatabaseName:PChar;dwDesiredAccess: DWORD):SC_HANDLE;external 'OpenSCManagerA@advapi32.dll stdcall';
function OpenService(hSCManager: SC_HANDLE; lpServiceName: PChar; dwDesiredAccess: DWORD): SC_HANDLE;external 'OpenServiceA@advapi32.dll stdcall';
function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD;var lpServiceArgVectors: PChar): BOOL;external 'StartServiceA@advapi32.dll stdcall';
function QueryServiceStatus(hService: SC_HANDLE; var lpServiceStatus: TServiceStatus): BOOL;external 'QueryServiceStatus@advapi32.dll stdcall';
function CloseServiceHandle(hSCObject: SC_HANDLE): BOOL;external 'CloseServiceHandle@advapi32.dll stdcall';
function GetLastError: DWORD;external 'GetLastError@kernel32.dll stdcall';

function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT;external 'WinExec@kernel32.dll stdcall';
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;external 'SendMessageA@user32.dll stdcall';

function Calistir(const Komut:String;const PencereDurumu:UINT):UINT;{SW_SHOW,SW_NORMAL,SW_HIDE vs.}
begin
  Result:=WinExec(PChar(Komut),PencereDurumu);
end;

function StartNTService(const ServiceName: string): Boolean;
{var
  SCM: SC_HANDLE;
  ServiceHandle: SC_HANDLE;
  Res: Boolean;
  Temp: PChar;
  Status: SERVICE_STATUS;
  Err: Integer;

  S:String;{}
begin
  Calistir('net start '+Servicename,SW_HIDE);
  Result:=True;
  {Result := False;
  Exit;
  Temp:='';//Temp:=nil; olamadı :( .
  SCM := OpenSCManager(Temp, Temp, SC_MANAGER_ALL_ACCESS);
  if SCM = 0 then Exit; //raise Exception.Create('Servis Kontrol Yöneticisi açılamadı. Hata: ' + SysErrorMessage(getLastError));
  ServiceHandle := OpenService(SCM, PChar(ServiceName), SERVICE_ALL_ACCESS);
  if ServiceHandle = 0 then
  begin
    CloseServiceHandle(SCM);
    Exit;//raise Exception.Create(ServiceName + ' isimli servis açılamadı. Hata: ' + SysErrorMessage(getLastError));
  end;
  Res := StartService(ServiceHandle, 0, Temp);
  if Res then
  begin
    Res := QueryServiceStatus(ServiceHandle, Status);
    while (Res) do
    begin
      if Status.dwCurrentState = SERVICE_RUNNING then
      begin
        Result := True;
        Break;
      end else if Status.dwCurrentState = SERVICE_STOPPED then
      begin
        Result := False;
        Break;
      end;
      QueryServiceStatus(ServiceHandle, Status);
    end;
  end else begin
    Err := GetLastError;
    if  Err <> ERROR_SERVICE_ALREADY_RUNNING then
    Exit;//raise Exception.Create(ServiceName + ' isimli servis başlatılamadı. Hata:' + SysErrorMessage(Err));
  end;
  CloseServiceHandle(SCM);
  if not Result then
    Exit;//raise Exception.Create(ServiceName + ' isimli servis başlatılamadı');{}
end;

procedure Mesaj(const S:String);
begin
  MsgBox(S, mbConfirmation, MB_OK);
end;

procedure MesajInt(const i:Integer);
begin
  Mesaj(IntToStr(i));
end;

procedure Hata(const S:String);
begin
  MsgBox(S, mbError, MB_OK);
end;

function YolTamamla(const S:String):String;
begin
  if (S<>'') and (S[Length(S)]<>'\') then Result:=S+'\' else Result:=S;
end;

function YolTamamlama(const S:String):String;
begin
  if (S<>'') and (S[Length(S)]='\') then Result:=Copy(S,1,Length(S)-1) else Result:=S;
end;

function TirnakliStr(const S:String):String;
begin
  Result:='"'+S+'"';
end;
///////////////////////////////////////////////////////////////////////////////////////////////////
function SQLListesi(const Liste:TStrings):Boolean;
//SQL Instance larının hepbirisi
var Deger,S:String; Len,i:Integer;
begin
  Liste.Clear;
  RegQueryMultiStringValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Microsoft SQL Server','InstalledInstances',Deger);
  i:=1; S:=''; Len:=Length(Deger);
  repeat
    if Deger[i]=#0 then begin
      if Liste.Count=0 then Liste.Add('') else Liste.Add(S);
      S:='';
    end else S:=S+Deger[i];
    i:=i+1;
  until i>=Len;
  Liste.Add(S);
end;

function GetSQLMSDEVersion(): String;
begin
  if not RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion', 'CurrentVersion', Result ) then Result:='';
end;
///////////////////////////////////////////////////////////////////////////////////////////////////
function InitializeSetup(): Boolean;
//Setup.exe çalışmaya başlıyor
begin
  Result:=True;
  lblSQLAdi:=nil;
  edtSQLAdi:=nil;
  TasksList:=nil;
  InstanceNames:=nil;
  cbxBlankSAPWD:=nil;
  edtSAPWD:=nil;
  edtSAPWD_OK:=nil;
  AktifEditRengi:=clWindow;
  PasifEditRengi:=clBtnFace;
  InstanceName:='';
  SQLVer:=GetSQLMSDEVersion;
  SQLYuklu:=SQLVer<>'';
  Yuklendi:=False;
  //if StartNTService('MSSQLSERVER') then Mesaj('başladım') else Mesaj('olmadı');
  if SQLYuklu then begin
    Result:=MsgBox('Sistemde yüklü SQL Server var. Farklı bir SQL yüklemek istiyor musunuz?',mbError,MB_YESNO or MB_DEFBUTTON2)=IDYES;
    if Result then begin
      InstanceNames:=TStringList.Create;
      SQLListesi(InstanceNames);
    end;
  end;
  if Result then cmpToplayici:=TComponent.Create(nil) else cmpToplayici:=nil;
end;

procedure DeinitializeSetup();
//Setup.exe kapatılıyor
var ServisAdi:String;
begin
  if Assigned(cmpToplayici) then cmpToplayici.Free;
  if Assigned(InstanceNames) then InstanceNames.Free;
  if Yuklendi then begin
    if InstanceName='' then ServisAdi:='MSSQLSERVER' else ServisAdi:='MSSQL$'+InstanceName;
    if StartNTService(ServisAdi) then //Servis başlatıldı
    else Mesaj('SQL Server hizmetinin başlatılamadı.');
  end;
end;

procedure cbxBlankSAPWDButtonClick(Sender: TObject);
begin
  if Assigned(edtSAPWD) then begin
    edtSAPWD.Enabled:=not cbxBlankSAPWD.Checked;
    if edtSAPWD.Enabled then edtSAPWD.Color:=AktifEditRengi else edtSAPWD.Color:=PasifEditRengi;
  end;
  if Assigned(edtSAPWD_OK) then begin
    edtSAPWD_OK.Enabled:=not cbxBlankSAPWD.Checked;
    if edtSAPWD_OK.Enabled then edtSAPWD_OK.Color:=AktifEditRengi else edtSAPWD_OK.Color:=PasifEditRengi;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
var Ust:Integer;
begin
  case PageID of
    wpSelectTasks:begin
      if not Assigned(TasksList) then begin
        TasksList:=TNewCheckListBox(WizardForm.FindComponent(('TasksList')));
        with TasksList do begin
          Height:=ScaleY(45);
          Ust:=Top+Height;
        end;
      end;
      if not Assigned(lblSQLAdi) then begin
        lblSQLAdi:=TLabel.Create(TasksList.Owner);
        with lblSQLAdi do begin
          Parent := TasksList.Parent;
          Caption := 'SQL Server Adı (Instancename)...:';
          Left := TasksList.Left;
          Top := Ust;
          Width := ScaleX(450);
          Height := ScaleY(13);
          Ust := Ust + Height + Ara;
        end;
      end;
      if not Assigned(edtSQLAdi) then begin
        edtSQLAdi:=TEdit.Create(TasksList.Owner);
        with edtSQLAdi do begin
          Parent := TasksList.Parent;
          Left := TasksList.Left;
          Top := Ust;
          Width := ScaleX(269);
          Height := ScaleY(21);
          Ust := Ust + Height + Ara;
        end;
      end;
      if not Assigned(cbxBlankSAPWD) then begin
        cbxBlankSAPWD:=TCheckBox.Create(TasksList.Owner);
        with cbxBlankSAPWD do begin
          Parent:=TasksList.Parent;
          Left:=TasksList.Left;
          Top:=Ust;
          Width:=ScaleX(450);
          Height:=ScaleY(13);
          Caption:='Şifre kullanma (BALNKSAPWD) ...:';
          Checked:=True;
          OnClick := @cbxBlankSAPWDButtonClick;
          Ust := Ust + Height + Ara;
        end;
      end;
      if not Assigned(edtSAPWD) then begin
        edtSAPWD:=TEdit.Create(TasksList.Owner);
        with edtSAPWD do begin
          Parent := TasksList.Parent;
          Left := TasksList.Left;
          Top := Ust;
          Width := ScaleX(269);
          Height := ScaleY(21);
          AktifEditRengi := Color;
          PasswordChar := '*';
          Ust := Ust + Height + Ara;
        end;
      end;
      if not Assigned(edtSAPWD_OK) then begin
        edtSAPWD_OK:=TEdit.Create(TasksList.Owner);
        with edtSAPWD_OK do begin
          Parent := TasksList.Parent;
          Left := TasksList.Left;
          Top := Ust;
          Width := ScaleX(269);
          Height := ScaleY(21);
          PasswordChar := '*';
          Ust := Ust + Height + Ara;
        end;
      end;
      cbxBlankSAPWDButtonClick(cbxBlankSAPWD);
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
var ini,S:String;
begin
  case CurPageID of
    wpWelcome:begin
      if SQLYuklu then begin
        //WizardForm.NextButton.Click;
        SendMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
        SendMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
      end;
    end;
    wpSelectComponents:;
    wpFinished:;
    wpSelectTasks:begin
      //WizardForm.NextButton.Click;
      if not SQLYuklu then begin
        SendMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
        SendMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
      end;
    end;
    wpInstalling:begin
      S:=YolTamamla(ExpandConstant('{app}'));
      if not DirExists(S) then ForceDirectories(S);
      ini:=S+'setup.ini';
      if FileExists(ini) then DeleteFile(ini);
      if not Assigned(cbxBlankSAPWD) or cbxBlankSAPWD.Checked then SetIniString(iniSec,'BLANKSAPWD','1',ini)
      else SetIniString(iniSec,'SAPWD',TirnakliStr(edtSAPWD.Text),ini);
      if TasksList.Checked[0] then S:='1' else S:='0';
      SetIniString(iniSec,'DisableNetworkProtocols',S,ini);
      if TasksList.Checked[1] then SetIniString(iniSec,'SecurityMode','SQL',ini);
      if Assigned(edtSQLAdi) and (Trim(edtSQLAdi.Text)<>'') then begin
        InstanceName:=edtSQLAdi.Text;
        SetIniString(iniSec,'InstanceName',TirnakliStr(InstanceName),ini);
      end;// else SetIniString(iniSec,'InstanceName','',ini);
    end;
  end;
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
  Result:=True;
  case CurPage of
    wpSelectTasks:begin
      if SQLYuklu and Assigned(InstanceNames) and Assigned(edtSQLAdi) then begin
        Result:=InstanceNames.IndexOf(edtSQLAdi.Text)<0;
        if not Result then begin
          MsgBox('Sistemde zaten "'+edtSQLAdi.Text+'" isimde sql server yüklü.',mbCriticalError,MB_OK);
          Exit;
        end;
      end;
      if Assigned(cbxBlankSAPWD) and not cbxBlankSAPWD.Checked then begin
        Result:=(Trim(edtSAPWD.Text)<>'') and (edtSAPWD.Text=edtSAPWD_OK.Text);
        if not Result then begin
          MsgBox('Belirttiğiniz şifre değeri geçersizdir.',mbCriticalError,MB_OK);
          WizardForm.ActiveControl:=edtSAPWD;
        end;
      end;
      Yuklendi:=Result;
    end;
  end;
end;
En son sabanakman tarafından 13 Şub 2008 01:06 tarihinde düzenlendi, toplamda 3 kere düzenlendi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Yukarıda yazılan kodların açıklamasıyla ilgilenenler buradan devam edebilirler :) . Her şeyden önce Inno Setup ile harici .dll dosyalarda bulunan fonksiyonlar kullanılabilmetedir. Mesela kernel32.dll'de bulunan WinExec fonksiyonunu delphiden kullanabilmek için

Kod: Tümünü seç

function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT; stdcall;external 'kernel32.dll' name 'WinExec';
şeklinde yazmak yeterlidir. Inno Setup'ta durum biraz farklı.

Kod: Tümünü seç

type
  LPCSTR = PChar;
.
.
.
function WinExec(lpCmdLine: LPCSTR; uCmdShow: UINT): UINT;external 'WinExec@kernel32.dll stdcall';
Aslında LPCSTR yerine PChar direk yazılabilirdi ama delphi kütüphanesinde bulunan tiplerle eş tiplerim olsun istedim. Sanırım bu bir çeşit simetri hastalığı :) . Dikkat edilirse inno tarafında .dll fonksiyonu en sonda belirtilen external ile belirtilen 'fonksiyonadi@dlladi çağırmabiçimi' yapısı kullanılmaktadır.

StartNTService fonksiyonu ve öncesi sırf hizmeti başlatmak için. Ama bu çalışmadığından o kısmın pek bir işlevi kalmadı. var bloğundaki değişkenler hariç tabi.
cmpToplayici:TComponent;->Kodlarla inno setup penceresine kendi oluşturduğum bileşenlerin sahibi. Daha sonra onları yok etmek için bu bileşeni yok etmek yeterli olacak (cmpToplayici.Free). Bir zamanlar açıkta bileşenim kalınca tuhaf hatalar almıştım o gün bu gündür inno da bu tekniği kullanırım. Owner olarak inno bileşenlerinden birisini kullanabilirdim ama orjinal mimariye dokunmamak için kendi bileşenlerime kendim sahip oluşturdum.
InstanceNames:TStringList;->sistemde sql server yüklü ise bunlar için kullanılan instancename'lerin listesini tutar
SQLVer,->yüklü olan sql server versiyonu
InstanceName:String;->yüklenecek olan sql'in instancename'i
SQLYuklu,->sistemde sql server'ın yüklü olup olmadığını tutması için
Yuklendi:Boolean;->kurulumu tamamlayarak mı çıkıldı yoksa iptal edilerek mi çıkıldı bunu tutması için
lblSQLAdi:TLabel;->kurarken instancename in yazılacağı edit'in açıklama yazısı. Biz kodla oluşturacağız
edtSQLAdi:TEdit;->kurarken instancename in yazılacağı edit. Bu edit'i biz kodla oluşturacağız
TasksList:TNewCheckListBox;->Tasks ile belirttiğimiz görevleri içinde listeleyen ana bileşen. Inno Setup formunda görevler seçilirken pencerede bu bileşen gelir. Biz bunu FindComponent ile bulup atayacağız.
cbxBlankSAPWD:TCheckBox;->sa şifresi boş mu olacak yoksa bir şifre mi verilecek.
edtSAPWD,edtSAPWD_OK:TEdit;->sa şifresi verilecekse bu şifre ve şifre onayı girişlerinin yazılacağı edi. Bu bileşenleri biz oluşturacağız.
AktifEditRengi,PasifEditRengi:TColor;->sa şifresi girilen kutucukların renklerini aktifken ve pasifken belirten değerleri tutmak için.

Bir çok kuruluma koyduğum standart fonksiyonlar. Bazıları kullanılmamış olabilir.
function Calistir(const Komut:String;const PencereDurumu:UINT):UINT;{SW_SHOW,SW_NORMAL,SW_HIDE vs.}
//program çalıştırır

procedure Mesaj(const S:String);
//Ekrana mesaj vermek için

function YolTamamla(const S:String):String;
//klasörler için en sonda \ karakteri olmasını sağlar

function YolTamamlama(const S:String):String;
//klasörler için en sonda \ karakterinin olmamasını sağlar

function TirnakliStr(const S:String):String;
//Bilginin her iki yanına da " karakteri ekler.

function GetSQLMSDEVersion(): String;
//Sistemde yüklü olan sql server versiyonu

function SQLListesi(const Liste:TStrings):Boolean;
//sistemde yüklü olan sql server instancename'lerini okur

kurulum programı açılırken başlangıç değerleri ayarlanmalı

Kod: Tümünü seç

function InitializeSetup(): Boolean;
//Setup.exe çalışmaya başlıyor
begin
  Result:=True;
  lblSQLAdi:=nil;
  edtSQLAdi:=nil;
  TasksList:=nil;
  InstanceNames:=nil;
  cbxBlankSAPWD:=nil;
  edtSAPWD:=nil;
  edtSAPWD_OK:=nil;
  AktifEditRengi:=clWindow;
  PasifEditRengi:=clBtnFace;
  InstanceName:='';
  SQLVer:=GetSQLMSDEVersion;
  SQLYuklu:=SQLVer<>'';
  Yuklendi:=False;
  //if StartNTService('MSSQLSERVER') then Mesaj('başladım') else Mesaj('olmadı');
  if SQLYuklu then begin
    Result:=MsgBox('Sistemde yüklü SQL Server var. Farklı bir SQL yüklemek istiyor musunuz?',mbError,MB_YESNO or MB_DEFBUTTON2)=IDYES;
    if Result then begin
      InstanceNames:=TStringList.Create;
      SQLListesi(InstanceNames);
    end;
  end;
  if Result then cmpToplayici:=TComponent.Create(nil) else cmpToplayici:=nil;
end;
kurulum kapatılırken oluşturulan nesneler varsa bunlar yok edilir

Kod: Tümünü seç

procedure DeinitializeSetup();
//Setup.exe kapatılıyor
var ServisAdi:String;
begin
  if Assigned(cmpToplayici) then cmpToplayici.Free;
  if Assigned(InstanceNames) then InstanceNames.Free;
  if Yuklendi then begin
    if InstanceName='' then ServisAdi:='MSSQLSERVER' else ServisAdi:='MSSQL$'+InstanceName;
    if StartNTService(ServisAdi) then //Servis başlatıldı
    else ;//Mesaj('SQL Server hizmetinin başlatılamadı.');
  end;
end;
procedure cbxBlankSAPWDButtonClick(Sender: TObject);
//cbxBlankSAPWD checkbox'ının onClick olayı

function ShouldSkipPage(PageID: Integer): Boolean;
{Kurulum sırasında sayfa değişirken hemen öncesinde çalışır ve görevlerin seçildiği sayfada kodla diğer bileşenleri oluşturmak için uygun kod bloğudur. TasksList nesnesi, görevleri seçtiren bileşendir. Parent değeri sonradan oluşan nesnelerle aynı değere atamak için kullanılır. Ayrıca olay ataması da OnClick := @cbxBlankSAPWDButtonClick; şeklinde yapılmıştır}

procedure CurPageChanged(CurPageID: Integer);
prosedüründe ise sayfa ekrana gelir ve öyle çalışır. Bazı sayfalar SendMessage ile otomatik olarak atlatılarak angarya olan bazı tıklamalar atlatılmıştır. Aslında ilginçtir WizardForm.NextButton.Click; kodu çalışması gerektiği halde çalışmadığı için bu yola baş vurdum. Özellikle wpInstalling sayfasında yapılan seçime göre Setup.ini dosya değerleri oluşturulduğuna dikkat çekerim.

function NextButtonClick(CurPage: Integer): Boolean;
fonksiyonu ise kurulum için girilen değerlerin geçerliliğini kontrol edip, uygunsa devam edilmesini sağlayan kodların bulunduğu fonksiyondur. Bu kısa açıklamalar eşliğinde kodlara göz gezdirmek onları anlamaya yetecektir umarım. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

Bu tarz setup hazırlamak isteyenler için yararlı bir makale...Gerçi bana pek mantıklı gelmiyor server-client database i setup'a atmak...ama lazım olabilir...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Usb belleklerimizde 107 MB yerine 38 MB yer kaplayan ve daha küçük nur topu bir kurulumumuz oldu. Küçük gibi görünen bu fark şu 1 ayda satışta ve destekte bulunan arkadaşlarımızın çok işine yaradı. Ayrıca program demosu isteyen müşteriler için de uzun uzadıya tarif yerine tıkla ve bekle mantığı güdüldüğünden orjinal kurulumla arasında ağır bir fark ortaya çıktı. Zira her müşteri okuduğunu veya anlatılanı uygulayabilme kapasitesine sahip olamıyor malesef :cry: . İşi bilen için o kadar kurulumu hazırlama işi tamamen bir angarya aslında ama bu biçimde bir kurulum, içinde bulunulan bu durumda kaçınılmaz oluyor malesef.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

@sabanakman

wizard tarzı işlemler windowsun yaygınlaşmasının en büyük sebebidir. Ben logo firmasında çalışıp "nasıl kuruluyordu lan bu sql " diye firmayla 1 saat telde konuşanlarıda gördüm. onun için bu çalışma bence çok yararlı bir çalışma. sonuçta 100 mb nere 37 mb nere üstelikte entegre setup çok büyük bir yetenek programlarımız için
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Servis başlatma işini dos komutu vererek yaptırmak gerekirse yukarıdaki kurulumda StartNTService fonksiyonunu aşağıdaki gibi değiştirmekte fayda var.

Kod: Tümünü seç

function StartNTService(const ServiceName: string): Boolean;
begin
  Calistir('net start '+Servicename,SW_HIDE);
  Result:=True;
end;
kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
hasan
Üye
Mesajlar: 129
Kayıt: 16 Oca 2004 10:01
Konum: Bursa
İletişim:

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen hasan »

hocam burda MSDE setup kurdurduktan sonra Veritabanını nasıl MSDE e tanıtacaz anlayamadım o kısmı kafama takıldı ,
SQL Script olarak mı setup a yazacaz , yoksa .MDf ve .LOG dosyalarını mı klasöre koyacaz direk o konularda yardımcı olur musunuz ?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen sabanakman »

Kod: Tümünü seç

sp_attach_db 'DBAdi', 'c:\DBAdi_data.mdf', 'c:\DBAdi_log.ldf'
var olan bir mdf dosyayı sql'e kayıt eder. Örneğe göre c:\DBAdi_data.mdf dosyasını DBAdi olarak kayda geçer. Makale, sadece MSDE kurulumunu anlatıyor o yüzde uygulamanızdan ya da harici bir ayar programından bunu halletmeniz gerekiyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
barko
Üye
Mesajlar: 15
Kayıt: 07 Oca 2008 12:01

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen barko »

Harici bir programa gerek yok

ilk önce sabit değerleri yazın

SQLServerName = 'BKILINC\SQLEXPRESS';
strDatabase='GelisimCRM';
strMDFfileName='C:\Program Files\Gelişim CRM\db\GelisimCRM.mdf';
strLOGfile='C:\Program Files\Gelişim CRM\db\GelisimCRM_log.ldf';

SQLServer.LoginSecure := True;
SQLServer.Connect(SQLServerName);

MsgBox('Microsoft SQL Server ''' + SQLServerName + ''' Sunucusuna bağlandı !.', mbInformation, mb_Ok);

SQLServer.AttachDB(strDatabase, strMDFfileName + ',' + strLOGfile);

Bu şekilde attach edebilirsiniz
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen sabanakman »

Örneği denedim, fakat SQLServer isimli değişkeni (nesneyi) tanımadı. Bu değişkenin huyu suyu nedir acep biraz açabilir misin?
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
emrahgs
Üye
Mesajlar: 114
Kayıt: 08 Tem 2008 06:25
Konum: Antalya

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen emrahgs »

- konuda bahsetmişsiniz istenirse projeye entegre edilebilir diye ben inno setup kurulum dosyamda kurulum başlamadan önce sql sever 2005 ve kurdurmak istiyorum
sql severın 2005 express editation olması sorun oluştururmu?
-birde install awere diye i program var bunu denedim bu program sql server 2005 i tüm bileşenleriyle (dotnet,installer) kullanıcıya hiç soru sormadan kuruyor biz bu yapıyı innosetup a uygulayabilirmiyiz..
- son olarak ben inno setup u istool ile kullanıyorum yani scrip bilgim hiç yok bu bahsettiklerimi yapmam için inno scrip bilgim i nasıl geliştirebilirim

hocam biraz uzun oldu ama yardımcı olursanız sevinirim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen sabanakman »

-Dikkat edilirse kur altındaki dosyaların barındırdığı dosyalar MSDE kurulum dosyalarıdır ve onun çalışma prensibine göre çalışmaktadır. SQL 2005 Express için tek bir kurulum dosyası bulunmakta fakat bunu otomatik kurdurmak için nasıl bir yol izlenmesi gerektiği hakkında bilgim yoktur.
-SQL 2005'in bu şekilde kurulmasını sağlayan sistem her neyse onu kullanarak yapmak mümkündür.
-Script'ten kasıt kod yazma ise inno setup bildiğimiz pascal script'ten ibaret. Bunu inno setup ile ilgili bilgi veren sistelerden ve kendi yardım dosyasından elde edebileceğin gibi, inno setup açık kaynak kodlu bir projedir. Kaynak kodları da elde ederek bir çalışmaya girebilirsin. Bir arayüze sahip olmadığı için bu kısımların oldukça zahmetli olduğunu kabul ediyorum ama deneme yanılmalarınla sonuca gidebilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen sabanakman »

Eğer kullanmak isteyen olursa SQL Server 2005 ve 2008 Express kurulumlarında Setup.exe'ye verilen parametrelerle otomatik kurulum yapılabilmektedir.

Kod: Tümünü seç

setup.exe /qb ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD=sa_sifresi SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"
gibi. Şu anda bu parametre işlevlerini uzun uzadıya açıklama işine giremeyeceğim ama 3 aşağı 5 yukarı zaten isimlerinden açıklayıcı olduğu kanaatindeyim.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Inno Setup ile MSDE Kurulumu

Mesaj gönderen thelvaci »

Belki sorunu çoktan aşmış olabilirsiniz ama ben yine de yazmak istedim Şaban bey. Makalenizin bir yerlerinde Temp isimli PChar bir değişkene nil ataması yapamadığınızı ifade etmişsiniz. Sanırım bu Inno Setup'in script dilinin yetersizliğinden kaynaklanıyordur ancak PChar bir Pointer tip olduğuna göre nil'e eşdeğer bir atamayı;

Kod: Tümünü seç

var
  Temp : PChar;
begin
  Temp := Pointer(0);
end;
yazarak da yapabilirsiniz. İşinize yaraması ümidi ile.
Cevapla