Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2019, 22:13   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос Получить путь к папке Roaming пользователя через TService

С помощью такой функции получаю путь к папке Roaming текущего пользователя
Код:
function GetRoamingPath: String;
var
  Buffer: Array[0..MAX_PATH] of Char;
begin
  if ShGetSpecialFolderPath(Application.Handle, Buffer, CSIDL_APPDATA, False) then Result := Buffer else Result := '';
end;
Первый вызов получает верный путь. sPath - это глобальная переменная на все модули сервиса
Код:
var
  sc: Tsc;
  sPath: String;

procedure Tsc.ServiceCreate(Sender: TObject);
begin
  sPath := GetRoamingPath;
  CreateServiceFolder(sPath); // Папка успевает создаться по нужному пути
  CreateBat(sPath); // Файл успевает создаться по нужному пути
  LogMessage('ServiceCreate: ' + sPath, EVENTLOG_INFORMATION_TYPE, 0, 1); // Сначала верно
end;
Последующие не верный
Код:
procedure Tsc.TimerWriteIniTimer(Sender: TObject);
begin
  WriteIniFile(sPath); // Путь C:\WINDOWS\system32\config\systemprofile\AppData\Roaming, но там ничего нет
  LogMessage('TimerWriteIniTimer: ' + sPath, EVENTLOG_INFORMATION_TYPE, 0, 1); // Далее не верно
end;
После установки и запуска сервиса первое определение пути происходит верно: C:\Users\User\AppData\Roaming
Далее в таймере путь определяется совершенно другой: C:\WINDOWS\system32\config\systempr ofile\AppData\Roaming

Из-за чего такое происходит и как с этим бороться?

Последний раз редактировалось Shouldercannon; 17.06.2019 в 16:36.
Shouldercannon вне форума Ответить с цитированием
Старый 17.06.2019, 23:30   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Из-за чего такое происходит и как с этим бороться?
Сервисы работают независимо от пользовательских сессий.
Запускайте службу от своего имени и будет счастье.
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2019, 16:43   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Код:
procedure Tsc.TimerWriteIniTimer(Sender: TObject);
begin
  LogMessage('TimerWriteIniTimer: ' + GetEnvironmentVariable('username'), EVENTLOG_INFORMATION_TYPE, 0, 1);
end;
Так имя ПК выводится.

Последний раз редактировалось Shouldercannon; 19.06.2019 в 19:47.
Shouldercannon вне форума Ответить с цитированием
Старый 02.07.2019, 23:48   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Так имя ПК выводится.
Имя ПК и имя пользователя - абсолютно разные вещи. Имя ПК не может совпадать с именем пользователя
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить путь к папке appdata из службы? kleric Общие вопросы Delphi 12 07.02.2018 20:28
Путь к папке Delphi 25041996l Общие вопросы Delphi 1 11.06.2016 04:27
Путь к папке в проекте Mr_skiner Общие вопросы Delphi 4 18.05.2011 00:02
Как программно получить путь до папки Application Data для пользователя LocalService? bzzz Win Api 3 23.09.2009 09:30
Функция CallWndProc. Получить путь к папке или файлу к которому преднозначено сообщение Irat Помощь студентам 1 16.02.2008 23:36