Odczyt adresu url obiektów w IHTMLDocument2

0

Witam
Mówiąc krótko mam stronę z linkami w postaci:
a href='#' onclick ='open()'
Z tego powodu, aby odczytać adres muszę wywołać zdarzenie i uruchomić javascript:
(doc.links.item(0,0) as IHtmlElement).Click;

Problem w tym, że skrypt open() wykonuje kod "location.href = ...;" przez co otwiera się nowe okno Internet Explorera, ładujące kliknięty link.
Wiem, że używając TWebBrowsera można w zdarzeniu OnBeforeNavigate2 przechwycić to okno, odczytać url i zablokować otwarcie okna.
Tylko, że ja chcę odczytać ten adres w tle, bez użycia interfejsu IE, bez wyświetlania strony i bez zamulania programu. Dlatego użyłem IEParser z zestawu EmbeddedWB, i mam w nim dostęp tylko do IHTMLDocument2, IHTMLWindow2. Przeglądam kody źródłowe i google, ale nie ogarniam jak przechwycić zmianę location.href w dokumencie. Z drugiej strony próbowałem też edytować skrypt, zamieniając location.href na jakąś zmienną i ją potem odczytać. Ale kod znajduje się w zewnętrznych plikach .js i po załadowaniu chyba nie da się go edytować. Będę wdzięczny za pomoc.
http://msdn.microsoft.com/en-us/library/aa752596(v=vs.85).aspx

0

A nie można przeanalizować co tak naprawdę robi ta funkcja Open i na jej podstawie wydobyć adres?

0

Tak jak pisałem, funkcja znajduje się w zewnętrznym pliku .js i nie mam jak jej edytować. Problem w tym, że powinno to działać uniwersalnie a nie tylko dla określonego kodu javascript. W międzyczasie znalazłem obiecujący temat o wstrzykiwaniu kodu: http://stackoverflow.com/questions/77659/blocking-dialogs-in-net-webbrowser-control Mimo wszystko wolałbym to bardziej elegancko rozwiązać,

0

Udało mi się rozwiązać problem. Trzy dni już przy tym siedziałem, a oczywiście dopiero po napisaniu tematu się udało.
No cóż, jeżeli ktoś w przyszłości będzie szukał to należało:
Zaimplementować dwa interfejsy w komponencie: IServiceProvider, oraz INewWindowManager. Następnie funkcje tych interfejsów function EvaluateNewWindow stdcall; function QueryService stdcall;

function QueryService(const rsid, iid: TGUID; out Obj): HRESULT;
begin
  Pointer(Obj) := nil;
  if (IsEqualGuid(rsid, IID_INewWindowManager) and Assigned(FOnEvaluateNewWindow))
  then Result := QueryInterface(iid, Obj);

  if Pointer(Obj) <> nil then
    Result := S_OK
  else
    Result := E_NOINTERFACE;

function EvaluateNewWindow(pszUrl, pszName, pszUrlContext,
  pszFeatures: LPCWSTR; fReplace: BOOL; dwFlags,
  dwUserActionTime: DWORD): HRESULT;
begin
  Result := E_FAIL;
  if Assigned(FOnEvaluateNewWindow) then
    FOnEvaluateNewWindow(Self, pszUrl, pszName, pszUrlContext, pszFeatures,
      FReplace, dwFlags, dwUserActionTime, Result);
end;

I mamy przechwycone zdarzenie otwarcia nowego okna. A tutaj link pomocniczy: http://msdn.microsoft.com/en-us/library/aa770041(v=VS.85).aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1