Не совсем понимаю что вы называете "объект Inspector".
Если вам , судя по приведенному коду, нужно получить IHTMLDocument2 то это можно сделать и без MAPI, достаточно иметь хендл окна ActiveX-а (его СlassName - ""Internet Explorer_Server").
Код примерно такой :
Код:
BOOL CWebConnectivity::GetHTMLDocFromWnd(HWND hWnd, MSHTML::IHTMLDocument2Ptr& spOutDoc2) const
{
if(!hWnd)
return FALSE;
spOutDoc2=NULL;
static UINT MSG = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT"));
wstring ClassName("");
TCHAR buf[MAX_LEN];
::GetClassName(hWnd,buf,sizeof(buf)/sizeof(TCHAR)-2);
ClassName=buf;
if(ClassName != TEXT("Internet Explorer_Server"))
{
if (ClassName == TEXT("Internet Explorer_TridentCmboBx") ||
ClassName == TEXT("Internet Explorer_TridentLstBox"))
{
hWnd = ::GetParent(hWnd);
::GetClassName(hWnd,buf,sizeof(buf)-2);
ClassName=buf;
if(ClassName != TEXT("Internet Explorer_Server") )
return FALSE;
}
}
DWORD lRes = 0;
LRESULT res = ::SendMessageTimeout(hWnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes);
if (!res)
return FALSE;
if(::ObjectFromLresult(lRes,MSHTML::IID_IHTMLDocument2,0,(void**)&spOutDoc2) == S_OK)
{
return TRUE;
}
return FALSE;
}
Код С++, в шарп сами завернете при необходимости. Работает без проблем для "Internet Explorer_Server" -ов в любых аппликациях, в том числе и для Outlook .
Есть некоторые тонкости. Например IHTMLDocument-ы могут быть вложенными, придеться делать энумирацию доков чтоб-бы добраться до нужного, и т.д. Если будет интересно - спрашивайте.