Challenge 8

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

G.Arkas yazdı:Cevap 2

Kod: Tümünü seç

function MutextVarMi(MutexName: PChar): boolean;
var handle : THandle;
begin
Result := False;
handle := CreateMutex(nil, true, MutexName);
if GetLastError = ERROR_ALREADY_EXISTS then
Result := True
else
if handle <> 0 then CloseHandle(handle);
end;
Yeni bir mutex oluşturup onunla açılır eski mutexi taratıp varsa TerminateProcess. Her yeni mutex otomatik artalan oluşturur. Kendimden bir önceki mutexi tespit ederim. Ve sonlandırırım.

Evet, ama denese idiniz şunu görecektiniz; siz uygulamanızı kapattığınızda mutex'inizde kernel tarafından serbest bırakılacak ve sizin mutex güme gitmiş olacaktı. Şimdi buna çözüm bulmalısınız demeye çalışıyorum esasen ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

Hocammmm 2. Cevappp olabiler mi ki ne? :)
Resim
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

thelvaci yazdı:
G.Arkas yazdı:Cevap 2

Kod: Tümünü seç

function MutextVarMi(MutexName: PChar): boolean;
var handle : THandle;
begin
Result := False;
handle := CreateMutex(nil, true, MutexName);
if GetLastError = ERROR_ALREADY_EXISTS then
Result := True
else
if handle <> 0 then CloseHandle(handle);
end;
Yeni bir mutex oluşturup onunla açılır eski mutexi taratıp varsa TerminateProcess. Her yeni mutex otomatik artalan oluşturur. Kendimden bir önceki mutexi tespit ederim. Ve sonlandırırım.

Evet, ama denese idiniz şunu görecektiniz; siz uygulamanızı kapattığınızda mutex'inizde kernel tarafından serbest bırakılacak ve sizin mutex güme gitmiş olacaktı. Şimdi buna çözüm bulmalısınız demeye çalışıyorum esasen ;)
Hocam ben zaten her executing'de farklı Mutex ile create oluyorum. Neden problem olsun ki? Orayı anlamadım. Dynamic mutex işlemi gibi. (Salladım bu ismi)

Mesela

Kod: Tümünü seç

CreateMutex(nil, True, 'BirinciMutex')
if MutextVarMi('SifirinciMutex') then
TerminateProcess(MutexHandle)
Olmaz mı?
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

Sürekli Mutex create eder isen; uygulamamızın restart edildiğini nasıl anlayacaksın ? Hangi mutex'in varlığını kontrol ediyor olacaksın ? Ayrıca TerminateProcess bildiğin gibi bir Process Handle parametre alır; Mutex handle değil. Mutex'ten vazgeçmek için ReleaseMutex ve handle'ını kapatmak için CloseHandle kullanabilirsin. En iyisi küçücük basit bir kendini restart eden uygulama yazmaya çalış orada zaten yüzleşeceksin dediklerimle ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

G.Arkas yazdı:Hocam şu nasıl bir fikir? :)

http://www.codeforge.com/read/139719/Ap ... .pas__html
Bana Chapter 7'yi anımsattı ;)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

thelvaci yazdı:
G.Arkas yazdı:Hocam şu nasıl bir fikir? :)

http://www.codeforge.com/read/139719/Ap ... .pas__html
Bana Chapter 7'yi anımsattı ;)
Ahahahaha aynen :) Ben cevabı eğer bulamazsam senden gelecek mesaj kesin benim ölümüme sebep verecek. Çok basit bir şey çıkacak.

Resim
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

Kesinlikle çok basit bir cevabı var :)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

thelvaci yazdı:Kesinlikle çok basit bir cevabı var :)
Ahhh be hocam buldum tabii yaaaaa.

Uygulamayı Windows Startup'a atıp bilgisayarı yeniden başlatırsak uygulama da yeniden başlar :N) :N) :N)

Hocam en basiti bence bu. Bundan basiti çalışmaz bence :P :P

Kod: Tümünü seç

;
procedure BaslatiyimmiAbi(YenidenBaslat:Boolean);
begin
ReleaseMutex(MyMutHandle)
  if YenidenBaslat then
  begin
    AppName := PChar('YenidenBasla.exe') ;
    ShellExecute(0,'open', AppName, nil, nil, SW_SHOWNORMAL) ;
    end;
  end: 
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

:) :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

Biraz Muharrem Bey'in kulaklarını çınlatalım; hani onun sürekli dediği gibi bakalım aşağıdaki sihri görebilecek misiniz ;)

Kod: Tümünü seç

program pRestartApplication;

uses
  WinAPI.Windows,
  Vcl.Forms,
  uRestartApplication in 'uRestartApplication.pas' {frmRetartApp};

{$R *.res}

function IsRestarted : Boolean;
begin
  Result := false;

  MutexHandle := OpenMutex(MUTEX_ALL_ACCESS, false, 'Restart_Mutex_By_Tugrul');

  if MutexHandle <> 0 then
  begin
    WaitForSingleObject(MutexHandle, 1001);
    Result := true;
  end;
end;

begin
  bIsRestarted := IsRestarted;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  Application.CreateForm(TfrmRetartApp, frmRetartApp);
  frmRetartApp.RestartStatus := bIsRestarted;

  Application.Run;

  if MutexHandle <> 0 then
  begin
    ReleaseMutex(MutexHandle);
    CloseHandle(MutexHandle);
  end;
