再谈BCB中如何取得IE的多个运行实例? 点名-排名不分先后:帮主,项羽,火哥,虚竹,叶老大,RH,BCB,ALNG,songhtao,Raptor,millet,Hank,comanche......

烟波三千里人鬼五百年 2001-06-03 12:48:00
加精
关于多个IE的实例交互问题,这两天似乎挺多。
不外乎是取得多个IE的运行实例,
还可以再取得HTML页面文档。
接着为所欲为....
大家再BCB中的常常想到的第一个做法是FindWindow。
这个办法似乎不是唯一的,或者最好的。
在VC的源码中,我见过通常都是类似下面这么做的:

SHDocVw::IShellWindowsPtr m_spSHWinds;

m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));

if (m_spSHWinds == NULL)
{
AfxMessageBox("Can't get shellwindow instance!");
return FALSE;
}

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);
if (spBrowser != NULL)
{
MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
if (spDoc != NULL)
{
_bstr_t bstrUrl;
BSTR BSTRUrl;
LPSTR pszUrl;

spDoc->get_url(&BSTRUrl);

if(BSTRUrl)
{
bstrUrl = BSTRUrl;
SysFreeString(BSTRUrl);
}
AfxMessageBox((LPSTR)bstrUrl);
}
}
}


实际上,BCB已经提供对SHDocVw的封装,在有些列Server控件页上,
它们是TCppWebBrowser,TCppShellWindows,TCppHTMLDocument。
但很难找到相关的帮助。

BCB应该怎么做?各位大虾,为菜鸟们贡献一点爱心吧。。。



CKER双手合十,虔诚的祈祷.....
让CSDN所有的老大们都来看这个帖子,都来回这个帖子,
让这个帖子有一天可以放入精华区....


正在此时......

...全文
519 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
maquanjun 2001-09-23
  • 打赏
  • 举报
回复
gz
蚊子王 2001-09-23
  • 打赏
  • 举报
回复
gz
  • 打赏
  • 举报
回复
收官。
Wingsun 2001-06-05
  • 打赏
  • 举报
回复
对,应该上精华区。
「已注销」 2001-06-04
  • 打赏
  • 举报
回复
这个贴子应该上精华
  • 打赏
  • 举报
回复
嗯,谢谢wangxd(东东)。

这部分已掌握,不过好像没有判断是不是IE浏览啊?
应该是取得html页面的内容。
你看这样如何?

IHTMLElementPtr DocElement;
((IHTMLDocument3Ptr)ptrHTMLDoc)->get_documentElement(&DocElement)

luhongjun 2001-06-04
  • 打赏
  • 举报
回复
真好,这才是精华.
wangxd 2001-06-04
  • 打赏
  • 举报
回复
>>cker
真舍不得啊,在大富翁花了200分弄来的,不过本着互相提高的目的,还是写出来把
300分我都要,:)
在bcb中对IHTMLDocument2进行控制
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, TVariant *URL)
{
//为了保证同步,应该把获取Document内容的代码放到OnDocumentComplete事件
IHTMLDocument2 *document;
IHTMLElement *body;
BSTR title,source,content;
(void *)document=CppWebBrowser1->Document;
document->get_title(&title);
document->get_body(&body);
body->get_outerHTML(&source);
body->get_outerText(&content);
Edit1->Text=title;
Edit2->Text=*URL;
Memo1->Text=source;
Memo2->Text=content;
}
gull 2001-06-04
  • 打赏
  • 举报
回复
顺便问一句如何判断得到的接口是否为当前活动的窗口的接口呢?谢谢!
gqxs 2001-06-04
  • 打赏
  • 举报
回复
关注
Wingsun 2001-06-04
  • 打赏
  • 举报
回复
我觉得这个方法不好,昨天我也想到了用这样的类似方法来判断,可是总觉的会出问题。
我昨天本来想通过获取才程序是不是explorer.exe来判断的,就是它的fullname,后来仔细一想不行啊。因为explorer也可能用改浏览的。
chker:你给我的代码我看了,好像在BCB中不可以这么做。
leejd 2001-06-04
  • 打赏
  • 举报
回复
To cker(有空就玩票...甭活得忒累...):
谢谢您的openGL教程,因为您的指引,我才发现原来有33课,我已经看了大部分了。非常的感谢哦:)
leejd 2001-06-04
  • 打赏
  • 举报
回复
To wangxd(东东):
不要那么吝啬啊,贴出来啊,让我可以好好学习一把:)
  • 打赏
  • 举报
回复
响应斑竹们的号召,
不要闭门造车。
  • 打赏
  • 举报
回复
DyingBird(不死鸟)是个好兄弟啊!
继续继续。

