Сервер терминал

Флейм. Только просьба - не материться! :)
Аватара пользователя
Admin
Администратор
Сообщения: 3340
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сервер терминал

Сообщение Admin » 19 Август 2016, 10:54

Код: Выделить всё

IF IsTermServer()
  ! load/save INI
ELSE  
  ! load/save INI
END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3340
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сервер терминал

Сообщение Admin » 19 Август 2016, 10:56

Хотя! Я за
перевести всех на хранение в личном каталоге
И можно в программе проверять, если еще нет INI в личном каталоге - скопировать общий INI в личную папку.
Через некоторое время когда все зайдут по разу в программу фичу с копированием выпилить из кода.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
finsoftrz
Ветеран
Сообщения: 966
Зарегистрирован: 06 Ноябрь 2014, 12:48

Сервер терминал

Сообщение finsoftrz » 19 Август 2016, 11:02

У меня можно штатно копировать ini от одного пользователя другому. Содержание может отличаться в зависимости от роли пользователя.
Рязань решает.

Аватара пользователя
finsoftrz
Ветеран
Сообщения: 966
Зарегистрирован: 06 Ноябрь 2014, 12:48

Сервер терминал

Сообщение finsoftrz » 19 Август 2016, 11:03

На мой взгляд, самое простое при работе с tps создавать для каждого пользователя свой домашний подкаталог в каталоге программы. Удобно переносить при потребности - все, что нужно для программы лежит в одном каталоге.
Рязань решает.

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 19 Август 2016, 13:34

Всем спасибо идея по ini файлам понятно, но есть вопросы :)
kreator писал(а):Универсально - перевести всех на хранение в личном каталоге. Что этому мешает?
а поподробнее, личный в виндовс, или мною созданный?
Admin писал(а):

Код: Выделить всё

IF IsTermServer() ! load/save INI ELSE ! load/save INI END
А это где хранить, в каком ini :)
finsoftrz писал(а):На мой взгляд, самое простое при работе с tps создавать для каждого пользователя свой домашний подкаталог в каталоге программы. Удобно переносить при потребности - все, что нужно для программы лежит в одном каталоге.
Если не трудно пару строк кода, как это должно быть.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 19 Август 2016, 13:46

Хочу добавить, программа написана на С10 ABC, multi DLL
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3048
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Сервер терминал

Сообщение kreator » 19 Август 2016, 14:21

gopstop2007 писал(а):Хочу добавить, программа написана на С10 ABC, multi DLL
Ну, если С10, то в нём в глобальных настройках App есть возможность организовать ini-файл в разных системных папках, в частности, в папке "Документы" (в виндоусовой нотации "CSIDL_Personal"). Тут же можно указать подкаталог для название разработчика и для названия программы, если надо (типа будет так "Документы\SoftVelocity\Clarion10.0"). Класс INI сам создаст все эти папки и файл. Название файла по exe-шнику, dll-ки пишут тоже туда (их настраивать вообще не надо).
finsoftrz писал(а):На мой взгляд, самое простое при работе с tps создавать для каждого пользователя свой домашний подкаталог в каталоге программы. Удобно переносить при потребности - все, что нужно для программы лежит в одном каталоге.
Если пользователь удалит exe-шник у себя на диска, ну и ладно, типа "сам дурак". А если на серваке? Есть политика безопасности, по ней из папки, где exe-шник, разрешён только запуск, никаких дописок, удалений и т.д. Мы делаем ярлык на рабочем столе пользователя, ярлык ссылается на exe-шник в папке на сервере. И не важно, терминалка или так. Пользователь при этом может даже и не догадываться на каком сервере запустился.
gopstop2007, если сделаешь ini-файл в личной папке пользователя, то ни о каком копировании речи не может идти.
We are hard at work… for you. :)

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 789
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

Сервер терминал

Сообщение RaFaeL » 19 Август 2016, 16:51

Код: Выделить всё

MODULE('Shell32.dll')

    SHGetSpecialFolderPath(UNSIGNED,*CSTRING,Ushort,byte),Long,PASCAL,RAW,NAME('SHGetSpecialFolderPathA')  

  END


SHGetSpecialFolderPath(0,Loc:IniPath,26,True)
P.S. В данном случае 26 это пользовательский %AppData% а если надо профиль то это 40 но лучше использовать именно этот каталог и можно там еще подкаталог создать чтоб совсем красиво было

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 20 Август 2016, 11:45

Создал глобальную SET:SaveIni, указал ее в App -> Global properties -> INI file options -> Other записал как !Set:SaveIni
В этом же App в Global Embeds -> Setup Program

Код: Выделить всё

