powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с общим пониманием архитектуры программы, многопользовательская среда.
5 сообщений из 5, страница 1 из 1
Помогите с общим пониманием архитектуры программы, многопользовательская среда.
    #37990618
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто не хочу потом иметь кучу вопросов, и объяснять каждому у кого что-то не так кривые затычные методы и затыкать дыры администратором, тайными установками разрешений для папок, обходами UAC через планировщики задач и т.п.
(это по опыту уже существующего приложения)

Хочу сразу сделать "нормально".

Приложение по своей сути не требует администратора.
Приложение вроде как не хочу делать сервисом (взаимодействие с пользователем).
Приложение должно быть совместимо с Vista/Win7 и т.п.

Потенциально скользкие вопросы следующие:
1. Приложение сохраняет НАСТРОЙКИ в реестре .
Обычно использую:
HKEY_CURRENT_USER\Software\Proga
Но: насройки сохраненные под Current User разные для разных юзеров.
Насколько я вижу, приложения обычно сораняют их в
HKEY_LOCAL_MACHINE\SOFTWARE\Proga
Но: как эти настройки тогда менять, если Current User не есть Admin?
Как правильно делать?

2. Приложение работает с ДАННЫМИ : база данных, временные текстовухи, логи, картинки, дополнительные настройки, кот. по каким-то причинам не хочу хранить в реестре и т.п.
Прога по умолчанию устанавливается в
C:\Program Files\Proga
По опыту предыдущей проги, все это хозяйство копошится в папках вида
C:\Program Files\Proga C:\Program Files\Proga\SubFolders
Но (что касается Vista/Win7 и им подобных): если не хитрить с правами на папки \Proga \Proga\SubFolders, возникают проблемы с записью файлов,
а если прога пытается прочитать данные, то она их в упор может не видеть (краем глаза читал про виртуализацию папок типа Program Files и т.п.), на существующей проге прописывал требование "Admin" и абсолютные права на эти папки.
Но это думаю не правильно.
Есть предположение, что на "Вистах" надо хранить данные в
C:\ProgramData\Proga C:\ProgramData\Proga\SubFolders
Или?
C:\Users\USER\AppData\Local\Proga ???
Или еще где?
Короче не понимаю.
Как бы внести ясность?

3. Приложение создает программную группу в меню, ярлык на Рабочий стол и т.п. :
Я использую Smart Install Maker в качестве инсталлятора.
Он при установке норовит запуститься от админа (думаю так) и лепит все эти ярлыки только для Current User, а если потом перегрузиться в другую учетку, то там пусто.
Как решать?

Еще на Вистах много говорится про всякие Invoker, манифесты и т.п.
Короче поделитесь опытом, как правильно сделать структуру/реализацию XP/Vista/Win7 совместимой проги? А то все это вызывает нестабильное состояние и начинаю просто беситься. А начну счас ляпать "как умею" пусть даже с хитростями, будет такой же бардак как и был.
...
Рейтинг: 0 / 0
Помогите с общим пониманием архитектуры программы, многопользовательская среда.
    #37991018
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, пока допер до следующего:
1.
Дмитрий77Но (что касается Vista/Win7 и им подобных): если не хитрить с правами на папки \Proga \Proga\SubFolders, возникают проблемы с записью файлов,
а если прога пытается прочитать данные, то она их в упор может не видеть (краем глаза читал про виртуализацию папок типа Program Files и т.п.),
...
Еще на Вистах много говорится про всякие Invoker, манифесты и т.п.
Надо снабдить exe-шник таким манифестом, чтоб
1) поддерживал стили (что обычно и так делал)
2) сообщал вистам что он Invoker, это оставляет тек. права, но при этом запрещает вистам наеб... заниматься виртуализацией папок типа Program Files к кот. смертному юзеру путь закрыт; пусть лучше сразу ругается а не задуривает
3) не мешал запускаться на XP asm.v2 (а не v.3)
Вроде такой вариант рабочий:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity 
        version="1.0.0.0" 
        processorArchitecture="X86" 
        name="Company.Name" 
        type="win32" />
    <description>App description</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity 
                type="win32" 
                name="Microsoft.Windows.Common-Controls" 
                version="6.0.0.0" 
                processorArchitecture="X86" 
                publicKeyToken="6595b64144ccf1df" 
                language="*" />
        </dependentAssembly>
    </dependency>
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
       <security>
          <requestedPrivileges>
             <requestedExecutionLevel
                level="asInvoker"
                uiAccess="false"/>
          </requestedPrivileges>
       </security>
    </trustInfo>
</assembly>



