织梦CMS - 轻松建站从此开始!

罗索

当前位置: 主页>杂项技术>PC常识>

Browser Helper Objects

罗索客 发布于 2007-03-08 17:29 点击:次 
1.使用ShowBrowserBar显示IE浏览器栏 VARIANT vtBandGUID, vtShow; vtBandGUID.vt = VT_BSTR; //把这里的CLSID换成工具条CLSID vtBandGUID.bstrVal = SysAllocString(OLESTR(\"{E0E899AB-F487-11D5-8D29-0050BA6940E3}\")); vtShow.vt = VT_BOOL; vtShow.boolVal = tru
TAG:

1.使用ShowBrowserBar显示IE浏览器栏

VARIANT vtBandGUID, vtShow;
vtBandGUID.vt = VT_BSTR;
//把这里的CLSID换成工具条CLSID

vtBandGUID.bstrVal = SysAllocString(OLESTR("{E0E899AB-F487-11D5-8D29-0050BA6940E3}"));
vtShow.vt = VT_BOOL;
vtShow.boolVal = true;
m_spWebBrowser2->ShowBrowserBar(&vtBandGUID, &vtShow, 0);
SysFreeString(vtBandGUID.bstrVal);
"{30D02401-6A81-11D0-8274-00C04FD5AE38}">Search
"{EFA24E61-B078-11D0-89E4-00C04FC9E26E}">Favorites
"{EFA24E62-B078-11D0-89E4-00C04FC9E26E}")>History
"{EFA24E63-B078-11D0-89E4-00C04FC9E26E}")>ChannelsX
"{EFA24E64-B078-11D0-89E4-00C04FC9E26E}")>Folders
"{4D5C8C25-D075-11d0-B416-00C04FB90376}")>TipOfTheDay

2.写文件
fstream filein;//创建一个文件用于保存
filein.open("data.txt",ios::out);
filein<<"Hello World!"<<endl;
filein.close();//关闭文件
3.枚举IE并修改地址栏
HWND hIE=::FindWindow(L"IEFRAME",0); //获得第一个IE窗口
HWND hbegin=hIE; //记录下来
bool bnext=false;
while(hIE)
{
TCHAR bb[200];
//获取标题
::SendMessage(hIE,WM_GETTEXT,200,(LPARAM)bb);

LPOLESTR ss(bb);
//注意:explorer也是使用的IE窗口,也含有地址栏,判断是不是正在浏览网页的真正IE窗口
if(true)
//if(ss.Find("Microsoft Internet Explorer")>0)
//一般情况下这样判断是可以的,除非你的IE被别人恶意修改了,呵呵
{
bool bfind=false;

HWND hSub=::FindWindowEx(hIE,0,_T("WorkerW"),0);//查找子窗口
while(hSub && !bfind)
{
HWND hss=::FindWindowEx(hSub,0,_T("ReBarWindow32"),0);
while(hss && !bfind)
{
//找到包含地址栏的窗口,取地址
HWND hs3=::FindWindowEx(hss,0,L"ComboBoxEx32",0);

if(hs3)
{
bfind=true;
::SendMessage(hs3,WM_GETTEXT,200,(LPARAM)bb);
//::GetWindowText(hs3,bb,200);
//AfxMessageBox(bb);
::SendMessage(hs3, WM_SETTEXT,200,0);
//::MessageBox(NULL, bb,_T("Warning"),MB_ICONSTOP);
break;
}
}
hSub=::FindWindowEx(hIE,hSub,_T("RebarWindow32"),0);
}
}
hIE=::GetNextWindow(hIE,GW_HWNDNEXT);//按照z-序向下找
//如果已经到最下边了,从hbegin开始向上找
if(!hIE && !bnext)
{
bnext=true;
hIE=::GetNextWindow(hbegin,GW_HWNDPREV);
}
}
4.获取IE地址栏
LPOLESTR lpURL = NULL;
//HRESULT hr = m_spWebBrowser2->get_LocationURL(&lpURL);
m_spWebBrowser2->get_LocationURL(&lpURL);

char * strurl;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);

varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
}
if(strstr(strurl, "192.168.0.222"))
{

}
else
if (strstr(strurl, "baidu.com"))
{
*pDispParams->rgvarg[0].pboolVal = TRUE;


VARIANT vFlags = {0},vTargetFrameName = {0};
m_spWebBrowser2->Navigate(SysAllocString(L"http://192.168.0.222/HYWEB/Index.aspx?rawurl=www.sohu.com") ,&vFlags,NULL,NULL,NULL);
//m_spWebBrowser2->Navigate(SysAllocString(L"http://www.hao123.com"),&vFlags,NULL,NULL,NULL);
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
//m_spWebBrowser2->put_AddressBar(VARIANT_FALSE);
CComVariant bvarURL(strurl);
//*pDispParams->rgvarg[0].pvarVal = bvarURL;
//*pDispParams->rgvarg[5].bVal = strurl;
//BSTR bstrUrlName;
//bstrUrlName=bvarURL;

//fstream filein;//创建一个文件用于保存
//filein.open("data.txt",ios::out);
//filein<<strurl<<endl;
//filein.close();//关闭文件

//m_spWebBrowser2->put_StatusBar(VARIANT_FALSE);
//m_spWebBrowser2->put_StatusText(lpURL);
//m_pWebBrowser2->PutProperty();

//m_spWebBrowser2->get_HWND((long *)&pHWND);
//::SendMessage(pHWND, WM_CLOSE,0,0);
//::SendMessage(pHWND, WM_SETTEXT,0, "[[[[[[WeMade!]]]]]]");
//LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
//lstrcpy(psz, OLE2T(bstrUrlName));
//::MessageBox(NULL, psz,_T("Warning"),MB_ICONSTOP);
//pDispParams->rgvarg[0].pvarVal=&bvarURL;

//::MessageBox(NULL, _T("该网页已被禁止!"),_T("Warning"),MB_ICONSTOP);
return S_OK;
}


break;
5.控件打包

目的:

1. 依赖MFC库或ATL库等开发的ActiveX控件要正常的运行必须依赖这些库。但是你不能保证你用户的机器上装有与你开发环境相同的库,所以,当你发行一个ActiveX控件,你必须要包证这些依赖库的存在。
2. 在网络上运行的ActiveX控件,必须要保证你发行的控件小的足以让用户忍受下载的时间,当然是越小越好。控件本身你会发现微不足道,但你不得不还要考虑到他支持库的空间,你会发现的加上它的支持库,你的控件会变的臃肿不堪,所以你必须要找到一种方法为你的控件减减肥。
3. 得到控件后,使用前当然还要给它注册,但是你别忘了,还有他那些个依赖库的注册工作等着你耐心的一个个的regsvr32掉。

哦,天哪,用户只是想随便的浏览一个网页而已却要他做这么麻烦的工作,谁愿意做,我们上帝们才不会关心你这些技术细节,他们希望在电脑前轻点下鼠标就一切正常,他们要的是自动化!而这一切,Cab能帮你完全解决。

原理:

通过高压缩技术(比ZIP压缩度还高3成)——打包成Cab压缩文件。当用户第一次浏览你控件所在的网页时,它会自动提示控件下载,下载后会根据cab文件中的*.inf文本文件的来寻找你电脑的上相应的DLL(控件依赖库及控件本身,ocx本就是一种特殊的DLL)是否注册过,如果没有,会自动帮你注册,然后控件既可以正常使用。

(注:关于cab压缩技术,请参考MSDN或是网上相关搜索)

创建cab文件:

1. 创建 INF 文件。

INF 文件是一个文本文件,用以指定为控件的运行而需要显示或下载的文件(如 DLL 文件或其他 OCX 文件)。INF 文件使您得以将所有所需的文件捆绑在一个压缩的 CAB 文件中。默认情况下,版本号同用户硬盘上的现有文件相同的文件不下载。有关 INF 文件及其选项的更多信息,包括如何创建与平台无关的 INF 文件,请参见 Platform SDK 文档中的关于 INF 文件和使用 INF 文件(在 MSDN Library/Setup 和 System Administration/Setup/Setup API/Overview/Setup Applications 目录下)。

举例来说,下面的 INF 文件用于为AxYourControl控件创建 CAB 文件。AxYourControl是由某一库支持开发的(MFC,ATL或其他),假设他所支持库的主要由 Need1.dll,Need2.dll,Need3.dll三个DLL库(具体有哪些库文件根据情况查阅MSDN相关内容)。

