Tab restoring: avoid restoring tab file only if the owner is a *HeidiSQL* process. Fixes non-restored tabs when an old Heidi process id is re-assigned to another application. Happened here at least one time.

This commit is contained in:
Ansgar Becker
2020-11-09 18:08:06 +01:00
parent 13610e70f6
commit 66c50ce792
2 changed files with 33 additions and 5 deletions

View File

@ -367,7 +367,7 @@ type
function RunningAsUwp: Boolean;
function GetThemeColor(Color: TColor): TColor;
function ThemeIsDark(ThemeName: String): Boolean;
function ProcessExists(pid: Cardinal): Boolean;
function ProcessExists(pid: Cardinal; ExeNameMatchesExpression: String=''): Boolean;
procedure ToggleCheckBoxWithoutClick(chk: TCheckBox; State: Boolean);
var
@ -2940,11 +2940,12 @@ begin
end;
function ProcessExists(pid: Cardinal): Boolean;
function ProcessExists(pid: Cardinal; ExeNameMatchesExpression: String=''): Boolean;
var
Proc: TProcessEntry32;
SnapShot: THandle;
ContinueLoop: Boolean;
rx: TRegExpr;
begin
// Check if a given process id exists
SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
@ -2952,7 +2953,26 @@ begin
Result := False;
ContinueLoop := Process32First(SnapShot, Proc);
while ContinueLoop do begin
Result := Proc.th32ProcessID = pid;
if Proc.th32ProcessID = pid then begin
// Found the process id, probably check if it matches a given pattern
if not ExeNameMatchesExpression.IsEmpty then begin
rx := TRegExpr.Create;
rx.ModifierI := True;
rx.Expression := ExeNameMatchesExpression;
try
Result := rx.Exec(Proc.szExeFile);
except
on E:Exception do begin
MainForm.LogSQL(E.Message, lcError);
Result := False;
end;
end;
rx.Free;
end else begin
// Pattern empty
Result := True;
end;
end;
if Result then
Break;
ContinueLoop := Process32Next(SnapShot, Proc);