Как послать Refresh в Internet Explorer
От: GrTox  
Дата: 05.01.03 12:56
Оценка:
Благодарю сердечно, однако я плохо задал вопрос.
Все происходит в рамках локальной сети, IE используется просто как "тонкий"
клиент. По условиям задачи IE НЕ ДОЛЖЕН постоянно переспрашивать обновления.
Задумка состоит в том, что на SQL серванте при изменении таблицы
срабатывает триггер, запускающий некую прогу (типа DLL), которая и сообщает ПРИЛОЖЕНИЮ IE что надо сделать REFRESH. Как запустить енту прогу — понятно. А вот как она будет сообщать IE — НЕ ПОНЯТНО.

"Пусть бузумная идея, вы не решайте сгоряча ...."
В.Высоцкий
Re: Как послать Refresh в Internet Explorer
От: Sinclair Россия https://github.com/evilguest/
Дата: 08.01.03 05:32
Оценка:
Здравствуйте, GrTox, Вы писали:

GT>Благодарю сердечно, однако я плохо задал вопрос.

GT>Все происходит в рамках локальной сети, IE используется просто как "тонкий"
GT>клиент. По условиям задачи IE НЕ ДОЛЖЕН постоянно переспрашивать обновления.
GT>Задумка состоит в том, что на SQL серванте при изменении таблицы
GT>срабатывает триггер, запускающий некую прогу (типа DLL), которая и сообщает ПРИЛОЖЕНИЮ IE что надо сделать REFRESH. Как запустить енту прогу — понятно. А вот как она будет сообщать IE — НЕ ПОНЯТНО.

GT>"Пусть бузумная идея, вы не решайте сгоряча ...."

GT>В.Высоцкий

Ну, вообще-то протокол HTTP пассивен по своей природе. Он не рассчитан на то, что сервер будет что-то куда-то сообщать по своей инициативе. Стало быть, есть три варианта решения задачи:
0. Делать частый рефреш. Обсуждали, проехали.
1. Выйти за пределы протокола HTTP. Например, засадить мааахонькое приложение на комп, которое будет подписываться на соответствующие события на сервере, и отлавливать извещения. Затем оно может поискать инстанс експлорера, который отображает нужную страницу, и пинать ему reload. Недостаток — в необходимости устанавливать такой софт на каждую машину.
2. Сделать неразрываемое соединение. Т.е в махоньком невидимом фрейме качается этакий специальный HTML, который генерится на том конце. А генерится он так: висим, ничего не посылаем, до тех пор, пока не произойдет желанное изменение. В этот момент отправляем, наконец, терпеливому IE <SCRIPT>А сделай-ка ты рефреш</SCRIPT> и flush-им поток. Ие перечитывает то, что должен перечитать, и снова открывает этот "канал ожидания". Теоретический недостаток в том, что IE рано или поздно может начать жаловаться на таймаут. Но мы как-то делали подобную вещь — он ОЧЕНЬ долго ждет. Чтобы избежать этого, можно ему периодически пробел отправлять.
Вот такие вот идеи.
З.Ы. Все же лучше предполагать при разработке логики возможность потери извещения. Мало ли что.
... << RSDN@Home 1.0 beta 3 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как послать Refresh в Internet Explorer
От: GrTox  
Дата: 08.01.03 15:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>1. Выйти за пределы протокола HTTP. Например, засадить мааахонькое приложение на комп, которое будет подписываться на соответствующие события на сервере, и отлавливать извещения. Затем оно может поискать инстанс експлорера, который отображает нужную страницу, и пинать ему reload. Недостаток — в необходимости устанавливать такой софт на каждую машину.




Чрезвычайно ценное замечание (поскольку попадает в общую канву проекта).
Но хотелось бы узнать подробности:
— как это "мааахонькое приложение" будет подписываться на события.
— как оно (приложение) будет искать инстанс експлорера (наиболее интересно).
— как оно (приложение) будет пинать ему (експлореру) reload.

Указанный недостаток не важен.

С чувством глубочайшей благодарности, GrTox.
Re[3]: Как послать Refresh в Internet Explorer
От: kig Россия  
Дата: 08.01.03 16:45
Оценка: 30 (1)
Здравствуйте, GrTox, Вы писали:

GT>Здравствуйте, Sinclair, Вы писали:


S>>1. Выйти за пределы протокола HTTP. Например, засадить мааахонькое приложение на комп, которое будет подписываться на соответствующие события на сервере, и отлавливать извещения. Затем оно может поискать инстанс експлорера, который отображает нужную страницу, и пинать ему reload. Недостаток — в необходимости устанавливать такой софт на каждую машину.


GT>


GT>Чрезвычайно ценное замечание (поскольку попадает в общую канву проекта).

GT>Но хотелось бы узнать подробности:
GT> — как это "мааахонькое приложение" будет подписываться на события.

Как-то видел на мастерах, что Delirium предлагал DLL, которая из триггеров гонит
по TCP/IP, ... во
Messager.zip &mdash; может быть Вам подойдет

GT> — как оно (приложение) будет искать инстанс експлорера (наиболее интересно).


здесь
и здесь
в качестве примеров

GT> — как оно (приложение) будет пинать ему (експлореру) reload.


InternetExplorer/IWebBrowser2::Refresh(2)
Re[4]: Как послать Refresh в Internet Explorer
От: GrTox  
Дата: 09.01.03 08:57
Оценка:
Здравствуйте, kig


Стыдно признаваться, но в указанных местах

kig>здесь

kig>и здесь
kig>в качестве примеров

я мало чего понял.

Насколько я понимаю поиск инстанс експлорера сводится к получение указателя
на уже запущенный COM объект (в смысле IE) ......

нельзя ли, пожалуйста, подробнее (для менее грамотных).



С уважением, GrTox.
Re[5]: Как послать Refresh в Internet Explorer
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.01.03 00:11
Оценка: 10 (1)
Здравствуйте, GrTox, Вы писали:


GT>Насколько я понимаю поиск инстанс експлорера сводится к получение указателя

GT>на уже запущенный COM объект (в смысле IE) ......

GT>нельзя ли, пожалуйста, подробнее (для менее грамотных).

Именно. Вот кусок кода который это делает. Взят по ссылке, указанной Kig:
procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
sw: IShellwindows;
begin
sw:= CoShellWindows.Create;
for i := 0 to SW.Count - 1 do
 Memo1.Lines.Add((Sw.Item(i) as IWebbrowser2).LocationURL)
end;

Это на Delphi. Рекомендую почитать MSDN на тему ShellWindows object. Вкратце, суть в том, что это коллекция всех окон интернет експлорера.
Нужный нам експлорер мы обнаруживаем по его LocationURL. Далее мы просто дернем его метод. На том же Дельфи поменяем процедуру так:
procedure ReloadTheUrl(URL: String);
var
  i: integer;
  sw: IShellWindows;
begin
  sw:= CoShellWindows.Create;
  for i:= 0 to sw.Count-1 do
    with sw.Item(i) as IWebBrowser2 do
      if LocationURL = URL 
      then begin
        Refresh;
        Exit;
      end;
   raise Exception.CreateFmt('Не удалось найти страницу с адресом "%s"', [URL]);
end;
... << RSDN@Home 1.0 beta 3 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.