powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опять обновление программы
12 сообщений из 62, страница 3 из 3
Опять обновление программы
    #39797569
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpЕщё раз: если у пользователя нет прав администратора (вообще), то UAC ему придётся подтверждать с паролем администратора.

Не разу с таким не сталкивался. Но если главная программа запущена от администратора, то последующий запуск другой программы, уже будет без подтверждения UAC
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797571
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я обновляю всё репликацией. Уж правки и мелкие апдейты всегда. И не парюсь особо
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797917
MasterZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorА я обновляю всё репликацией. Уж правки и мелкие апдейты всегда. И не парюсь особо

Можно поподробнее, как это через репликации? Я тоже не хочу парится.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797918
MasterZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёСхема работы может быть, например, следующей.
При старте основного приложения проверять необходимость обновления (особых прав для этого не требуется, надо полагать). Если обновление требуется - запускать специальный "обновлятор" (приложение без привилегий), который в соответствии с требуемой логикой выполняет нужные операции, при необходимости (для выполнения привилегированных операций) обращаясь к сервису. По завершению работы "обновлятор" перезапускает исходное приложение.


Ну, вот более менее картина проясняется, спасибо. Будет три екзешника: собственно само приложение, апдейтер и сервис.
Теперь осталось выяснить, как лучше(проще) сделать общение апдейтера с сервисом.
Через TCP мне кажется очень сложно.
Через мютекс?
В идеале чтобы сервис не сканировал каждые 2 сек, а чтобы запускался только во время обновления.
Предложите.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797920
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZёёёёёСхема работы может быть, например, следующей.
При старте основного приложения проверять необходимость обновления (особых прав для этого не требуется, надо полагать). Если обновление требуется - запускать специальный "обновлятор" (приложение без привилегий), который в соответствии с требуемой логикой выполняет нужные операции, при необходимости (для выполнения привилегированных операций) обращаясь к сервису. По завершению работы "обновлятор" перезапускает исходное приложение.


Ну, вот более менее картина проясняется, спасибо. Будет три екзешника: собственно само приложение, апдейтер и сервис.
Теперь осталось выяснить, как лучше(проще) сделать общение апдейтера с сервисом.
Через TCP мне кажется очень сложно.
Через мютекс?
В идеале чтобы сервис не сканировал каждые 2 сек, а чтобы запускался только во время обновления.
Предложите.

Ну, например.
Сервис создает мэилслот и тупо ждет поступления команды.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 fMailslotHandle := CreateMailSlot("Мой мэилслот", 0, MAILSLOT_WAIT_FOREVER, nil);
 fEventHandle := CreateEvent(nil, False, False, "Мой эвент");

while (true) begin
  if WaitForSingleObject(fEventHandle, INFINITE) <> WAIT_OBJECT_0 then
    "все пропало!;

  // Оп-па, да это же нам что-то прислали! 
  Читаем команду из мэилслота, выполняем ее.
end;


Клиент сервиса подключается к мэилслоту и эвенту с такими же именами, отправляет команжду и пинает эвент:

Код: pascal
1.
2.
3.
4.
5.
6.
      fMailslotHandle := GetMailSlotClientHandle("Мой мэилслот");
      // Подключаемся к событию-сигнализации об отправке данных
      fEventHandle := OpenEvent(EVENT_MODIFY_STATE, False, "Мой эвент");

      SendToMailSlot(fMailslotHandle, команда);
      SetEvent(fEventHandle);


Всё... .

Ну, надо разобраться в методах работы с эвентами, мэилслотами, в правилах их наименования и еще в некоторых мелочах.

Может быть, мьютексы задействовать. Например, сервис, при выполнении команд, будет взводить флажок "я работаю". А клиент ждет, чтобы флажок не был взведен.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797922
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZ,
можно пайпы задействовать, вместо мэилслотов. Тоже несложно, и связь двусторонняя.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797981
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВозможно, твой сервер завалится через несколько сотен недель именно по этой причинене, моему нельзя никак
...
Рейтинг: 0 / 0
Опять обновление программы
    #39797986
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZ,

Ну как?
Пишешь изменения в базу, и она их распространяет.
Заодно с правами легче разобраться. Всё работает через роли и права MSSQL
...
Рейтинг: 0 / 0
Опять обновление программы
    #39798020
MasterZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GatorMasterZ,

Ну как?
Пишешь изменения в базу, и она их распространяет.
Заодно с правами легче разобраться. Всё работает через роли и права MSSQL

Ну, это уже высший пилотаж. У меня программка маленькая и использую sqlite3.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39798115
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZКак потом из сервиса запустить обновленную программу?
Это непростая задача. Можно запустить на текущем рабочем столе, но это мало поможет в случае RDP и/или нескольких рабочих столов.
Так что надо сообщать программам, которые обновляем, что им надо перезапуститься.

MasterZПодскажите как запустить сервис из программы?
OpenSCManager/OpenService/StartService (ControlService), и можно в цикле ждать необходимого состояния с помощью QueryServiceStatusEx.
...
Рейтинг: 0 / 0
Опять обновление программы
    #39799117
MasterZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZalekcvpпропущено...
И что, таким образом любой пользователь с ограниченными правами может запустить любое приложение с правами администратора?.. Не зная пароля от учётной записи администратора? Серьёзно?

пропущено...
Windows - многопользовательская система, кто-то мог работать с этой же программой и не выйти из учётки, после чего зашёл пользователь, который хочет "обновить" приложение. А может программа вообще работает на терминальном сервере, где её запускает куча разных пользователей одновременно.

Насчет этого я придумал как обойти. После того как пользователь нажмет "Обновить" прога посмотрит, есть ли другие пользователи подключенные в данный момент. Если есть, то обновление не выолняется или просит отключить пользователей. Но это потом буду разбираться.

программа при запуске будет создавать мьютекс с именем GetUserDir + 'МОЙ_МЬЮТЕКС'.
при обновлении прога проверит есть ли мьютексы с именами всех пользователей.
Как получить список пользователей?
...
Рейтинг: 0 / 0
Опять обновление программы
    #39799432
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZпрограмма при запуске будет создавать мьютекс с именем GetUserDir + 'МОЙ_МЬЮТЕКС'.
при обновлении прога проверит есть ли мьютексы с именами всех пользователей.
Как получить список пользователей?
Легче создавать (первый экземпляр) / открывать (все последующие) мьютекс/событие. Проверять инсталлятором через OpenEvent. При закрытии экземпляра ссылка на объект сама удалится, если ссылок нет - объект уничтожится
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опять обновление программы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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