mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 20:50:20 +08:00
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:
@ -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);
|
||||
|
@ -2361,6 +2361,7 @@ var
|
||||
pid: Cardinal;
|
||||
EditorHeight, HelpersWidth: Integer;
|
||||
BindParams: String;
|
||||
ExeNameExpression: String;
|
||||
begin
|
||||
// Restore query tab setup from tabs.ini
|
||||
Result := True;
|
||||
@ -2371,6 +2372,11 @@ begin
|
||||
|
||||
Sections := TStringList.Create;
|
||||
TabsIni.ReadSections(Sections);
|
||||
ExeNameExpression := '(' +
|
||||
QuoteRegExprMetaChars(ExtractFileName(Application.ExeName)) +
|
||||
'|' +
|
||||
QuoteRegExprMetaChars(APPNAME) +
|
||||
')';
|
||||
|
||||
for Section in Sections do begin
|
||||
|
||||
@ -2381,9 +2387,11 @@ begin
|
||||
HelpersWidth := TabsIni.ReadInteger(Section, 'HelpersWidth', 0);
|
||||
BindParams := TabsIni.ReadString(Section, 'BindParams', '');
|
||||
|
||||
// Don't restore this tab if it belongs to a different running process
|
||||
if (pid > 0) and (pid <> GetCurrentProcessId) and ProcessExists(pid) then
|
||||
// Don't restore this tab if it belongs to a different running Heidi process
|
||||
if (pid > 0) and (pid <> GetCurrentProcessId) and ProcessExists(pid, ExeNameExpression) then begin
|
||||
LogSQL(IfThen(BackupFilename.IsEmpty, Filename, BackupFilename)+' loaded in process #'+pid.ToString);
|
||||
Continue;
|
||||
end;
|
||||
|
||||
// Either we have a backup file, or a user stored file.
|
||||
// Both of them may not exist.
|
||||
|
Reference in New Issue
Block a user