end.

Kod: Tümünü seç

unit uRestartApplication;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfrmRetartApp = class(TForm)
    lblMessage: TLabel;
    btnRestartApp: TButton;
    procedure btnRestartAppClick(Sender: TObject);
  private
    { Private declarations }
    procedure SetRestartStatus(const Value : Boolean);
  public
    { Public declarations }
    property RestartStatus : Boolean write SetRestartStatus;
  end;

var
  frmRetartApp: TfrmRetartApp;

  bIsRestarted  : Boolean;
  MutexHandle   : NativeUInt;


implementation

{$R *.dfm}

procedure TfrmRetartApp.btnRestartAppClick(Sender: TObject);
var
  PI  : TProcessInformation;
  SI  : TStartupInfo;
  FileName : PWideChar;
begin
  GetStartupInfo(SI);
  GetModuleFileName(0, FileName, MAX_PATH);
  FillChar(PI, SizeOf(TProcessInformation), 0);

  MutexHandle := CreateMutex(nil, true, 'Restart_Mutex_By_Tugrul');
  if CreateProcess(FileName, GetCommandLine(), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
  begin
    Sleep(1000);

    CloseHandle(PI.hThread);
    CloseHandle(PI.hProcess);

    Close;
  end;
end;

procedure TfrmRetartApp.SetRestartStatus(const Value: Boolean);
begin
  if Value
  then lblMessage.Caption := 'Restarted'
  else lblMessage.Caption := 'Yeni başlamış uygulama';
end;

end.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

thelvaci yazdı:Biraz Muharrem Bey'in kulaklarını çınlatalım; hani onun sürekli dediği gibi bakalım aşağıdaki sihri görebilecek misiniz ;)

Kod: Tümünü seç

program pRestartApplication;

uses
  WinAPI.Windows,
  Vcl.Forms,
  uRestartApplication in 'uRestartApplication.pas' {frmRetartApp};

{$R *.res}

function IsRestarted : Boolean;
begin
  Result := false;

  MutexHandle := OpenMutex(MUTEX_ALL_ACCESS, false, 'Restart_Mutex_By_Tugrul');

  if MutexHandle <> 0 then
  begin
    WaitForSingleObject(MutexHandle, 1001);
    Result := true;
  end;
end;

begin
  bIsRestarted := IsRestarted;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  Application.CreateForm(TfrmRetartApp, frmRetartApp);
  frmRetartApp.RestartStatus := bIsRestarted;

  Application.Run;

  if MutexHandle <> 0 then
  begin
    ReleaseMutex(MutexHandle);
    CloseHandle(MutexHandle);
  end;
end.

Kod: Tümünü seç

unit uRestartApplication;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfrmRetartApp = class(TForm)
    lblMessage: TLabel;
    btnRestartApp: TButton;
    procedure btnRestartAppClick(Sender: TObject);
  private
    { Private declarations }
    procedure SetRestartStatus(const Value : Boolean);
  public
    { Public declarations }
    property RestartStatus : Boolean write SetRestartStatus;
  end;

var
  frmRetartApp: TfrmRetartApp;

  bIsRestarted  : Boolean;
  MutexHandle   : NativeUInt;


implementation

{$R *.dfm}

procedure TfrmRetartApp.btnRestartAppClick(Sender: TObject);
var
  PI  : TProcessInformation;
  SI  : TStartupInfo;
  FileName : PWideChar;
begin
  GetStartupInfo(SI);
  GetModuleFileName(0, FileName, MAX_PATH);
  FillChar(PI, SizeOf(TProcessInformation), 0);

  MutexHandle := CreateMutex(nil, true, 'Restart_Mutex_By_Tugrul');
  if CreateProcess(FileName, GetCommandLine(), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
  begin
    Sleep(1000);

    CloseHandle(PI.hThread);
    CloseHandle(PI.hProcess);

    Close;
  end;
end;

procedure TfrmRetartApp.SetRestartStatus(const Value: Boolean);
begin
  if Value
  then lblMessage.Caption := 'Restarted'
  else lblMessage.Caption := 'Yeni başlamış uygulama';
end;

end.
Benim bir önceki daha basitti ki bi kere Allah Allah yaaa. :lol: :lol: :lol: Hocam injectiondan bahsederken cümleye ilk başladığımda

Kod: Tümünü seç

  PI  : TProcessInformation;
  SI  : TStartupInfo;
bahsetmiştim çözdüm sandın demi. yem atmıştım aslında. Hep yem atarım ben. :lol: :lol: :lol:
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

Kodun yarısı zaten CreateProcess için çer çöp hazırlığında geçiyor :)
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Challenge 8

Mesaj gönderen G.Arkas »

Hocam güzel method ama benimki sanki daha basit gibi ya wallahi bak. Açılışta eğer restartflag = 1 ise ReleaseMutext ShellExecute bitti yani. :) :) :)
Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Challenge 8

Mesaj gönderen thelvaci »

Yeniden başlatmak sorun değil ki; mühim olan yeniden başladığını anlamak ;) Senin örnek projeyi de paylaş istersen bir deneyeyim makinamda.
Cevapla