IShellWindows*和SHDocVw::IShellWindowsPtr用过的朋友进

时间:2022-05-18 09:04:22
使用SHDocVw::IShellWindowsPtr::CreateInstance 没问题
使用 IShellWindows* m_spSHWinds;       
::CoCreateInstance 空值;
请问是什么原因

另外在  SHDocVw::IShellWindowsPtr::CreateInstance后 可以得到WIN7 X64的IE浏览器的doc 而 x32 IE浏览器得不到.

4 个解决方案

#1


::CoInitialize(NULL); 
IShellWindows* m_spSHWinds;       
::CoCreateInstance(CLSID_ShellWindows,NULL,CLSCTX_INPROC_SERVER,IID_IShellWindows,(LPVOID*)&m_spSHWinds);       
    long nCount;   
    CString   str; 
    m_spSHWinds-> get_Count(&nCount);       
    BSTR     Url     ;     
    for(long i = 0;i < nCount;i++)       
    {       
VARIANT va;       
va.vt = VT_I4;       
va.lVal = i;       
IDispatch* spDisp;       
m_spSHWinds-> Item(va,&spDisp);
IWebBrowser2* spBrowser;       
spDisp-> QueryInterface(IID_IWebBrowser2,(void**)&spBrowser);       
if(spBrowser != NULL)       
{       
IHTMLDocument2* spDoc;       
IDispatch* IDispDoc;       
spBrowser->get_Document(&IDispDoc);       
IDispDoc-> QueryInterface(IID_IHTMLDocument2,(void**)&spDoc);        
if(spDoc != NULL)       
{       
spDoc-> get_URL(&Url); 
str = Url; 
MessageBox(str);


    }
return;

#2


CoInitialize(NULL);
long nRelNum = 0;
SHDocVw::IShellWindowsPtr m_spSHWinds;
if (m_spSHWinds == NULL)
{
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
MessageBox(L"Failed");
CoUninitialize();
return ;//nRelNum;
}
}
long nCount = m_spSHWinds->GetCount();
IDispatchPtr spDisp;
for (long i = 0; i < nCount; i++)
{
_variant_t va(i, VT_I4);
spDisp = m_spSHWinds->Item(va);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
BSTR name = SysAllocString(L"");
spBrowser->get_FullName(&name);
if (spBrowser != NULL)
{
IDispatchPtr spDisp;   
if(spBrowser->get_Document(&spDisp) == S_OK && spDisp != 0 )  
{
CComQIPtr<IHTMLDocument2> pDoc;
CComQIPtr<IHTMLElementCollection> pElemAll;
spDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc==NULL)   
{
continue;
nRelNum++;
}
pDoc->get_all(&pElemAll);
long count = 0;
pElemAll->get_length(&count);
for(int j=0;j<count;j++)
{
IDispatchPtr pElemDis;
CComQIPtr<IHTMLElement> pElemItem;
pElemAll->item(CComVariant(j),CComVariant(),&pElemDis);
pElemDis->QueryInterface(IID_IHTMLElement,(void**)&pElemItem);
BSTR out = SysAllocString(L"");
pElemItem->get_innerText(&out);
ShowText(out,StateEditCtr);
SysFreeString(out);
}
}
}
}
CoUninitialize();
return;


这样是可行的,但是得不到x86  32位浏览器

#3


我是不是发错地方了? 或许有没有人告诉我应该发帖到哪里?

#4


你这个函数是用来获取网页上编辑框输入的内容吗

#1


::CoInitialize(NULL); 
IShellWindows* m_spSHWinds;       
::CoCreateInstance(CLSID_ShellWindows,NULL,CLSCTX_INPROC_SERVER,IID_IShellWindows,(LPVOID*)&m_spSHWinds);       
    long nCount;   
    CString   str; 
    m_spSHWinds-> get_Count(&nCount);       
    BSTR     Url     ;     
    for(long i = 0;i < nCount;i++)       
    {       
VARIANT va;       
va.vt = VT_I4;       
va.lVal = i;       
IDispatch* spDisp;       
m_spSHWinds-> Item(va,&spDisp);
IWebBrowser2* spBrowser;       
spDisp-> QueryInterface(IID_IWebBrowser2,(void**)&spBrowser);       
if(spBrowser != NULL)       
{       
IHTMLDocument2* spDoc;       
IDispatch* IDispDoc;       
spBrowser->get_Document(&IDispDoc);       
IDispDoc-> QueryInterface(IID_IHTMLDocument2,(void**)&spDoc);        
if(spDoc != NULL)       
{       
spDoc-> get_URL(&Url); 
str = Url; 
MessageBox(str);


    }
return;

#2


CoInitialize(NULL);
long nRelNum = 0;
SHDocVw::IShellWindowsPtr m_spSHWinds;
if (m_spSHWinds == NULL)
{
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
MessageBox(L"Failed");
CoUninitialize();
return ;//nRelNum;
}
}
long nCount = m_spSHWinds->GetCount();
IDispatchPtr spDisp;
for (long i = 0; i < nCount; i++)
{
_variant_t va(i, VT_I4);
spDisp = m_spSHWinds->Item(va);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
BSTR name = SysAllocString(L"");
spBrowser->get_FullName(&name);
if (spBrowser != NULL)
{
IDispatchPtr spDisp;   
if(spBrowser->get_Document(&spDisp) == S_OK && spDisp != 0 )  
{
CComQIPtr<IHTMLDocument2> pDoc;
CComQIPtr<IHTMLElementCollection> pElemAll;
spDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc==NULL)   
{
continue;
nRelNum++;
}
pDoc->get_all(&pElemAll);
long count = 0;
pElemAll->get_length(&count);
for(int j=0;j<count;j++)
{
IDispatchPtr pElemDis;
CComQIPtr<IHTMLElement> pElemItem;
pElemAll->item(CComVariant(j),CComVariant(),&pElemDis);
pElemDis->QueryInterface(IID_IHTMLElement,(void**)&pElemItem);
BSTR out = SysAllocString(L"");
pElemItem->get_innerText(&out);
ShowText(out,StateEditCtr);
SysFreeString(out);
}
}
}
}
CoUninitialize();
return;


这样是可行的,但是得不到x86  32位浏览器

#3


我是不是发错地方了? 或许有没有人告诉我应该发帖到哪里?

#4


你这个函数是用来获取网页上编辑框输入的内容吗