РЕДАКТИРОВАТЬ ...
ОК.Теперь я верю, что знаю, в чем ваша проблема ... У вас проблемы с завершением программных блоков!
Попробуйте добавить в программный раздел в качестве первого блока мой нижний блок RestartMutex.
program MyProgramName;
uses
Mutex,
Forms,
...
;
unit RestartMutex;
interface
var
Restart: boolean = false;
implementation
uses
windows,
ShellApi;
var
MutexHandle: cardinal;
AppName: PChar;
const
ID = 'MyProgram';
initialization
MutexHandle := CreateMutex (nil, False, PChar (ID));
if (GetLastError = ERROR_ALREADY_EXISTS) then
Halt;
finalization
ReleaseMutex(MutexHandle);
if Restart then
begin
AppName := PChar('MyProgramName.exe') ;
ShellExecute(0,'open', AppName, nil, nil, SW_SHOWNORMAL) ;
end:
end.
Если вы хотите перезапустить приложение, просто установите для переменной Restart значение true и затем завершите работу приложения.
Итак, потому что этоRestartMutex, добавленный первым в программном разделе, будет означать, что завершение работы модуля RestartMutex произойдет почти в конце закрытия приложения, а все остальные модули завершат выполнение перед модулем RestartMutex, что означает, что приложение может снова начать безопасный запуск!