CreateProcess SQLEXPRESS 2008 için Parametre ve SW_HIDE?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kutercakal007
Üye
Mesajlar: 25
Kayıt: 04 Ara 2010 12:34

CreateProcess SQLEXPRESS 2008 için Parametre ve SW_HIDE?

Mesaj gönderen kutercakal007 »

Merhabalar daha önce Şaban Hocam ın yazmış olduğu yazıdan yola çıkarak ( viewtopic.php?t=22430 ) SQLEXPRESS 2008 i uygulamam öncesi kurdurmak için projeme uyarlamaya çalıştım. SQL kurulumunu uygulama içerisinden CreateProcess yöntemiyle çağırıp çalıştırabiliyorum fakat parametre gönderiminde hata yaptığımı ve SW_HIDE yönetimini yanlış kullandığımı düşünüyorum. Ya da SQLEXPRESS 2008 kurulumum dışarıdan parametre kabul etmiyor :? Aklıma gelen muhtemel çözümleri denedim ama bir sonuç elde edemedim.
Yapmak istediğim şey ise daha açık bir ifadeyle şu :
SQLEXPRESS kurulumunu çalıştırıp program içinden parametrelerini göndermek ve kurulumu kullanıcıya hiçbir şekilde göstermeden (SW_HIDE??) yaptırmak. Kodlarım ise şunlar:

Kod: Tümünü seç


unit SERVERKURULUMUNIT;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls, ShellApi;

type
  TSERVERKURULUMFORM = class(TForm)
    Bit32: TRadioButton;
    Bit64: TRadioButton;
    Secim_LB: TLabel;
    Bilgilendirme: TLabel;
    Resim: TImage;
    Baslat: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure BaslatClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SERVERKURULUMFORM: TSERVERKURULUMFORM;

implementation

{$R *.dfm}

