ShellExecute блокирует (никогда не возвращается), когда брандмауэр запрещает доступ в интернет - PullRequest
2 голосов
/ 02 мая 2011

Я использовал ShellExecute, чтобы открыть URL-адреса в браузере, вызванные из кода модальных окон, например:

procedure TfmAbout1.BtnHomePageClick(Sender: TObject);
begin
   inherited;
   if ConnectedToWeb then
    ShellExecute(Handle, 'open', URL_PRODUCT_HOMEPAGE, nil, nil, SW_SHOWNORMAL);
end;

Но на машинах с брандмауэром Zone Alarm пользователь может получить всплывающее окно, чтобы разрешить или запретить моему приложению доступ к Интернету. Когда пользователь нажимает «Запретить», ShellExecute никогда не возвращается ... мое приложение затем зависает, и процесс должен быть остановлен извне (т. Е. Из диспетчера задач).

Что я могу сделать, чтобы предвидеть или предотвратить это? Мне нужно что-то вроде ShellExecute, которое не блокирует в этой ситуации.

Буду признателен за любые идеи.

Ответы [ 2 ]

3 голосов
/ 02 мая 2011

То есть вы хотите обойти ошибку в Zone Alarm?

Я бы, наверное, проверил версию Zone Alarm и, в зависимости от этого, попросил бы небольшую программу начальной загрузки выполнить ShellExecute от моего имени.,Это приведет к зависанию только маленькой программы начальной загрузки.

Вы можете убить эту программу начальной загрузки (так как ваш родительский процесс является владельцем), если она не вернулась после истечения времени ожидания (15 или 30 секунд будет).

Вы даже можете предупредить пользователя, у которого есть ошибочная версия Zone Alarm:)

Редактировать: Примечание: я думаю, что убить процесс безопаснее, чем убить поток.

0 голосов
/ 02 мая 2011

Хорошо, запустите ShellExecute в потоке.Через некоторое время вы сможете увидеть, завершено ли это или нет.Если нет, вы можете просто прекратить его.

...