Проверить установлена ли программа
От: jekazz  
Дата: 15.09.08 18:53
Оценка:
Братья-программисты, помогите.
Есть программа, которая должна запускаться по клику специальную ссылку в браузере. Это я сделал.
Но есть условие — при клике на ссылку должна проводиться проверка — установлена ли программа на компьютере. Если не установлена — предложить скачать и установить.
Я не занимаюсь вебом, я делал саму программу. Но заказщик требует и скрипт проверки.
Пока все, что я придумал — проверять ключ реестра. Если его нет — программа не установлена. Инсталятор программы создает ключ.
Для проверки использую ActiveX("WScript.Shell"). Пока речь идет только о IE. Но в идеале желательно кроссбраузерность.
Но IE по умолчанию отключает ActiveX. А заказщику нужно, чтобы пользователь, совсем не соображающий в настройках безопасности браузера, смог зайти на сайт, и скрипт правильно отработал.
Подскажите как это сделать. Может есть другие способы, без ActiveX, проверить установлена ли программа? Может можно решить проблему заблокированных ActiveX через установку сертификата сайта? Заказщик готов оплатить сертификат.
Я не занимаюсь веб программированием, поэтому не знаю куда копать. Где-то в нете читал, что при подключении <OBJECT > если не найден установленный ActiveX компонент, он скачивается и устанавливается по указанной ссылке. Так может написать свой ActiveX компонент, который бы при отсутствии скачивался и устанавливался, а потом проверял бы наличие программы. И подписать его сертификатом — по умолчанию IE разрешает загрузку и запуск подписанных ActiveX.
Re: Проверить установлена ли программа
От: kam Россия  
Дата: 16.09.08 06:16
Оценка:
Здравствуйте, jekazz, Вы писали:

J>Подскажите как это сделать. Может есть другие способы, без ActiveX, проверить установлена ли программа? Может можно решить проблему заблокированных


Как вариант, при установке программы устанавливать BHO (Browser Helper Object) для IE или плагин к Mozilla и с ним уже пытаться взаимодействовать.
Но, по моему, если программа имеет осмысленный размер, забить и проверять в инсталляторе.
Или как в новом Chrom(e) у Гугла инсталлятор маленький и скачивается "мгновенно" а затем именно он и подгружает, если надо, отсутствующие компоненты.

--
kam
Re[2]: Проверить установлена ли программа
От: jekazz  
Дата: 16.09.08 09:19
Оценка:
Спасибо, за подсказку. Буду учить BHO.
Пришла идея — использовать cookies. Инсталятор прописывает переменную-флаг в cookies, а при клике на ссылку в браузере скрипт ищет ее в cookies. Если не находит — предлагает скачать и инсталировать, находит — просто открывает программу.
Как работатсь с cookies из JavaScript я уже нашел. Подскажите как управлять cookies IE через OLE.
И, вообще, как такой вариант?
Re[3]: Проверить установлена ли программа
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.09.08 10:50
Оценка: 2 (1)
Здравствуйте, jekazz, Вы писали:

J>Спасибо, за подсказку. Буду учить BHO.

J>Пришла идея — использовать cookies. Инсталятор прописывает переменную-флаг в cookies, а при клике на ссылку в браузере скрипт ищет ее в cookies. Если не находит — предлагает скачать и инсталировать, находит — просто открывает программу.
J>Как работатсь с cookies из JavaScript я уже нашел. Подскажите как управлять cookies IE через OLE.
А не надо управлят cookies через OLE. Просто в конце инсталлятора нужно запустить программку, которая через WinINET сходит на страничку http://myserver.com/mysoftware/v1.14/installSuccess.smth. А уже страничка поставит куки.
Или, еще проще, прямо открыть этот URL в дефолтном браузере. Это позволит
а) отделу маркетинга донести какие-то полезные мысли клиенту, который поставил программу, без переписывания кода программы
б) отделу сопровождения выложить на эту страничку ценные хотфиксы, которые вышли с момента публикации этой версии
в) гарантировать, что кука добавлена именно в тот браузер, которым пользователь потом пойдет на твой сайт
Единственное что — нужно подумать про unattended installation. Для него никаких запусков браузера, естественно, не получится — придется идти через WinInet.
J>И, вообще, как такой вариант?
Да в целом нормально.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Проверить установлена ли программа
От: Аноним  
Дата: 16.09.08 16:43
Оценка:
Спасибо за ценный совет
Re[4]: Проверить установлена ли программа
От: jekazz  
Дата: 16.09.08 16:45
Оценка:
Сори, это я анонимом отписался. Спасибо еще раз
Re[4]: Проверить установлена ли программа
От: jekazz  
Дата: 17.09.08 06:08
Оценка:
Еще момент. Прочитал вот что:

Клиент (браузер) имеет следующие ограничения для cookies:
— всего может храниться до 300 значений cookies
— каждый cookie не может превышать 4Кбайт
— с одного сервера или домена может храниться до 20 значений cookie

То есть получается ненадежный метод. В один прекрасный момент скрипт решит, что программа не установлена и снова предложит ее качать.
Может вернутся к первому варианту с ActiveX?
Re[5]: Проверить установлена ли программа
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.09.08 07:47
Оценка:
Здравствуйте, jekazz, Вы писали:

J>То есть получается ненадежный метод.

Надежных методов вообше нет.
J>В один прекрасный момент скрипт решит, что программа не установлена и снова предложит ее качать.
J>Может вернутся к первому варианту с ActiveX?
Я бы лучше посоветовал сделать на страничке, предлагающей скачать, кнопку "спасибо, у меня уже стоит", которая заново запишет куку.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Проверить установлена ли программа
От: jekazz  
Дата: 19.09.08 11:28
Оценка:
Сделал. Только вот прикол. FireFox коней мочит. Opera и IE правильно работают.

В начале страницы:
if (isset($_GET['MyProgramInstalled'])) {
setcookie('MyProgramInstalled', $_GET['MyProgramInstalled'], 0xFFFFFFFF, '/', 'myhost.com');
}

По-глубже в коде...

Проверка — установлена ли программа:
var MyProgramInstalled = getCookie('MyProgramInstalled');
if (MyProgramInstalled == null || MyProgramInstalled == 'false') {
showDownloadMessage(); // выводит предложение скачать программу

При выборе "У меня уже установлена эта программа" и нажатии ОК:
setCookie('MyProgramInstalled', 'true', '/', 'myhost.com');

Где getCookie, setCookie:
function getCookie(name)
{
var prefix = name + "="
var cookieStartIndex = document.cookie.indexOf(prefix)
if (cookieStartIndex == -1)
return null;

var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length)
if (cookieEndIndex == -1)
cookieEndIndex = document.cookie.length

return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex))
}

function setCookie(name, value, path, domain) {
var curCookie = name + '=' + escape(value) + '; expires=Fri, 18-Sep-2020 00:00:00 GMT';
document.cookie = curCookie;
}

Так вот FireFox не изменяет значение MyProgramInstalled с true на false и наоборот, а добавляет второе! То есть если в cookie было MyProgramInstalled=true а скрипту передается false ($_GET['MyProgramInstalled']==false), то FireFox добавляет новое значение, и в cookie становится: MyProgramInstalled=true; MyProgramInstalled=false;
Предварительное удаление MyProgramInstalled из cookie через присвоение пустого значения и времени expires=Thu, 01-Jan-1970 00:00:01 GMT ничего не дает.
Как это обойти?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.