Я написал плагин Active X для IE7, который реализует IObjectWithSite помимо некоторых других необходимых интерфейсов (обратите внимание, нет IOleClient). Этот интерфейс запрашивается и вызывается IE7. Во время вызова SetSite () я получаю указатель на интерфейс сайта IE7, который я могу использовать для получения интерфейса IHTMLDocument2, используя следующий подход:
IUnknown *site = pUnkSite; /* retrieved from IE7 during SetSite() call */
IServiceProvider *sp = NULL;
IHTMLWindow2 *win = NULL;
IHTMLDocument2 *doc = NULL;
if(site) {
site->QueryInterface(IID_IServiceProvider, (void **)&sp);
if(sp) {
sp->QueryService(IID_IHTMLWindow2, IID_IHTMLWindow2, (void **)&win);
if(win) {
win->get_document(&doc);
}
}
}
if(doc) {
/* found */
}
Я попробовал подобный подход и к PIE, используя следующий код, однако даже интерфейс IPIEHTMLWindow2 получить невозможно, поэтому я застрял:
IUnknown *site = pUnkSite; /* retrieved from PIE during SetSite() call */
IPIEHTMLWindow2 *win = NULL;
IPIEHTMLDocument1 *tmp = NULL;
IPIEHTMLDocument2 *doc = NULL;
if(site) {
site->QueryInterface(__uuidof(*win), (void **)&win);
if(win) { /* never the case */
win->get_document(&tmp);
if(tmp) {
tmp->QueryInterface(__uuidof(*doc), (void **)&doc);
}
}
}
if(doc) {
/* found */
}
Использование интерфейса IServiceProvider также не работает, поэтому я уже проверял это.
Есть идеи?