2.Дмитрий77 Приложение работает с ДАННЫМИ : база данных, временные текстовухи, логи, картинки, дополнительные настройки, кот. по каким-то причинам не хочу хранить в реестре и т.п.
Прога по умолчанию устанавливается в
C:\Program Files\Proga
По опыту предыдущей проги, все это хозяйство копошится в папках вида
C:\Program Files\Proga C:\Program Files\Proga\SubFolders.
Думаю, надо тупо при инсталляции (Администратором) создавать папку:
%CommonAppData%\Proga
и все "хозяйство" кидать в нее и в
%CommonAppData%\Proga\SubFolders
и туда же лазить в процессе работы.
%CommonAppData% легко вычисляется через API

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Declare Function SHGetFolderPath Lib "shfolder.dll" Alias "SHGetFolderPathA" _
(ByVal hWndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal lpszPath As String) As Long
...
Public Property Get Path(ByVal CSIDL As CSIDL_VALUES, Optional Default As Boolean = True, Optional ForceCreation As Boolean = False) As String
...
      nRtn = SHGetFolderPath(0&, CSIDL, 0&, Abs(Default), Buffer)
...
  GetCommonAppDataPath = sf.Path(CSIDL_COMMON_APPDATA)


и дает
C:\Documents and Settings\All Users\Application Data 'XP
C:\ProgramData 'Vista/Win7

На папку с данными %CommonAppData%\Proga\ надо установить полный доступ всем кому попало на все действия.
Можно сделать Администратором при установке приложения:
Код: vbnet
1.
2.
3.
4.
5.
           UsersGroupName = ConstructUniversalAndNTWellKnownSids("Users") 'вычисляет имя группы "Users"
            '  Running: D:\Users\Dima>icacls "d:\test" /grant Пользователи:(OI)(CI)F /T
                ShellAndContinue "icacls.exe " & Chr(34) & <%CommonAppData%\Proga\> & Chr(34) & _
                    " /grant " & UsersGroupName & ":(OI)(CI)F /T", vbHide 'полный доступ включая подпапки и файлы
                AddLog "Folder permissions definition completed."