IF Len(Set:SaveIni)=0 THEN Set:SaveIni = d:\MyApp\myapp.ini END

При входе программы с основного App считывается путь

Код: Выделить всё

d:\MyApp\myapp.ini
название ini файла для остальных app(dll) он аналогичен. Дальше, если в установках указано, что

Код: Выделить всё

IF IsTermServer()
  c:\User1\myapp.ini
ELSE  
  d:\MyApp\myapp.ini
END
Но как сам App +dll отреагируют на такие изменения в runtime, не будет в дальнейшем проблем с сохранением в ini?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3048
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Сервер терминал

Сообщение kreator » 20 Август 2016, 13:48

Должно быть нормально. Только что за "c:\User1\"?
We are hard at work… for you. :)

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 20 Август 2016, 21:40

kreator писал(а):Должно быть нормально. Только что за "c:\User1\"?
это урезанный вариант CSIDL_LOCAL_APPDATA по пользователю :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3048
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Сервер терминал

Сообщение kreator » 21 Август 2016, 16:25

gopstop2007 писал(а):это урезанный вариант CSIDL_LOCAL_APPDATA по пользователю
Хозяин-барин. Я бы не стал морочиться. Кларион нормально всё пишет в CSIDL_Personal. Фактически не нужно ни единой строчки писать для этого.
We are hard at work… for you. :)

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 31 Август 2016, 11:23

Появилось время и возвращаюсь к данному вопросу.
Как реализовать, чтобы до открытия программы, программа знала какой из

Код: Выделить всё

INIMgr.Init(svSpecialFolder.GetDir(SV:CSIDL_PERSONAL, '' & '\' & '\TestPersonal\') & '\' & 'Test.INI', NVD_INI)   
или

Код: Выделить всё

INIMgr.Init('.\Test.INI', NVD_INI) 
ini файл открывать?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

kreator
Ветеран
Сообщения: 3048
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Сервер терминал

Сообщение kreator » 31 Август 2016, 12:23

gopstop2007 писал(а):Появилось время и возвращаюсь к данному вопросу.
Как реализовать, чтобы до открытия программы, программа знала какой из

Код: Выделить всё
INIMgr.Init(svSpecialFolder.GetDir(SV:CSIDL_PERSONAL, '' & '\' & '\TestPersonal\') & '\' & 'Test.INI', NVD_INI)
или

Код: Выделить всё
INIMgr.Init('.\Test.INI', NVD_INI)
ini файл открывать?
Так вроде всё решили. IsTermServer() определяет тип. В INIMgr.Init файл ini изменяется. Или сразу есть свойство INI-класса - FileName.
We are hard at work… for you. :)

gopstop2007
Ветеран
Сообщения: 1173
Зарегистрирован: 25 Март 2009, 21:55

Сервер терминал

Сообщение gopstop2007 » 31 Август 2016, 13:30

kreator писал(а):Так вроде всё решили. IsTermServer() определяет тип. В INIMgr.Init файл ini изменяется. Или сразу есть свойство INI-класса - FileName.
Схематично да :) Где хранить само значение IsTermServer()? При входе программы каждый раз спрашивать терминальный режим или нет, не кошерно :). Значить надо где-то хранить данное значение. В реестре хранить на сервере (Server 2008 или Server 2012) вроде тоже проблемы, для терминального пользователя, если не прав - поправьте. Решил попробовать хранить значение в локальном ini ('.\TestPopUp.ini'), не знаю правильное ли решение...

Код: Выделить всё

[Preserved]
Terminal_Used=1
В Global Embed -> Program Setup

Код: Выделить всё

  INIMgr.Init('.\TestPopUp.INI', NVD_INI)                  
  Terminal_Used=INIMgr.TryFetch('Preserved','Terminal_Used')
  ! === проверяем терминальный режим или нет =================
  IF Terminal_Used = 1 ! terminal
    svSpecialFolder.CreateDirIn(SV:CSIDL_PERSONAL, '' & '\' & '\TestPopUpPersonal\' )	
    INIMgr.Init(svSpecialFolder.GetDir(SV:CSIDL_PERSONAL, '' & '\' & '\TestPopUpPersonal\') & '\' & 'TestPopUp.INI', NVD_INI)   
  ELSE
      INIMgr.Init('.\TestPopUp.INI', NVD_INI)                  ! Configure INIManager to use INI file
  END    
Вроде работает, если неправильно укажите на ошибки. Не сильно хочется экспериментировать на терминальном сервере :)
Теперь эту конструкцию бросать в Global Embed -> Program Setup каждой dll, а можно, чтобы это находилось в одном месте?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Ответить