function RunProcess(const AppPath:string; MustWait: Boolean; AppParams: string; Visibility: Word):DWORD;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  Proc: THandle;
  zFileName, zParams: array[0..512] of Char;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  SI.wShowWindow := SW_HIDE;
  if not CreateProcess(StrPCopy(zFileName, AppPath),StrPCopy(zParams, AppParams), nil, nil, false, Normal_Priority_Class, nil, nil, SI, PI) then
    raise Exception.CreateFmt(AppPath +' Programı Çalışırken Hata Oluştu..'+#13#10+' Hata Kodu %d',[GetLastError]);

  Proc := PI.hProcess;
  CloseHandle(PI.hThread);

  if MustWait then
    if WaitForSingleObject(Proc, Infinite) <> Wait_Failed then
      GetExitCodeProcess(Proc, Result);
  CloseHandle(Proc);
end;


procedure TSERVERKURULUMFORM.FormCreate(Sender: TObject);
var
  yol:String;
begin
  yol:=ParamStr(0);
  yol:=copy(yol,1,length(yol)-17); //serverkurulum.exe (17)
  yol:=yol+'resimler\kurulacak.ico';
  Resim.Picture.LoadFromFile(yol);
end;

procedure TSERVERKURULUMFORM.BaslatClick(Sender: TObject);
var
  yol,parametre:String;
  //stp:Array[0..512] of Char;
begin
  if (Bit32.Checked=True) then
  begin
    Bilgilendirme.Caption:='SQL SERVER Kurulumu Yapılıyor. Lütfen Bekleyiniz...';
    Bilgilendirme.Refresh;
    Secim_LB.Visible:=False;
    Secim_LB.Refresh;
    Bit32.Visible:=False;
    Bit32.Refresh;
    Bit64.Visible:=False;
    Bit64.Refresh;
    Baslat.Visible:=False;
    Baslat.Refresh;
    Resim.Top:=Round(((SERVERKURULUMFORM.Height/2)-(Resim.Height/2)));
    Resim.Left:=Round(((SERVERKURULUMFORM.Width/2)-(Resim.Width/2)));
    Resim.Picture:=nil;
    Resim.Refresh;
    yol:=ParamStr(0);
    yol:=copy(yol,1,length(yol)-17); //serverkurulum.exe (17)
    yol:=yol+'resimler\kuruluyor.ico';
    Resim.Picture.LoadFromFile(yol);
    Resim.Refresh;
    //StrPCopy(stp,'SQLSetup32.exe /qb ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD='''' SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"');
    //ShellExecute(Handle,'open',stp,nil,nil,SW_HIDE);//Parametreli
    //RunProcess('SQLSetup32.exe', True, 'ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD='''' SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"', SW_HIDE);
    parametre:=' /qb ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD='''' SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"';
    ShowMessage(parametre);
    RunProcess('SQLSetup32.exe', True, parametre, SW_HIDE);
    Bilgilendirme.Caption:='SQL SERVER Kurulumu Tamamlandı.';
    Bilgilendirme.Refresh;
    yol:=ParamStr(0);
    yol:=copy(yol,1,length(yol)-17); //serverkurulum.exe (17)
    yol:=yol+'resimler\kuruldu.ico';
    Resim.Picture.LoadFromFile(yol);
    Resim.Refresh;
    Sleep(3000);
    WakeMainThread(SERVERKURULUMFORM);
    Close;
  end
  else if (Bit64.Checked=True) then
  begin
    Bilgilendirme.Caption:='SQL SERVER Kurulumu Yapılıyor. Lütfen Bekleyiniz...';
    Bilgilendirme.Refresh;
    Secim_LB.Visible:=False;
    Secim_LB.Refresh;
    Bit32.Visible:=False;
    Bit32.Refresh;
    Bit64.Visible:=False;
    Bit64.Refresh;
    Baslat.Visible:=False;
    Baslat.Refresh;
    Resim.Picture:=nil;
    Resim.Refresh;
    Resim.Top:=Round(((SERVERKURULUMFORM.Height/2)-(Resim.Height/2)));
    Resim.Left:=Round(((SERVERKURULUMFORM.Width/2)-(Resim.Width/2)));
    Resim.Refresh;
    yol:=ParamStr(0);
    yol:=copy(yol,1,length(yol)-17); //serverkurulum.exe (17)
    yol:=yol+'resimler\kuruluyor.ico';
    Resim.Picture.LoadFromFile(yol);
    Resim.Refresh;
    //StrPCopy(stp,'SQLSetup32.exe /qb ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD='''' SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"');
    //ShellExecute(Handle,'open',stp,nil,nil,SW_HIDE);//Parametreli
    RunProcess('SQLSetup64.exe', True, 'ADDLOCAL=ALL INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD='''' SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"', SW_HIDE);
    Bilgilendirme.Caption:='SQL SERVER Kurulumu Tamamlandı.';
    Bilgilendirme.Refresh;
    yol:=ParamStr(0);
    yol:=copy(yol,1,length(yol)-17); //serverkurulum.exe (17)
    yol:=yol+'resimler\kuruldu.ico';
    Resim.Picture.LoadFromFile(yol);
    Resim.Refresh;
    Sleep(3000);
    WakeMainThread(SERVERKURULUMFORM);
    Close;
  end
  else
    ShowMessage('İşletim Sisteminizi Seçmeden Kuruluma Geçemezsiniz!');
end;

end.

Yardımlarınız için şimdiden çok teşekkür ederim iyi çalışmalar selametle..
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: CreateProcess SQLEXPRESS 2008 için Parametre ve SW_HIDE?

Mesaj gönderen sabanakman »

Parametreli kurulum meselesi, SQL 2005 te değiştirilmiş ama sanırım 2008 de biraz daha değiştirilmiş. Konuyu detaylı olarak henüz araştırma fırsatım olmadı ama sql 2005 için

Kod: Tümünü seç

setup.exe /qb ADDLOCAL=SQL_Engine INSTANCENAME=MSSQLSERVER SQLAUTOSTART=1 ADDUSERASADMIN=1 SQLBROWSERAUTOSTART=1 SECURITYMODE=SQL SAPWD=sa_şifresi SQLCOLLATION=TURKISH_CI_AS DISABLENETWORKPROTOCOLS=0 SQLACCOUNT="NT AUTHORITY\SYSTEM"
şeklinde parametre ile kurulum yapılabiliyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
kutercakal007
Üye
Mesajlar: 25
Kayıt: 04 Ara 2010 12:34

Re: CreateProcess SQLEXPRESS 2008 için Parametre ve SW_HIDE?

Mesaj gönderen kutercakal007 »

Saban hocam kurulumu yaptım. Parametre alımını da yaptı sizinkine benzer bir yöntem uyguladım. Kodu şu şekilde değiştirdim.

Kod: Tümünü seç

function RunProcess(const AppPath:string; MustWait: Boolean; AppParams: string; Visibility: Word):DWORD;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  Proc: THandle;
  zFileName: array[0..512] of Char;
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  SI.wShowWindow := SW_NORMAL;
  if not CreateProcess(nil,StrPCopy(zFileName, AppPath), nil, nil, false, Normal_Priority_Class, nil, nil, SI, PI) then
    begin
    raise Exception.CreateFmt(AppPath +' Programı Çalışırken Hata Oluştu..'+#13#10+' Hata Kodu %d',[GetLastError]);
    Application.Terminate;
    Halt;
    end;
  Proc := PI.hProcess;
  CloseHandle(PI.hThread);

  if MustWait then
    if WaitForSingleObject(Proc, Infinite) <> Wait_Failed then
      GetExitCodeProcess(Proc, Result);
  CloseHandle(Proc);
end;
Daha sonra fonksiyona şu parametreleri gönderdim :

Kod: Tümünü seç

RunProcess('SQLSetup32.exe /q /ACTION=Install /FEATURES=SQL /INSTANCENAME=SQLEXPRESS /SQLSVCACCOUNT="NT AUTHORITY\SYSTEM" /SQLSYSADMINACCOUNTS="NT AUTHORITY\LOCAL SERVICE" /AGTSVCACCOUNT="NT AUTHORITY\LOCAL SERVICE"',True, '', SW_HIDE);
Yardımın için çok teşekkür ederim hocam emeğine sağlık selametle..
Cevapla