快意人生
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是由某一库支持开发的(MFCATL或其他),假设他所支持库的主要由 Need1.dllNeed2.dllNeed3.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.DLLNeed3.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/SYSTEM3210 指定 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.DLLMFC42.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.  关于在创建INFDLL的版本,你可以鼠标右击点出他的属性对话框,在版本一栏就可以看到了,注意,填写时,版本号之间的“.”号变换为“,”。


--------------------------------------

如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。

创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。

在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。

下面是创建签署CAB文件的步骤 :

1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
2 创建 CAB 文件
3 签署您的文件
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。

有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate.

证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。

获得一个软件出版商证明书
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。

比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下:

C:\CAB&SIGN\MAKECERT
-u:  MyKey
-n: CN = MySoftwareCompany
-k: MYKEY.PVK CERT.CER

MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。

做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下:

C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。

创建一个 CAB文件
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。

创建一个 CAB文件:

创建一个INF文件。
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
C:\CAB&SIGN\CABARC -s 6144
n MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF

CABARC 创建了一个名为MYCTL.CAB的CAB文件。

您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。

-s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:

 C:\CAB&SIGN\CABARC
创建一个INF文件
INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。

作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。

; Sample INF file for POLYGON.DLL
[version]
; version signature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
polygon.dll=polygon.dll
atl.dll=atl.dll

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

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

该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:

file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL
关键字"file-win32-x86" 指定平台是 x86。

得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。

"DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。

"clsid" 指的是要安装控件的CLSID。

创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :

 C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。

有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。

签署一个CAB文件
使用Code Signing Wizard签署一个CAB文件:

1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
C:\CAB&SIGN\SIGNCODE
2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。
4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。
5. 点击Next,前进到下一页。
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。
8. 连续两次点击 Next前进到最后一页。
9.点击Sign,签署CAB 文件。您的文件将被数字化签署。
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。

将签署过的 CAB文件嵌入一个Web页
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 :
ID - 控件名称
CLASSID - 控件的CLSID
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
CODEBASE可以直接指向一个OCX 文件或者DLL文件:

CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。

如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:

CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。

posted on 2006-08-03 18:46  快意人生  阅读(2243)  评论(0)    收藏  举报