3.Дмитрий77[HKEY_CURRENT_USER\Software\Proga
Но: насройки сохраненные под Current User разные для разных юзеров.
Насколько я вижу, приложения обычно сораняют их в
HKEY_LOCAL_MACHINE\SOFTWARE\Proga
Но: как эти настройки тогда менять, если Current User не есть Admin?
Как правильно делать?.
Ну, в HKEY_LOCAL_MACHINE смертного юзера не пустят.
Самое простое что приходит в голову (если хочу чтоб были одинаковые настройки и всякий юзер мог их менять),
это вообще отказаться от реестра и хранить настройки в
%CommonAppData%\Proga (с установленным полным доступом для "Users")
в текстовухе settings.ini
(какие-то непринципиальные настройки не влияющие на работу приложения типа размер формы/ширина столбцов можно думаю и в HKEY_CURRENT_USER)


Как то так.
Поправьте если что не так сказал.
=====
Как создавать ярлыки "для всех пользователей" пока не понял.
...
Рейтинг: 0 / 0
Помогите с общим пониманием архитектуры программы, многопользовательская среда.
    #38009137
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не все читал что ты написал.
Организацию сохранения настроек и чтения я делал своим таким самодельным методом, который теперь подключаю к любому проэкту

Например, есть форма. В ней куча всяких элементов. После нажатия на кнопку "Сохранить" вызываю
Код: vbnet
1.
 Call SaveInRegistrSelectedSettingForForm(FrmNstr04, "")



Модуль
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Public Function SaveInRegistrSelectedSettingForForm(Frm As Form, Rozdil As String)
  Dim Elem As Object
  Dim s As String
  Dim m As String
  Dim z As String
  For Each Elem In Frm.Controls
   If IsObject(Elem) = True Then
    s = TypeName(Elem)
    m = Elem.TAG
      If Left(m, 1) = "*" Then
        m = Mid(m, 2)
        If s = "TextBox" Or s = "ComboBox" Then
          z = Elem.text
            SaveSetting VB.App.Title, Frm.TAG & Rozdil, m, z
        ElseIf s = "CheckBox" Then
          z = IIf(Elem.value = 0, "Виключено", "Включено")
            SaveSetting VB.App.Title, Frm.TAG & Rozdil, m, z
        ElseIf s = "OptionButton" Then
          z = IIf(Elem.value = 0, "Не вибрано", "Вибрано")
            SaveSetting VB.App.Title, Frm.TAG & Rozdil, m, z
        End If
      End If
   End If
  Next
  z = GetSetting(VB.App.Title, Frm.TAG & Rozdil, "Запуск перший раз")
  If z = "" Then SaveSetting VB.App.Title, Frm.TAG & Rozdil, "Запуск перший раз", "Yes"
End Function

Public Function LoadInRegistrSelectedSettingForForm(Frm As Form, Rozdil As String) As Boolean
  Dim Elem As Object
  Dim s As String
  Dim m As String
  Dim z As String
  z = GetSetting(VB.App.Title, Frm.TAG & Rozdil, "Запуск перший раз")
  If z = "Yes" Then LoadInRegistrSelectedSettingForForm = True
  
  For Each Elem In Frm.Controls
  If IsObject(Elem) = True Then
   s = TypeName(Elem)
   m = Elem.TAG
    If Left(m, 1) = "*" Then                                            
      m = Mid(m, 2)
      'Debug.Print m & "     " & s
      z = GetSetting(VB.App.Title, Frm.TAG & Rozdil, m)
      If s = "TextBox" Or s = "ComboBox" Then
        Elem.text = z
      ElseIf s = "CheckBox" Then
         If z = "Включено" Or z = "Так" Then
           Elem.value = 1
         Else
           Elem.value = 0
         End If
      ElseIf s = "OptionButton" Then
        If z = "Вибрано" Then Elem.value = 1
      End If
    End If
  End If
  Next
End Function



Потом что-то вроде как доделывал. Кажись это посвежей

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Public Function SaveInRegistrAllSetting(Frm As Form, NameGroup As String) ' якщо NameGroup не написано тоді береться назву вікна
If NameGroup = "" Then NameGroup = VB.App.Title
  Dim Elem As Object
  Dim s As String
  Dim m As String
  Dim z As String
  Dim i As Long
  Dim mx As Long
  Dim plmax As Long
  Dim ipl As Long
  For Each Elem In Frm.Controls
   If IsObject(Elem) = True Then
    s = TypeName(Elem)
    m = Elem.TAG
      If m <> "" Then
        If s = "TextBox" Or s = "ComboBox" Then
          z = Elem.text
            SaveSetting NameGroup, "Налаштування", m, z
        ElseIf s = "CheckBox" Then
          z = IIf(Elem.value = 0, "Виключено", "Включено")
            SaveSetting NameGroup, "Налаштування", m, z
        ElseIf s = "ListView" Then
         z = CStr(Elem.ListItems.Count)
         SaveSetting NameGroup, "Налаштування", m & ":max", z
         For i = 1 To Elem.ListItems.Count
          z = Elem.ListItems.Item(i).text
          SaveSetting NameGroup, "Налаштування", m & ":p=" & Right("000" & CStr(i), 4), z
          
          z = CStr(Elem.ListItems.Item(i).ListSubItems.Count)
          SaveSetting NameGroup, "Налаштування", m & ":pmax=" & Right("000" & CStr(i), 4), z
          'Elem.ListItems.Item(i).ListSubItems.Count
           For ipl = 1 To Elem.ListItems.Item(i).ListSubItems.Count
             z = Elem.ListItems.Item(i).ListSubItems(ipl).text
             SaveSetting NameGroup, "Налаштування", m & ":r=" & CStr(ipl) & ":p=" & Right("000" & CStr(i), 4), z
           Next
          If Elem.Checkboxes Then
            z = IIf(Elem.ListItems.Item(i).Checked, "Включено", "Виключено")
            SaveSetting NameGroup, "Налаштування", m & ":ch=" & Right("000" & CStr(i), 4), z
          End If
         Next
        End If
      End If
   End If
  Next
  SaveSetting "Запуск", "Налаштування", "Запущено не перший раз", "Так"
  Pbl_Progr_zapushenaDrugiyRaz = True
End Function



Где-то должно быть тоже самое но все настройки сохраняет в базу даных Access, тоже для нескольких пользователей расчитывал
Не лучший сорт, но лучше чем читать из файла open for ...
...
Рейтинг: 0 / 0
Помогите с общим пониманием архитектуры программы, многопользовательская среда.
    #38009139
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова я поспешил, не то ответил(
...
Рейтинг: 0 / 0
Помогите с общим пониманием архитектуры программы, многопользовательская среда.
    #38009880
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159,

Конечно не то. Вопрос был по общим принципам а не по тому где сохранять - в реестре или текстовухе.
Или думаете я в ( ТОКО вот чего лучше использовать???Local/current) \Software\Proga не умею сохранять?
Для новой проги я решил использовать ini-файл через стандартные API по работе с ним
Работа с ini-файлами. GetPrivateProfileString. WritePrivateProfileString. Хорош ли подход?
Да плевать что технология "устаревшая", гораздо удобнее. Бояться что эти API отменят? Не отменят. Уже сделал большой кусок и мне понравилось.
А ini файл класть в %CommonAppData%\Proga c установкой безлимитных прав доступа на эту папку при инсталляции.

По хорошему надо бы при установке сделать 2 варианта
1) %CommonAppData%\Proga -для всех пользователей
2) %<user>AppData%\Proga -для каждого юзера свои

Возникла еще мысль что на отдельную ветку HKEY_LOCAL_MACHINE\SOFTWARE\Proga
тоже ведь можно назначить "безлимитный доступ" (по крайней мере ручками это делается).
Но чего-то поздно возникла, нормальная работа с ini через API уже полюбилась.

Т.е. хочу сказать, что сохранять в реестре, ini или просто текстовухе это дело 10-е, вопрос "куда ложить".
У меня из-за отсутствия понимания этого в предыдущей проге бардак и злоупотребление администратором (хотя и сходит с рук в большинстве случаев). Но просто никогда не знаешь скольких клиентов потерял из-за ляпов такого рода. Полагаю все же, что не все в реальном мире администраторы как я на своих 3-х компах.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите с общим пониманием архитектуры программы, многопользовательская среда.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]