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;
Другие вопросы по тегам