IObjectWithSite を実装する IE7 用の Active X プラグインを作成しましたが、その他の必要なインターフェイスもいくつかあります (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 インターフェイスを使用しても機能しないため、既にテスト済みです。
何か案は?