Определение контейнера IE из элемента управления ActiveX - PullRequest
1 голос
/ 25 марта 2009

Что является хорошим способом для элемента управления ActiveX обнаружить, что его контейнер (или контейнер контейнера) является Internet Explorer?

В настоящее время я делаю это, вызывая метод IOleClientSite :: GetContainer элемента управления и проверяя, реализует ли контейнер интерфейс IHtmlDocument2, но теперь я хотел бы проверить всех предков элемента управления, чтобы увидеть, реализует ли какой-либо из них IHtmlDocument.

Проблема состоит в том, что элемент управления теперь содержится в CComCompositeControl и создается с использованием метода CreateActiveXControls (resourceID), который создает внутренний элемент управления как дочерний элемент экземпляра CAxHostWindow. В этом случае экземпляр CAxHostWindow сообщает о себе как о своем собственном контейнере, поэтому я не нашел способа пройтись по дереву (если в этой модели есть такое дерево).

Ответы [ 2 ]

1 голос
/ 31 марта 2009

Итак, я могу придумать два подхода. Можно было бы получить реализацию IServiceProvider вашего сайта и QueryService () для некоторого сервиса, который реализует только IE. Вы можете копаться в заголовочных файлах IE в поисках SID_S *, пока не найдете тот, который соответствует вашим потребностям.

Но лучший способ сделать это (действительно, способ, которым IE делает это внутренне в местах), это просто проверить имя процесса.

bool GetProcessName(LPWSTR pszProcessName, DWORD cchProcessName)
{
    bool success = false;
    // GetCurrentProcess() can't fail.
    DWORD cch = GetProcessImageFileName(GetCurrentProcess(), pszProcessName, cchProcessName);
    if (cch > 0)
    {
        LPWSTR pszFileName = PathFindFileName(pszProcessName);
        if (pszFileName)
        {
            wmemmove(pszProcessName, pszFileName, lstrlen(pszFileName) + 1);
        }
        success = true;
    }
    return success;    
}

И посмотрите, если имя процесса "iexplore.exe".

1 голос
/ 25 марта 2009

Вы можете получить некоторое представление с помощью следующих утверждений,

Элемент управления ActiveX обычно получает доступ к следующим окнам контейнера:

• Рамочное окно: самое внешнее окно контейнера, в котором находится главное меню контейнера. Элемент управления ActiveX извлекает этот дескриптор окна, вызывая либо IOleInPlaceFrame :: GetWindow, либо IOleInPlaceSite :: GetWindowContext.

• Окно сайта: окно контейнера, содержащее представление элемента управления ActiveX. Элемент управления ActiveX извлекает это окно контейнера, вызывая IOleInPlaceSite :: GetWindow.

После этого вы можете проверить родительское окно или то же окно, чтобы узнать его текст или другие свойства.

В некоторых сценариях, особенно из MFC, элемент управления ActiveX становится дочерним элементом окна отражателя, родительским элементом которого является окно, возвращаемое из IOleInPlaceSite :: GetWindow. В этом случае очень трудно получить родителя ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...