本贴暂缓结贴.....
DyingBird 2001-06-04
  • 打赏
  • 举报
回复
以下是小弟写的获取IE页面上的超链接的完整源代码。
需要在窗体上放置一个TListBox1和TButton。
未加错误处理。

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "SHDocVw_OCX.h"
#include "mshtml.h"
typedef TComInterface<IHTMLDocument2, &IID_IHTMLDocument2> IHTMLDocument2Ptr;
typedef TComInterface<IHTMLElementCollection, &IID_IHTMLElementCollection> IHTMLElementCollectionPtr;
typedef TComInterface<IHTMLElement, &IID_IHTMLElement> IHTMLElementPtr;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Clear();
TCppShellWindows * ptrShellWin = new TCppShellWindows(this);
for(long i = 0; i < ptrShellWin->Count; i++)
{
TVariantInParam va(i);
IWebBrowser2Ptr ptrWebBrowser( (IDispatch *) ptrShellWin->Item(va));
BSTR BSTRType;
ptrWebBrowser->get_Type(&BSTRType);
//获取文档的类型,如果是IE窗口,则会返回"HTML 文档",否则BSTRType被设为NULL;
if(BSTRType)
{
SysFreeString(BSTRType);
IHTMLDocument2Ptr ptrHTMLDoc(ptrWebBrowser->get_Document());
if ((IHTMLDocument2 *)ptrHTMLDoc != NULL)
{
BSTR BSTRUrl;
ptrHTMLDoc->get_URL(&BSTRUrl);
if(BSTRUrl)
{
ListBox1->Items->Add(BSTRUrl);
SysFreeString(BSTRUrl);
ptrHTMLDoc->get_title(&BSTRUrl);
if(BSTRUrl)
{
ListBox1->Items->Add("该IE窗口的标题为:");
ListBox1->Items->Add(BSTRUrl);
SysFreeString(BSTRUrl);
}//end:if BSTRUrl
ListBox1->Items->Add("该IE窗口上有如下超链接:");
}//end:if BSTRUrl
IHTMLElementCollectionPtr ptrHTMLElementCol;
BSTR BSTRLink;
ptrHTMLDoc->get_links(&ptrHTMLElementCol);
long lCount=0;
ptrHTMLElementCol->get_length(&lCount);
for(int j=0;j<lCount;j++)
{
IDispatchPtr ptrDispatch;
ptrHTMLElementCol->item(TVariantInParam(j),TVariantInParam(0),&ptrDispatch);
IHTMLElementPtr ptrHTMLElement(ptrDispatch);
ptrHTMLElement->toString(&BSTRLink);
if(BSTRLink)
{
ListBox1->Items->Add(BSTRLink);
SysFreeString(BSTRLink);
}//end:if BSTRLink
}//end:for(int j=0;j<lCount;j++)
}//end:if ((IHTMLDocument2 *)ptrHTMLDoc != NULL)
}//end:if(BSTRType)
}//end:for(long i = 0; i < ptrShellWin->Count; i++)
delete ptrShellWin;
}
DyingBird 2001-06-04
  • 打赏
  • 举报
回复
根据以上的源代码改编的简化版的判断是否IE窗口的代码,利用Type来实现
typedef TComInterface<IHTMLDocument2, &IID_IHTMLDocument2> IHTMLDocument2Ptr;
TCppShellWindows * ptrShellWin = new TCppShellWindows(this);
for(long i = 0; i < ptrShellWin->Count; i++)
{
TVariantInParam va(i);
IWebBrowser2Ptr ptrWebBrowser( (IDispatch *) ptrShellWin->Item(va));
BSTR BSTRType;
ptrWebBrowser->get_Type(&BSTRType);
//获取文档的类型,如果是IE窗口,则会返回"HTML 文档",否则BSTRType被设为NULL
if(BSTRType)
{
SysFreeString(BSTRType);
IHTMLDocument2Ptr ptrHTMLDoc(ptrWebBrowser->get_Document());
if ((IHTMLDocument2 *)ptrHTMLDoc != NULL)
{
BSTR BSTRUrl;
ptrHTMLDoc->get_URL(&BSTRUrl);
ShowMessage(BSTRUrl);
if(BSTRUrl)SysFreeString(BSTRUrl);
}
}
}
delete ptrShellWin;
  • 打赏
  • 举报
回复
2 WingSun:不错,这个方法顶多也只能算是补丁级的,不够纯粹。
仍然思考中。。。。
希望有好办法的网友不吝指教。
  • 打赏
  • 举报
回复
?
  • 打赏
  • 举报
回复
CKER回了第一贴.
加载更多回复(37)

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