В службе, запущенной под системной учетной записью, приведенный ниже код зависает в TMemIniFile.Create
без ошибок. Если мы заменим его на TIniFile, все будет работать нормально.
Это Win32-приложение Delphi Tokyo 10.2.3, работающее под управлением Windows Server 2012R2. Нет одновременного доступа к файлу INI.
Это первый раз (первый client) мы это видим, на многих машинах он работает нормально.
Я понятия не имею, что искать дальше. Есть идеи?
Теперь это "работает", потому что мы перешли на TIniFile
, но я хотел бы найти причину. Из других сообщений я прочитал здесь, TINIfile
кажется более привередливым, чем TMemINIfile
, моя ситуация наоборот.
Нет специальных символов в файле INI и создается с помощью редактора ASCII.
// This is set in the ServiceCreate:
FIniFileNaam := ChangeFileExt(ParamStr(0),'.INI');
// This is called from the ServiceStart:
procedure TTimetellServiceBase.LeesINI;
var lIniFile : TMemIniFile;
begin
LogMessage(FIniFileNaam, EVENTLOG_INFORMATION_TYPE, cCatInfo, cReadINI); // Logs to event log, we see this
FStartDir := ExtractFilePath(ParamStr(0));
if assigned(FLaunchThreadLijst) then FreeAndNil(FLaunchThreadLijst);
FLaunchThreadLijst := TStringList.Create;
try
if FileExists(FIniFileNaam) then
begin
// Lees waarden uit INI file
lIniFile := TMemIniFile.Create(FIniFileNaam); // This is the call that hangs. The service is unresponsive now.
try
FLaunchThreadLijst.CommaText := lIniFile.ReadString(INISECTIE_SERVICETASKS,'RunIniFiles','');
FMaxTaskDuration := lIniFile.ReadInteger(INISECTIE_SERVICETASKS,'MaxTaskDuration',FMaxTaskDuration);
finally
FreeAndNil(lIniFile);
end;
end;
finally
if (FLaunchThreadLijst.Count = 0) and FileExists(FStartDir + FExeName) then
FLaunchThreadLijst.Add(SDEFAULTTHREADNAME);
LogMessage(Format('FLaunchThreadLijst.CommaText: %s (%d items)',[FLaunchThreadLijst.CommaText,FLaunchThreadLijst.Count]), EVENTLOG_INFORMATION_TYPE, cCatInfo, cLaunchList);
end;
end;
FWIW, содержимое файла INI:
[TASKMANAGER]
RunIniFiles=TTTasks.ini
MaxTaskDuration=2
RestartIniFiles=
KillIniFiles=