Samimi yazımı affedin ama, şunu demek istiyorum: "Senin Allahına kurban olayım veli kardeşim".SimaWB yazdı:JEDI kütüphanesinden aldığım yardımlarla aşağıdaki tanımlamaları yaptım:Daha sonra; program göçtüğünde bir log dosyası oluşturmak için bir callback fonksiyonu tanımladı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';
Bir butona basıldığında bu callback fonksiyonu program kurtarma için register ettim: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;
Yine başka bir butonla exception oluşturuyorum ama RecoveryCallback fonksiyonu çalışmıyorKod: 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;
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
