Благодарю сердечно, однако я плохо задал вопрос.
Все происходит в рамках локальной сети, IE используется просто как "тонкий"
клиент. По условиям задачи IE НЕ ДОЛЖЕН постоянно переспрашивать обновления.
Задумка состоит в том, что на SQL серванте при изменении таблицы
срабатывает триггер, запускающий некую прогу (типа DLL), которая и сообщает ПРИЛОЖЕНИЮ IE что надо сделать REFRESH. Как запустить енту прогу — понятно. А вот как она будет сообщать IE — НЕ ПОНЯТНО.
"Пусть бузумная идея, вы не решайте сгоряча ...."
В.Высоцкий
Здравствуйте, 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 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>1. Выйти за пределы протокола HTTP. Например, засадить мааахонькое приложение на комп, которое будет подписываться на соответствующие события на сервере, и отлавливать извещения. Затем оно может поискать инстанс експлорера, который отображает нужную страницу, и пинать ему reload. Недостаток — в необходимости устанавливать такой софт на каждую машину.
Чрезвычайно ценное замечание (поскольку попадает в общую канву проекта).
Но хотелось бы узнать подробности:
— как это "мааахонькое приложение" будет подписываться на события.
— как оно (приложение) будет искать инстанс експлорера (наиболее интересно).
— как оно (приложение) будет пинать ему (експлореру) reload.
Здравствуйте, GrTox, Вы писали:
GT>Здравствуйте, Sinclair, Вы писали:
S>>1. Выйти за пределы протокола HTTP. Например, засадить мааахонькое приложение на комп, которое будет подписываться на соответствующие события на сервере, и отлавливать извещения. Затем оно может поискать инстанс експлорера, который отображает нужную страницу, и пинать ему reload. Недостаток — в необходимости устанавливать такой софт на каждую машину.
GT>
GT>Чрезвычайно ценное замечание (поскольку попадает в общую канву проекта). GT>Но хотелось бы узнать подробности: GT> — как это "мааахонькое приложение" будет подписываться на события.
Как-то видел на мастерах, что Delirium предлагал DLL, которая из триггеров гонит
по TCP/IP, ... во Messager.zip — может быть Вам подойдет
GT> — как оно (приложение) будет искать инстанс експлорера (наиболее интересно).
здесь и здесь
в качестве примеров
GT> — как оно (приложение) будет пинать ему (експлореру) reload.
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 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.