Страница 2 из 6

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

Добавлено: 19 Август 2016, 10:54
Admin

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

IF IsTermServer()
  ! load/save INI
ELSE  
  ! load/save INI
END

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

Добавлено: 19 Август 2016, 10:56
Admin
Хотя! Я за
перевести всех на хранение в личном каталоге
И можно в программе проверять, если еще нет INI в личном каталоге - скопировать общий INI в личную папку.
Через некоторое время когда все зайдут по разу в программу фичу с копированием выпилить из кода.

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

Добавлено: 19 Август 2016, 11:02
finsoftrz
У меня можно штатно копировать ini от одного пользователя другому. Содержание может отличаться в зависимости от роли пользователя.

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

Добавлено: 19 Август 2016, 11:03
finsoftrz
На мой взгляд, самое простое при работе с tps создавать для каждого пользователя свой домашний подкаталог в каталоге программы. Удобно переносить при потребности - все, что нужно для программы лежит в одном каталоге.

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

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

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

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

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

Добавлено: 19 Август 2016, 13:46
gopstop2007
Хочу добавить, программа написана на С10 ABC, multi DLL

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

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

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

Добавлено: 19 Август 2016, 16:51
RaFaeL

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

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 но лучше использовать именно этот каталог и можно там еще подкаталог создать чтоб совсем красиво было

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

Добавлено: 20 Август 2016, 11:45
gopstop2007
Создал глобальную 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?

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

Добавлено: 20 Август 2016, 13:48
kreator
Должно быть нормально. Только что за "c:\User1\"?

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

Добавлено: 20 Август 2016, 21:40
gopstop2007
kreator писал(а):Должно быть нормально. Только что за "c:\User1\"?
это урезанный вариант CSIDL_LOCAL_APPDATA по пользователю :)

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

Добавлено: 21 Август 2016, 16:25
kreator
gopstop2007 писал(а):это урезанный вариант CSIDL_LOCAL_APPDATA по пользователю
Хозяин-барин. Я бы не стал морочиться. Кларион нормально всё пишет в CSIDL_Personal. Фактически не нужно ни единой строчки писать для этого.

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

Добавлено: 31 Август 2016, 11:23
gopstop2007
Появилось время и возвращаюсь к данному вопросу.
Как реализовать, чтобы до открытия программы, программа знала какой из

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

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

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

INIMgr.Init('.\Test.INI', NVD_INI) 
ini файл открывать?

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

Добавлено: 31 Август 2016, 12:23
kreator
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.

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

Добавлено: 31 Август 2016, 13:30
gopstop2007
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, а можно, чтобы это находилось в одном месте?