Получение текущего URL-адреса Internet Explorer 8 программно

Я разрабатываю простую надстройку для Internet Explorer и пытаюсь получить текущий URL-адрес адресной строки IE 8, используя серию (пример) HWND handle = FindWindowEx(parent_handle,0,"AddressDisplay Control",NULL);

в следующем порядке:

1- IEFrame
2- WorkerW
3- ReBarWindow32
4- Address Band Root
5- Edit 
5- (alternatively) AddressDisplay Control

Я определил эту серию элементов управления с помощью winspy++ 1.6.

Код, который я пытаюсь получить текущий URL-адрес:

TCHAR currentURL[255];
::GetWindowText(handle_to_the_Edit_or_AddressDisplay_control, currentURL, 255);

Однако он ничего не устанавливает в массив currentURL.

Этот метод с немного измененными именами и последовательностями элементов управления работал в более ранних версиях IE, я мог легко получить текущий URL-адрес, но для IE 8 я не смог его получить.

Что я должен делать? Спасибо

Примечание. Я просмотрел много страниц и сообщений. Неудачно.

Я чувствую запах вредоносного ПО. Надеюсь, у вас установлено антивирусное решение во время разработки. :П

rAndom69 15.05.2019 18:50

Проблема не связана с какими-либо вопросами безопасности. Это просто упражнение по программированию.

Terry 15.05.2019 19:56

@ zett42 спасибо за предложение. Это правильный способ получить URL-адрес в IE, но он использует стек COM/ATL и поэтому не так практичен. Я пытался добавить функцию GetBrowserInfo в статью, но один из необходимых файлов заголовков atlalloc.h был недоступен в моей среде VC++ 6 и VC++2010 Express.

Terry 15.05.2019 21:22

Что за дополнение именно? Если это BHO (объект помощника браузера), то он имеет прямой доступ к интерфейсу браузера IWebBrowser2 и может просто запросить его текущий URL-адрес, не прибегая к вообще доступу к элементам управления пользовательского интерфейса.

Remy Lebeau 15.05.2019 21:55

@RemyLebeau Он извлекает текущий URL-адрес и манипулирует некоторой его частью для облегчения навигации; так это БХО. Я попробовал использовать свойство IWebBrowser2 (или метод?) get_LocationURL следующим образом: char strCurURL[255];HRESULT temp = m_pBrowser->get_LocationURL((BSTR*) strCurURL);::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)strCurURL); Но strCurURL отображается неправильно. Как это устроить? hMyEditControl — это обычный элемент управления Edit.

Terry 15.05.2019 23:11

@ Ромарио, ты не можешь преобразовать буфер TCHAR[] в такой BSTR*. get_LocationURL() выделяет и возвращает новый BSTR, вам нужно копировать/конвертировать эту строку в буфер по мере необходимости, а затем освободить BSTR, когда закончите. BSTR bstrURL; HRESULT temp = m_pBrowser->get_LocationURL(&bstrURL); /* use bstrURL as needed ... */ SysFreeString(bstrURL); Если ваш элемент управления Edit представляет собой окно Unicode, вам вообще не нужен буфер: BSTR bstrURL; HRESULT temp = m_pBrowser->get_LocationURL(&bstrURL); SendMessage(hMyEditControl, WM_SETTEXT, 0, (LPARAM)bstrURL); SysFreeString(bstrURL);

Remy Lebeau 15.05.2019 23:14

@RemyLebeau Такое преобразование: char *p = _com_util::ConvertBSTRToString(bstrURL); проблема решена ::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)p); теперь отображается правильно. Это также считается принятым ответом, так что спасибо, но не могли бы вы еще прокомментировать причины, по которым нельзя получить этот URL-адрес из элементов управления пользовательского интерфейса? Особенно когда это возможно сделать в IE 7?

Terry 15.05.2019 23:50

@Romario Потому что это неправильный способ сделать это даже в IE7. То, что это мог сделано таким образом, не означает, что это должен должно быть сделано таким образом. Существует причина, по которой BHO имеет прямой доступ к базовому объекту WebBrowser, BHO не должен полагаться на какое-либо конкретное представление пользовательского интерфейса объекта WebBrowser.

Remy Lebeau 15.05.2019 23:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После применения предложения @Remy Lebeau char *p = _com_util::ConvertBSTRToString(bstrURL);::SendMessage(hMyEditControl,WM_SETTEXT,0,(long)p); стало отображаться правильно.

И это объясняет, почему способ IE 7 для получения URL-адреса из элементов управления пользовательского интерфейса не работает в IE 8:

Because that is not the right way to do it, even in IE7. 
Just because it could be done that way does not mean it should be done that way.
There is a reason why a BHO has direct access to the underlying WebBrowser object,
the BHO should not rely on any particular UI representation of the WebBrowser object.

Так что это принятый ответ.

Другие вопросы по теме