Challenge 9

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 9

Mesaj gönderen thelvaci »

SimaWB yazdı:JEDI kütüphanesinden aldığım yardımlarla aşağıdaki tanımlamaları yaptım:

Kod: Tümünü seç

type
  APPLICATION_RECOVERY_CALLBACK = function (pvParameter : Pointer) : DWORD; stdcall;
  TApplicationRecoveryCallback = APPLICATION_RECOVERY_CALLBACK;

  function ApplicationRecoveryFinished(bSuccess : BOOL) : HRESULT; stdcall;
  function ApplicationRecoveryInProgress(out pbCanceled : BOOL) : HRESULT; stdcall;
  function GetApplicationRecoveryCallback(hProcess: THandle; pRecoveryCallback : TApplicationRecoveryCallback; ppvParameter : PPointer; dwPingInterval : PDWORD; dwFlags : PDWORD) : HRESULT; stdcall;
  function GetApplicationRestartSettings(hProcess: THandle; pwzCommandline : PWideChar; var pcchSize : DWORD; pdwFlags : PDWORD) : HRESULT; stdcall;
  function RegisterApplicationRecoveryCallback(pRecoveryCallback : TApplicationRecoveryCallback;pvParameter : Pointer;dwPingInterval : DWORD;dwFlags : DWORD) : HRESULT; stdcall;
  function RegisterApplicationRestart(pwzCommandline: PWideChar; dwFlags: DWORD): HRESULT; stdcall;
  function UnregisterApplicationRecoveryCallback : HRESULT; stdcall;
  function UnregisterApplicationRestart : HRESULT; stdcall;

implementation

function ApplicationRecoveryFinished;  external kernel32 Name 'ApplicationRecoveryFinished';
function ApplicationRecoveryInProgress; external kernel32 Name 'ApplicationRecoveryInProgress';
function GetApplicationRecoveryCallback; external kernel32 Name 'GetApplicationRecoveryCallback';
function GetApplicationRestartSettings; external kernel32 Name 'GetApplicationRestartSettings';
function RegisterApplicationRecoveryCallback; external kernel32 Name 'RegisterApplicationRecoveryCallback';
function RegisterApplicationRestart; external kernel32 Name 'RegisterApplicationRestart';
function UnregisterApplicationRecoveryCallback; external kernel32 Name 'UnregisterApplicationRecoveryCallback';
function UnregisterApplicationRestart;  external kernel32 Name 'UnregisterApplicationRestart';
Daha sonra; program göçtüğünde bir log dosyası oluşturmak için bir callback fonksiyonu tanımladım:

Kod: Tümünü seç

function RecoveryCallback(pvParameter: Pointer): DWORD; stdcall;
var
  FS: TFileStream;
  MyClass: TObject;
  Mesaj: String;
begin
  FS := TFileStream.Create('C:\Log.txt', fmCreate);
  try    
    Mesaj := Format('%s => %s', [FormatDateTime('dd/mm/yyyy hh:nn:ss', Now), 'Program göçtü :(']);
    FS.Write(Mesaj[1], Length(Mesaj));
    ApplicationRecoveryFinished(True);
  finally
    FS.Free;
  end;  
  Result := 0;
end;
Bir butona basıldığında bu callback fonksiyonu program kurtarma için register ettim:

Kod: Tümünü seç

procedure TFormTest.RegisterClick(Sender: TObject);
var
  Res: HRESULT;
begin
  Res := RegisterApplicationRecoveryCallback(RecoveryCallback, nil, 5000, 0);
  if (Res <> S_OK) then
    ShowMessage('Register error');
end;
Yine başka bir butonla exception oluşturuyorum ama RecoveryCallback fonksiyonu çalışmıyor :(
Samimi yazımı affedin ama, şunu demek istiyorum: "Senin Allahına kurban olayım veli kardeşim".

Ek'teki projeyi bir inceleyebilirsiniz. 60 saniye bekleyin; ardından "Recover Restart" button'una basın ve ardından "Block Application Manually" düğmesine basın. Uygulama 5 saniye sonra yanıt vermez duruma düşecektir. Uygulamayı kapatmaya çalışın ve gelen dialog'ta ek olarak görünen restart seçeneğine basın ve sonuçları görün ;)
RegisterApplicationRestartRecovery.rar
(56.8 KiB) 131 kere indirildi
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Challenge 9

Mesaj gönderen xxxjedixxx »

Gerçekten çok faydalı bir çalışma oldu. Emeği geçen herkese çok teşekkürler.
Cevapla