TWebBrowser и URL
Я работаю над программным обеспечением, чтобы проверить проблему его переноса с D5 на XE5. В D5TWebBrowser.BeforeNavigate2
Был вызов каждый раз, когда пользователь нажимает кнопку отправки отображаемой формы. В XE5 это не так. Я понял, что это потому, что URL для отправки содержат http:/aDirectory/ExecToBeCall.exe
, Если я добавлю дополнительные / после: событие пожарное.
Под D5 URL изменяется для:
http ://localhost/aDirectory/ExecToBeCall.exe
(добавлено место для разрыва ссылки в сообщении)
Это поведение TWebBrowser
в D5 запуск в любом случае и изменение URL-адреса важны для программного обеспечения, и я не могу изменить HTML (около 2000 файлов), чтобы он содержал 2. Это позволило нам узнать, была ли отправка сделана внутри Delphi или из внешнего браузера. Я пробовал другие и более новые события TWebBrowser
и никто не огонь.
Как я могу получить информацию о проблемном URL, проверить его и изменить на локальный URL? Маленький и чистый метод будет предпочтительнее.
Спасибо за вашу помощь и предложения
2 ответа
TWebBrowser
это просто тонкая оболочка вокруг объекта ActiveX Internet Explorer, так что это сам IE, а не TWebBrowser
ведет себя по-другому.
http:/aDirectory/ExecToBeCall.exe
на самом деле действительный URL. Так как :
не сопровождается //
, в URL нет части полномочий, и, следовательно, нет явного имени хоста. localhost
используется как неявное имя хоста, а путь /aDirectory/ExecToBeCall.exe
, Это то, что URL изменяется в D5, что является правильным поведением. Изменение URL на http://aDirectory/ExecToBeCall.exe
неверно, так как это создает авторитетную часть URL-адреса и, следовательно, имя хоста явно установлено на aDirectory
и путь установлен в /ExecToBeCall.exe
что не то, что вы хотите.
Почему URL не меняется в XE5, я понятия не имею. Похоже, ошибка в любой версии IE используется в этой версии TWebBrowser
,
В любом случае, именно IE инициирует событие, поэтому, если он не инициирует URL-адрес, который ему не нравится, вы ничего не можете с этим поделать, кроме использования интерфейсов DOM браузера для обработки onsubmit
событие HTML веб-формы напрямую.
Если вы хотите перенаправить неожиданный URL-адрес, а не переходить к нему, вы можете начать с проекта TEmbeddedWB или сделать DIY, расширив TWebBrowser
класс с IDocHostUIHandler
, который имеет интересный метод TranslateURL
,
function TAdvWebBrowser.TranslateURL(const dwTranslate: DWORD; const pchURLIn: POLESTR; var ppchURLOut: POLESTR): HRESULT;
var
Url: string;
BufferSize: Integer;
begin
Url := PChar(pchURLIn);
if GetSafeUrlFor(Url) then
begin
ppchURLOut := CoTaskMemAlloc(BufferSize);
CopyMemory(ppchURLOut, PChar(Url), BufferSize);
// redirects to new location
Result := S_OK;
end
else
// no redirection
Result := S_FALSE;
end;
// You can change the function to add more complex redirection rules
function GetSafeUrlFor(var Url: string): Boolean;
begin
Result := Url.EndsWithText('.exe');
if Result then
Url := 'http://localhost/';
end;