; Sample INF file for AxYourControl.OCX

[version]
signature="$CHINA$"
AdvancedINF=2.0

[Add.Code]
AxYourControl.ocx= AxYourControl.ocx
Need1.dll= Need1.dll
Need2.dll= Need2.dll
Need3.dll= Need3.dll

; needed DLL
[Need1.dll]
file-win32-x86=thiscab
FileVersion=2,00,0,7024
DestDir=11
RegisterServer=yes

; needed DLL
[Need2.dll]
file-win32-x86=thiscab
FileVersion=2,00,0,7024
DestDir=11
RegisterServer=yes

; needed DLL
[Need3.dll]
file-win32-x86=thiscab
FileVersion=2,00,0,7024
DestDir=11
RegisterServer=yes

[AxYourControl.ocx]
file-win32-x86=thiscab
clsid={4CBBC676-507F-11D0-B98B-000000000000}
FileVersion=1,0,0,1
RegisterServer=yes
; end of INF file

此 INF 文件指定需要在系统上安装给定版本的 Need1.DLL, Need2.DLL和Need3.DLL。如果这些DLL尚未存在于系统中,它将从用此 INF 创建的 CAB 文件中下载。“thiscab”是一个关键字,表示 CAB 包含此 INF。也可通过指定一条绝对或相对路径,从一个 HTTP 位置下载所需的 DLL,例如:

file-win32-x86=http://example.microsoft.com/mydir/NEEDED.DLL
关键字“file-win32-x86”将平台标识为 x86 特定的。

可通过在 Windows 资源管理器中的文件上单击鼠标右键来获取文件的版本号。从显示的列表中选择“属性”,然后在显示的对话框中选择“版本”选项卡。有时需要在文件版本中额外插入一个 0。例如,在对话框中 ATL.DLL 的版本号显示为 2.00.7024。而在 INF 文件中,这变为 2, 00, 0, 7024。

“DestDir”是将要加载文件的目录所在的位置:11 指定系统目录为 WINDOWS/SYSTEM 或 WINNT/SYSTEM32;10 指定 Windows 目录、WINDOWS 或 WINNT。如果未指定任何 DestDir(典型情况),则代码安装在固定的 OCCACHE 目录中。

“clsid”是将要安装的控件的 CLSID。

2. 运行 CABARC 实用工具。

Cabarc.exe 是微软的一个cab文件制作工具。你可以到微软的官方网站下载CABIN SDK 工具包。下载后解压安装,在其目录下有一个Bin目录下可以找到。

应在包含源文件的目录下运行 CABARC。在命令行上,按源文件出现在 INF 中的顺序排列它们,并将 INF 文件放在最后。例如,若要从上面的 INF 文件生成 AxYourControl控件的 CAB 文件,请使用下面的命令:

…\\BIN\\CABARC -s 6144 n AxYourControl.CAB Need1.DLL Need2.DLL Need3.DLL AxYourControl.OCX AxYourControl.INF

-s 选项在压缩文件中保留用于代码签名的空间。n 命令指定希望创建 CAB 文件。有关 CABARC 命令和选项的列表,请在命令行上仅键入 CABARC:

…\\BIN\\CABARC

其他的一些补充:

1. 需要MFC控件中包含的DLL文件有MSVCRT.DLL、MFC42.DLL 和OLEPRO32.DLL,其中MFC42.DLL视你开发环境的MFC版本所定,例如本人是在vc7环境下开发控件的,所以,应该为MFC71.DLL。
2. 为ActiveX空间创建cab文件还有一个重要的话题就是将其打包为签名压缩 (CAB) 文件。签名文件使用户可以放心地下载代码安全的控件。关于这个话题,需要申请发行证书,详细情况可参见MSDN:
ms-help://MS.MSDNQTR.2003FEB.2052/vccore/html/Creating_Signed_CAB_Files_for_MFC_and_ATL_Controls.htm
3. 关于在创建INF时DLL的版本,你可以鼠标右击点出他的属性对话框,在版本一栏就可以看到了,注意,填写时,版本号之间的“.”号变换为“,”。

(iwgh)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200703/6583.html]
本文出处: 作者:iwgh
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容