VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

news/2024/5/10 11:59:44/文章来源:https://blog.csdn.net/lionzl/article/details/6901793

本文指出:如果调低安全级别,ActiveX控件仍然无法使用,则需要将网站加入到信任站点,方可使用。

VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件。(此文章也是总结了网上好多人写的文章,我只是汇总一下,加上部分自己的东西,在这里感谢所有在网上发表相关内容的朋友们。)

ActiveX控 件用于Web的过程是将控件嵌入主页中,用户通过浏览器访问该主页时,将主页中的控件下载,并在用户机器上注册,以后就可在用户的浏览器上运行。控件下载 一次后就驻留在用户本地机器上,下次再访问相同的主页时,可不再下载该控件,而是直接运行用户本地的控件。这里控件容器就是浏览器,用户不需要通过浏览器 调用控件的属性或方法。因此,开发面向Web的ActiveX控件比开发桌面的控件还要简单些,所复杂的是如何将该控件很好地嵌入主页,使用户能正常浏览。下面介绍这个问题。

一.        创建MFC ActiveX项目

1.       打开VS2005新建MFC项目。这里我们取名为“ActiveXDemo”。

 

2.       输入项目名称为“ActiveXDemo”和项目位置。点击“确定”按钮,打开向导对话框。

WoSign 免费提供的时间戳服务URL: http://timestamp.wosign.com/timestamp

     时间戳服务非常重要,添加时间戳后,即使您的代码签名证书已经过期,但由于您的代码是在证书有效期内签名的,则时间戳服务保证了此代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经过期,您也无需重签和重新发布已经签名的代码。

 

3.       选择“控件设置”选项卡,具体设置可参考上图。其它选项卡为默认设置。最后点击“完成”按钮保存设置。

 

二.        添加控件方法

VC2005会为我们自动创建好MFC ActiveX程序框架,我们只要给该ActiveX控件添加方法即可。现在我们给控件添加一个“AddFun”方法,这个方法是将两个数相加并返回结果。

1.       点击“视图”,打开“类视图”窗口。

2.       展开“ActiveXDemoLib”项,选中“_DActiveXDemo”项。点击鼠标右键,选择“添加”下的“添加方法”。

 

3.       打开添加方法向导窗口。因为我们是添加一个加法方法,所以我们设置的返回类型为LONG型,方法名设为AddFun,添加两个LONG类型参数Add1Add2

 

 

4.       其它为默认设置,点击“完成”按钮完成添加方法。接下来我们打开“解决方案资源管理器”打开“ActiveXDemoCtrl.cpp”文件。

5.       打开代码视图,我们会发现VC2005已经为我们添加了一个“AddFun”方法,我们在方法内添加“return Add1 + Add2;”语句。

 

 三、MFC Activex 安全问题:

1、在默认环境下,编译的MFC Activex控件,只能在本地代码中运行,即在http://localhost/xxx/xxx.htm中执行,而在http://127.0.0.1/xxx/xxx.htm中提示无相关属性,需要设置其初始化和脚本运行的安全性

ActiveX在远程IE页面上执行,需要实现安全接口。

在ATL写的ActiveX中,用IObjectSafety。

http://support.microsoft.com/kb/168371/en-us

在MFC写的ActiveX中,直接修改注册表。

http://support.microsoft.com/kb/161873/en-us

mfc实现的ocx,要在app实现文件中包括两个文件:

 在ActivexDemo.cpp 文件中实现以下方法

 

 代码
#include  " stdafx.h " 
#include 
 " ActivexDemo.h " 
#include 
 < comcat.h >     
#include 
 < objsafe.h > 
#ifdef _DEBUG
#define  new DEBUG_NEW 
#endif 


CActivexDemoApp theApp;

const  GUID CDECL BASED_CODE _tlid  = 
        { 
 0x344B8576  0xAB2C  0x4D38 , {  0xAE  0x7  0x73  0x74  0x22  0x89 0x72  0xEA  } };
const  WORD _wVerMajor  =   1 ;
const  WORD _wVerMinor  =   0 ;



//  CActivexDemoApp::InitInstance - DLL 初始化 

BOOL CActivexDemoApp::InitInstance()
{
    BOOL bInit 
 =  COleControlModule::InitInstance();

    
 if  (bInit)
    {
        
 //  TODO: 在此添加您自己的模块初始化代码。 
    }

    
 return  bInit;
}



//  CActivexDemoApp::ExitInstance - DLL 终止 

int  CActivexDemoApp::ExitInstance()
{
    
 //  TODO: 在此添加您自己的模块终止代码。 

    
 return  COleControlModule::ExitInstance();
}

//  创建组件种类     
HRESULT CreateComponentCategory(CATID catid, WCHAR *  catDescription) 
{    
    ICatRegister
 *  pcr  =  NULL ;    
    HRESULT hr 
 =  S_OK ;    
    hr 
 = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void ** ) & pcr);    
    
 if  (FAILED(hr))  return  hr;    
    
 //  Make sure the HKCR\Component Categories\{..catid...}    
    
 //  key is registered.     
    CATEGORYINFO catinfo;    
    catinfo.catid 
 =  catid;    
    catinfo.lcid 
 =   0x0409  ;  //  english    
    
 //  Make sure the provided description is not too long.    
    
 //  Only copy the first 127 characters if it is.     
     int  len  =  wcslen(catDescription);    
    
 if  (len > 127 ) len  =   127 ;    
    wcsncpy(catinfo.szDescription, catDescription, len);    
    
 //  Make sure the description is null terminated.     
    catinfo.szDescription[len]  =   ' \0 ' ;    
    hr 
 =  pcr -> RegisterCategories( 1  & catinfo);    
    pcr
 -> Release();    
    
 return  hr;    
}  

//  注册组件种类     
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
 {    
    
 //  Register your component categories information.     
    ICatRegister *  pcr  =  NULL ;    
    HRESULT hr 
 =  S_OK ;    
    hr 
 = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void ** ) & pcr);    
    
 if  (SUCCEEDED(hr)) {    
      
 //  Register this category as being "implemented" by the class.     
      CATID rgcatid[ 1 ];    
      rgcatid[
 0  =  catid;    
      hr 
 =  pcr -> RegisterClassImplCategories(clsid,  1 , rgcatid);    
    }    
    
 if  (pcr  !=  NULL) pcr -> Release();    
    
 return  hr;    
}    
//  卸载组件种类     
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
 {    
    ICatRegister
 *  pcr  =  NULL ;    
    HRESULT hr 
 =  S_OK ;    
    hr 
 =  CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
            NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (
 void ** ) & pcr);    
    
 if  (SUCCEEDED(hr)) {    
      
 //  Unregister this category as being "implemented" by the class.     
      CATID rgcatid[ 1 ] ;    
      rgcatid[
 0  =  catid;    
      hr 
 =  pcr -> UnRegisterClassImplCategories(clsid,  1 , rgcatid);    
    }    
    
 if  (pcr  !=  NULL) pcr -> Release();    
    
 return  hr;    
}    
STDAPI DllRegisterServer(
 void 
{    
    HRESULT hr;    
    AFX_MANAGE_STATE(_afxModuleAddrThis);    
    
 if  ( ! AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))    
        
 return  ResultFromScode(SELFREG_E_TYPELIB);    
    
 if  ( ! COleObjectFactoryEx::UpdateRegistryAll(TRUE))    
        
 return  ResultFromScode(SELFREG_E_CLASS);    
    
 //  标记控件初始化安全.    
    
 //  创建初始化安全组件种类     
    hr  =  CreateComponentCategory(CATID_SafeForInitializing, L "Controls safely initializable from persistent data! " );    
    
 if  (FAILED(hr))  return  hr;    
    
 //  注册初始化安全     
    hr  =  RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForInitializing);    
    
 if  (FAILED(hr))  return  hr;    
    
 //  标记控件脚本安全    
    
 //  创建脚本安全组件种类     
    hr  =  CreateComponentCategory(CATID_SafeForScripting, L " Controls safely scriptable! ");    
    
 if  (FAILED(hr))  return  hr;    
    
 //  注册脚本安全组件种类     
    hr  =  RegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
    
 if  (FAILED(hr))  return  hr;    
    
 return  NOERROR;    
}    
//  DllUnregisterServer - Removes entries from the system registry     
STDAPI DllUnregisterServer( void 
{    
    HRESULT hr;    
    AFX_MANAGE_STATE(_afxModuleAddrThis);    
    
 if  ( ! AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))    
        
 return  ResultFromScode(SELFREG_E_TYPELIB);    
    
 if  ( ! COleObjectFactoryEx::UpdateRegistryAll(FALSE))    
        
 return  ResultFromScode(SELFREG_E_CLASS);    
    
 //  删除控件初始化安全入口.     
    hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForInitializing);    
    
 if  (FAILED(hr))  return  hr;    
    
 //  删除控件脚本安全入口     
    hr = UnRegisterCLSIDInCategory(BASED_CODE _tlid , CATID_SafeForScripting);    
    
 if  (FAILED(hr))  return  hr;    
    
 return  NOERROR;    
}  

 

现在控件就可以在自注册时就注册为安全控件了。

2、设置项目属性 将配置类型设置成静态库(.lib)

 

3、       最后生成项目,ocx控件就产生了。 

 

 ActiveX打包与发布

在VS2005或VS2008安装后发现路径**VC7\Common7\Tools\Bin\下有许多小工具,我对带有Cert的文件比较感兴趣。经过研究,发现是有关证书和签名的,当然,该证书未被证书认证机构认可。下面列出这些工具和我的使用心得。
1。Makecert.exe ---证书创建工具
2。Cert2Spc.exe ---发行者证书测试工具
3。Signcode.exe ---文件签名工具(VS2008带的是signtool)


一、ActiveX发布步骤

在这里简单说明下,打包activeX需要制作证书,具体用到makecert 、cert2spc 、signtool 这三个VS提供的工具,工具在VS文件夹里面,以下制作过程需要在工具所在的文件夹下完成!
1、单击"开始"-->"运行(R)"-->输入"cmd"-->回车-->进入到操作的控件所在的目录(需要将上面所说的工具,和ocx控件放到一个文件夹下);
2、创建PVK文件(私人密匙文件),在命令行中输入"makecert -sk demo demo.pvk -n CN=XXXXXXX公司",然后回车;

sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置;

3、创建CER文件(公司证书),在命令行中输入"makecert -sk demo.pvk demo.cer",然后回车,如图8所示,若出现"Successed"提示,则会在E:\ demo目录下生成demo.cer文件;

sk-表示主题的密钥容器位置,is-颁发者的证书存储名称, n-证书颁发对象,ic-颁发者的证书存储位置,-$-授权范围(用于代码签名);

4、创建SPC测试软件出版商证明书,在命令行中输入"cert2spc demo.cer demo.spc",然后回车;

5、创建INF文件,用记录本编辑以下信息:

 

 代码
[ version ]     

signature
 = " $CHICAGO$ " 

AdvancedINF
 = 2.0 

[ Add.Code ] 

ActivexDemo.ocx
 = ActivexDemo.ocx

[ ActivexDemo.ocx ] 

file-win32-x86
 = thiscab    
// 告诉ie到哪里去得到这个dll,file一共包括三个部分,第一部分是file,这个永远都是这样的(至少目前来说);第二部分告诉声明支持的 OS,win32表示windows,mac就是苹果MAC  OX了;第三部分是CPU类型,比如说 x86、  ppc  (Power  PC)、  mips或者alpha了   
//其中“thiscab”是一个关键字,表示 CAB 包含此 DLL,也可通过指定一条绝对或相对路径,从一个 HTTP 位置下载所需的 DLL,   
例如:  file-win32-x86
 = http://www.mysite.com/mydir/NEEDED.DLL   
RegisterServer
 = yes    

clsid
 = { 468E4531 -F890-47EC- 8368 -3BDA4448FF08}    
//“clsid”是将要安装的控件的 CLSID  
DestDir
 = 11     
// 它的值是dll将要存到本地硬盘的位置,如果它的值是10,则将dll放到\Windows或者\WinNT下;如果是11,则放到\Windows \System或者\WinNT\System32下;如果未指定任何 DestDir(典型情况),则代码安装在固定的 OCCACHE 目录中。  
FileVersion
 = 1 , 0 , 0 , 1 
//说明了atl90.dll的版本号   

  

6、创建CAB文件,在命令行中输入"cabarc -s 6144 n demo.cab atl90.dll Polygon.dll demo.inf",-s 选项表示在压缩文件中保留用于代码签名的空间,n命令指定希望创建 CAB 文件,然后回车;

7、使用Code Signing Wizard签署一个CAB文件,在控制台输入signtool signwizard 进入到signtool窗体中;

8、单击"下一步(N)"按钮,选择要进行数字签名的且已做成CAB包的文件demo.cab文件;

9、选择好CAB包后单击"下一步(N)"按钮,在选择想要的签名类型里选择"自定议(C)"并单击"下一步(N)"按钮;

10、接下来单击"从文件选择(F)"按钮,选择刚刚制作的demo.cer;

11、在单击"下一步(N)",然后选择"CSP中的私钥(K)";

13、在"证书路径中的证书"中选择"证书路径中的所有证书,包括根证书(C)",在"其它证书(可选)"中选择"包括在以下PKCS #7 证书(.p7b)文件中的证书(P):",并单击"浏览(R)..."按钮选择demo.spc文件,选择完后单击"下一步(N)"按钮;

14、接下来在弹出的"数据描述"窗口中输入公司的名称和网址并单击"下一步(N)"按钮;

15、现大部份工作都已完成,在接下来的一步当中是可选的操作,其作用只是为CAB加入时间戳,此步骤完全可以不做,VeriSign:  http://timestamp.verisign.com/scripts/timstamp.dll;

16、完成,单击"下一步(N)"按钮便可来到数字签名向导的最后一步,即操作总览,如图26所示,单击"完成"按钮便可大功告成;

 

 

下面是微软代码签名证书(.pvk/.spc)签名指南的演示

 

 

本使用指南演示如何使用WoSign代码签名证书来给微软代码签名,Thawte和VeriSign代码签名证书也是使用同样方法,只是使用不同的时间戳URL。

     用户在在线申请代码签名证书时会生成证书私钥文件,如:myCert.pvk,而代码签名证书成功颁发后的证书文件为公钥文件, 如:myCert.spc,又称:软件发行证书(Software Publishing Certificate) 。 代码签名证书一般都是采用公钥和私钥分离的两个文件方式,适合于 DOS 命令行方式的代码签名。如果您您希望把代码签名证书导入到Windows证书存储区中,从而简化签名操作,请参考:不同证书格式转换指南。

     WoSign代码签名证书的根证书链为: UTN-USERFirst-Object - WoSign Code Signing Authority

    使用微软的 SignCode.exe 就可以对微软的代码进行签名,如果您没有此文件,点击 这里 下载。 Signcode.exe 可以使用 DOS 命令行方式实现签名,我们推荐用户使用数字签名向导方式,简单方便。请注意:如果您开发的ActiveX为IE加载项,请先数字签名每个CAB文件中的.dll和.ocx等文件,再把这些文件打包成.cab文件后再数字签名.cab文件,以确保所有IE加载项都被IE验证和信任,否则会显示“未验证”而可能影响正常运行。

    具体签名向导过程如下:

     (1) 运行 Signcode.exe , 要求您选择需要签名的文件,支持:可执行文件 (*.exe; *.dll; *.ocx) ; Cabinet 打包文件 (*.cab) 和目录文件 (*.cat) ,如下图 1 所示 ( 如: TestSign.cab) ,请注意:如果签名的文件已经有数字签名,则会被新的签名覆盖:

(2) 点击“下一步”后,如下图 2 所示,会要求您选择“签名类型”,缺省的“典型”签名类型;请选择“自定义” 签名类型:

 (3) 如下图 3 所示,点击“从文件选择”签名证书 ( 公钥文件 ),如: WotoneCS.spc :

   (4) 点击“下一步”后,如下图 4 所示,会要求您选择私钥文件,如: WotoneCS.pvk ,其他参数不用动:

  (5) 点击“下一步”后,如下图 5 所示,会提示要求输入私钥密码:

   (6) 点击“下一步”后,如下图 6 所示,会提示要求选择散列算法 ( 摘要算法、缩微图算法 ) ,缺省为 sha1 ,也可以选 md5 :

(7) 点击“下一步”后,如下图 7 所示,选择哪些证书包括到数字签名中,直接点击“下一步”即可,即选择缺省的包括根证书:

(8) 如下图 8 所示,要求填写该签名代码的功能描述,推荐一定要认真填写,因为此信息将会在最终用户下载此代码时显示,有助于最终用户了解此代码的功能以确定是否下载安 装。第一行“描述”是指此代码的功能文字描述,第二行“ Web 位置”则让最终用户点击文字描述来详细了解此代码的功能和使用方法等,本演示中的“ Web 位置”为WoTrust代码签名证书简介页面:

 (9) 点击“下一步”后,如下图 9 所示,选中“将时间戳添加到数据中”,请使用:

 

WoSign 免费提供的时间戳服务URL: http://timestamp.wosign.com/timestamp

     时间戳服务非常重要,添加时间戳后,即使您的代码签名证书已经过期,但由于您的代码是在证书有效期内签名的,则时间戳服务保证了此代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经过期,您也无需重签和重新发布已经签名的代码。

(10) 点击“下一步”后,如下图 10 所示,会提示已经完成数字签名向导,点击“完成”后还会提示您输入私钥密码,就完成代码签名证书的代码签名。

(11) 现在,需要使用 chktrust.exe 来查验已经签名的代码, chktrust.exe 文件已经打包在 signtool.rar 中。 进入 DOS 命令提示符,并进入已经签名的文件所在目录 ( 如: d:\sign\TestCA.cab) ,键入命令: chktrust testcs.cab ,则会显示实际应用时在 IE 浏览器下载页面的情况,如下图 11 所示,对于Win XP操作系统,会显示软件名称和发行者名称,其中软件名称就是您在第(8)步输入的描述,点击此名称就链接到您在第(8)步填写的网址,而点击发行者名 称,则会显示您的签名信息和时间戳信息。对于Win2000操作系统,则稍有不同,第 1 行的红线部分就是时间戳记录的签名时的本地时间,请注意:此时间不是取签名电脑的时间,而是提供时间戳服务的服务器计算出来的签名电脑设置的所在时区的本 地时间。第 1 行蓝色文字就是在第 8 步中输入的描述文字,点击此蓝色文字就可以访问在第 8 步中输入的 Web 描述页面。第 2 行蓝色文字则为该代码的发行者,也就是代码签名证书的申请者(拥有者)( 如:深圳市沃通电子商务服务有限公司) ,点击可以查看证书的详细信息;第 2 行有红色下划线部分显示“发行商可靠性由 WoSign Code Signing Authority 验证 ”就是此代码签名证书的证书颁发者。

12) 点击“是”或“运行”,则会提示“ TestSign.cab: Succeeded ”表示代码 TestSign.cab 签名验证有效,可以放到网站上了。请注意:签名后的CAB文件放到网站上需要使用 object 方式。

请注意:不能仅签名CAB文件,CAB包中所有DLL文件都要先签名后再打包,再签名CAB文件,否则IE浏览器会显示为“未验证的发行者”而影响正常使用,甚至杀毒软件会认为是毒而被删除!如下图所示的实际案例:

 

 

在Web页中加入ActiveX 控件

在修改了IE的安全设置后,依然不能调用控件的方法,需要将访问的站点设置为“受信站点”,则方能正常使用控件
在<html> 和<head>之间插入
<!-- saved from url=(0017)http://localhost/ -->
则在IE窗口上方不会弹出黄色提示条 。

在HTML页面中使用ActiveX控件包含三个基本操作:将控件放入HTML中;将该控件下载给用户;在用户机器上安装该控件。如果只是针对IE用户,在HTML中插入ActiveX控件就比较简单;如果同时兼顾IE和Netscape用户,则要做更多工作。大家知道,HTML文件由文本和各种标志(tags)组成,ActiveX 控件对于IE在HTML中的标志是<OBJECT>,该标记有几个重要的参数特性,它们是:

1.ID:为控件提供一个标识名称,为HTML代码提供一种访问该控件的方式。

2.CLASSID:是该控件唯一的UUID,告诉IE装入哪个对象。如果使用已经开发好的控件,它的CLASSID可以通过调用Win95或NT下的应 用Regedit来查找。从开始菜单中运行该程序,展开HKEY_CLASSES_ROOT项,可以看到按字母顺序排列的注册表,找到需要使用的控件名, 例如WClnt,展开时可看到一个CLSID文件夹,里面就是该控件的CLASSID。

如果是自己用VC开发控件,该UUID可以在ActiveX控件项目中的ODL(对象描述库)文件中找到;通过查看控件的类信息注释来定位特定控件的UUID,例如,要找到CMyControl控件的UUID,则需要找到以下代码:

// Class information for CMyControl

[uuid (051C4748-1262-11D2-87C1-00A024D948FB),

licensed,

helpstring(“CmyControl Control”), control ]

uuid后面括号中的内容就是该控件的UUID。

3.CODEBASE:如果在用户机器上没有控件的当前版本,该参数告诉用户浏览器在哪里可找到要下载的控件和最新版本号.当控件作了修改后,可以更改版本号强制用户重新下载。

4.PARAM:该标记用于设置控件的初始属性值,它有两个特性:Name和Value,即属性名称和属性值。

此外还有一些标记,如:Width表示该控件所占的宽度,Height表示高度等,总体来说,这样一个插入控件的HTML代码和插入Java Applet的HTML代码非常相似。

下面是一个嵌有ActiveX控件的HTML代码示例:

ID=“CMyControl”

CLASSID=“clsid:051C4748-1262-11D2-87C1-00A024D948FB ”

CODEBASE=“http://www.mysite.com.cn/ocxdir/mycontrol.ocx#version=1,0,0,1”

WIDTH=400

HEIGHT=200

ALIGN=center

HSPACE=0

VSPACE=0

如果希望控件还 能在Netscape中运行,除了Netscape需加装插件外,HTML也要加一些附加标记,下面的例子中EMBED段就是为Netscape加上的。 如果使用MFC开发OCX控件,则少数用户第一次访问时除了下载OCX文件外,还要下载相应的MFC DLL,下载量变大,这时可将相关文件在服务器端打包成可以在客户端自解压安装的CAB文件。经过修改后的HTML代码段如下:

<ALIGN=“CENTER” CLASSID=“clsid:

7BCA18C6-2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marquee”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.cab#version=1,0,0,1”>

<EMBED ALIGN=“CENTER”CLASSID=“clsid:7BCA18C6- 2178-11D2-87C1-00A024D948FB”

WIDTH=“1200” HEIGHT=“900” ID=“marqueequot;”

CODEBASE=“http://218.168.188.188/scadaweb/

WClnt.OCX#version=1,0,0,1”

TYPE=“application/oleobject” >

 

 

 

 

实时动态页面的实现方案

对实时动态页面的要求多产生于一些要求自动更新实时数据的应用中,如电网监控、股市监测等。具体要求是:用户只需选取希望浏览的图表,但无需介入操作,该图表就能根据实时数据不断更新,用户总能观察到最新情况。

要实现上述功 能,结构上有两种方案:一种是设置一个中介服务器,该服务器作为控件和后台系统信息交流的中介;另一种是不设中介服务器,但在提供实时数据的后台服务器上 留出供控件通信用的数据接口,控件可以直接从后台服务器上定时获得当前实时数据。按数据提供方式分也有两种:一种是由客户端定时向服务器发出请求,指明需 要的实时数据,服务器收到请求后将满足请求的动态数据发送至相应客户;另一种是客户端只请求一次,服务器端便定时将满足请求的实时数据传到客户端,直到客 户更换要显示的图表或停止刷新。上述各方案都有其优点和局限,在应用中可考虑实际情况采用相应方案。

工作流程为:用户先从Web服务器上下载包含ActiveX 控件的网页,控件随即在客户机上注册运行,并通过Winsock同中介服务器或直接同提供实时信息的网,如股票信息网相连接,定时取得动态实时数据,并刷 新显示。在这个体系中,客户有两条线路获得信息,一条是和Web Server的连接,从这条线上用户访问主页;另一条就是控件和后台信息网的连接,从这条线路上用户可以访问实时数据。后一条线路用Winsock建立, 传输速度远大于前一条线路,且控制灵活、效率高,不和主页下载争资源。通过这条线路,用户甚至可以传送远程控制信息实现遥控操作。

利用MFC开发ActiveX控件

利用VC5.0 开发的这种控件,功能可扩展性强,理论上独立的VC5.0程序具有的功能,该控件都能实现,例如控件直接绘制浏览器,可以使用OpenGL等图库,图形图 像功能强大。实时数据刷新频率理论上可达毫秒级,用户通过鼠标可以实现各类交互操作,如旋转、缩放,图2就是一幅GL图形,并有一个缩放工具条进行缩放操 作。如果是在计算机上观看,可以看到这几个三维图在不断旋转。

应该说,较好的开发工具可直接用API编程或使用ATL模板库,利用MFC开发ActiveX控件不是一个好的选择,因为控件运行需要MFC DLL的支持。假如客户机器上没有这些类库(这种情况很少,但确实存在),第一次下载就要花费些工夫。不过对于熟悉MFC的开发员来说,这些问题相对MFC提供的便利来说都是可以忽略的。

由于VC5.0对ActiveX控件的开发提供了许多便利,所以开发一个ActiveX控 件并不像许多人想象中的那么困难复杂,通过VC 5.0的AppWizard,实现控件的主类从ColeControl类派生出来,该类则是CWnd的一个子类,所以你可以像对窗口类编程一样对这个主类 编程。为了实现上面提及的功能,首先必要重载它的OnDraw函数加入需要绘制的对象,加入Winsock类(CSocket或 CAsyncSocket),以实现与后端数据服务器的通信。如果需要用OpenGL绘制丰富多彩的立体图,则要初始化GL环境。其他的工作就在于用户如 何控制程序的调度,使得各功能都能正常工作且与其他部分正常通信。此外,后端服务器程序也要增加对应于该控件的接口。

这样的一个程序编译通过后,就成为一个可用于Web的控件,后缀名是OCX。按照前面叙述的方法将该OCX置入主页,基本的工作就算完成。

综上所述,利用VC5.0开发ActiveX控件用于Web浏览,主要有以下几个特点:

1.采用Winsock的通信机制,速度快、控制灵活、效率高;

2.控件采用VC5.0编制,功能可扩展性很强;

4.控件第一次下载虽然稍费时间,但下载后即在用户机上注册,以后可直接调用,速度效率均好;

5.ActiveX技术是微软发展的重中之重,且已成为当前软件发展的潮流所向,发展空间广阔;

6.系统采用VC开发,可以利用已有的采用C语言编制的系统,开发工作量大大减少。

Web页面的开发主要分为三类:静态Web页面、半动态Web页面以及Client端动态页面。本文重点论述基于ActiveX Control(控件)动态实时页面的开发。

regsvr32 netshare.ocx        注册netshare.ocx控件

regsvr32 /u netshare.ocx    解除netshare.ocx控件的注册

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_721607.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】大型网站架构系列

【转】大型网站架构系列 由 农夫一号 发表于 十一月 9th, 2011 转载自www.crazycoder.cn 疯狂代码 大型网站架构系列之一,前言,不得不考虑的问题 前言&#xff1a;这两天机器坏了&#xff0c;正在送修中&#xff0c;写个系列的大型网站架构的文章&#xff0c;希望对有志…

使用squid代理后某些网站无法访问的解决办法

使用squid代理后某些网站无法访问的解决办法 2010-09-07 11:21:24 标签&#xff1a;squid代理 某些网站无法访问的解决办法 休闲 职场在测试Squid代理服务器&#xff0c;发现有些网站无法访问&#xff0c;但是绝大部分网站都是可以访问的。&#xff08;当前环境&#xff1a;sq…

毕业设计之 --- 基于java web的旅游网站设计

文章目录0 前言1 课题背景2 实现功能2.1 系统整体设计2.2 业务流程3 运行效果4 部分实现代码最后0 前言 今天向大家展示学长帮助同学完成的一个毕业设计&#xff1a;基于java web的旅游网站设计与实现。需要的同学点击下方获取源码及论文。 毕设帮助&#xff0c;开题指导&…

php 中%3cspan%3e,vue实战(4)——网站统计之——友盟百度统计

一、友盟统计首先进入到网站统计(U-Web),进入立即使用添加站点已添加站点列表进入到列表中设置中站点设置统计代码添加到相应页面&#xff0c;即可在统计报表中看到相应数据在单页面应用vue项目中只能在index.html或App.vue中添加统计代码const script document.createElement…

从上百幅架构图中学大型网站建设经验(上)

从上百幅架构图中学大型网站建设经验&#xff08;上&#xff09; 引言 近段时间以来&#xff0c;通过接触有关海量数据处理和搜索引擎的诸多技术&#xff0c;常常见识到不少精妙绝伦的架构图。除了每每感叹于每幅图表面上的绘制的精细之外&#xff0c;更为架构图背后所隐藏的设…

信息收集之网站指纹(CMS)识别、Waf识别、CDN探测(w8fuckcdn全网扫描获取ip)

CMS识别 CMSeek下载地址 Webfinger下载地址 CMS指纹识别-CMSeek CMSeek安装使用&#xff1a; 安装&#xff1a;git clone https://github.com/Tuhinshubhra/CMSeeKcms扫描命令&#xff1a;python3 cmseek.py -u 目标 #输出结果保存在/root/cms/CMSeeK/Result/www.4tricks.c…

网线制作ppt_这个能做PPT的逆天网站可能会让我失业,但我还是想介绍给你!

嗨&#xff0c;各位木友们好呀&#xff0c;我是小木。身为一个资浅无证的PPT设计师&#xff0c;我已经习惯了每天被人问一些奇形怪状的沙雕问题&#xff1a;不能用PPT的情况下怎么做PPT&#xff1f;没学过设计&#xff0c;怎么在10分钟内做出高大上的海报&#xff1f;去哪下载超…

有keras环境吗_CV学习笔记(十六):Windows环境复现ChineseOCR

项目地址&#xff1a;https://github.com/xiaofengShi/CHINESE-OCR为了方便下载&#xff1a;https://gitee.com/yunshizhijian/CHINESE-OCR因为项目中推荐使用的环境为MAC和Linux&#xff0c;因此迁移到Windows上仍需要一些改动&#xff0c;但是在网上的资料很少&#xff0c;并…

php网站留言,php实现网站留言板功能,php实现留言板_PHP教程

php实现网站留言板功能&#xff0c;php实现留言板我要实现的就是下图的这种样式&#xff0c;可参考下面这两个网站的留言板&#xff0c;他们的实现原理都是一样的畅言留言板样式&#xff1a;网易跟帖样式&#xff1a;原理需要在评论表添加两个主要字段 id 和 pid &#xff0c;其…

seo原创工具_seo优化外包

seo优化外包&#xff0c;合肥辰俊尽职尽责&#xff0c;合肥辰俊信息科技有限公司(简称辰俊网络)是一家专注于全网整合营销领域的互联网公司&#xff0c;致力于为安徽中小型企业提供全方位的公司整体品牌策划、营销型网站建设、G3云推广全网整合营销、微信营销推广、微信平台代运…

wordpress插件翻译不生效_外贸网站多语言插件 Polylang

WordPress外贸网站多语种插件 Polylang作为网站翻译市场的两大巅峰&#xff0c; Polylang和WPML凭借着各自的强大翻译功能和高度自定义化的操作&#xff0c;成功的获得了广大外贸建站人员的欢迎。在上一篇文章中 &#xff0c;Jack老师着重讲解了WPML的相关实操步骤&#xff0c;…

众筹系统源码 java_基于JavaWeb的创意众筹网站系统的设计与实现 毕业论文+任务书+开题报告+外文翻译+设计源码+mysql文件...

摘 要现代众筹指通过互联网方式发布筹款项目并募集资金。相对于传统的融资方式&#xff0c;众筹更为开放&#xff0c;能否获得资金也不再是由项目的商业价值作为唯一标准。只要是网友喜欢的项目&#xff0c;都可以通过众筹方式获得项目启动的第一笔资金&#xff0c;为更多小本…

python爬取两个网站_爬取90%的网页,只需学会这13行爬虫通用代码框架——Python版!...

还有一种方法apparent_encoding&#xff0c;可以通过分析网页内容来得到编码&#xff0c;有时候网站没有头部标识时&#xff0c;为了能正常显示&#xff0c;一般常用 apparent_encoding 替代 encoding。 五、状态码异常raise_for_status的作用就是返回一个异常错误requests.HTT…

安装错误 服务尚未启动_【云服务器Centos7.x建站】MySQL 5.7安装、使用、错误总结...

MySQL环境搭建进入本机源文件目录 cd /usr/local/src wget下载yum源的rpm包 wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 安装rpm包 rpm -ivh mysql57-community-release-el7-11.noarch.rpm 使用yum安装mysql-server yum install -y mysql-se…

ios图标素材_设计必备丨强推50个免费的图标素材网站

不会画图标&#xff0c;如果知道这50个图标素材网站&#xff0c;制件图标信手拈来&#xff01;对于UI设计师来说&#xff0c;都会遇到图标设计的需求。如果有高质量的图标素材资源做后盾&#xff0c;会大大提供自己的工作效率。今天&#xff0c;给大家整理了50个设计师必看的免…

站点地图用xml好还是用html好,网站有必要做网站地图(sitemap)吗?

原标题&#xff1a;网站有必要做网站地图(sitemap)吗&#xff1f;网站地图有引导搜索引擎蜘蛛爬网站和增加收录的功能&#xff0c;是一种对收索引擎友好的设置&#xff0c;那么&#xff0c;是不是每个网站都要做一个网站地图呢&#xff1f;其实&#xff0c;根据实际情况的不同&…

服务器网站迁移注意事项,网站更换主机服务器的安全迁移注意事项

很多运营网站的过程中有更换虚拟空间的需求&#xff0c;那么更换虚拟主机空间应该注意什么呢?不管是使用什么样的网站空间&#xff0c;都可能会遇到更换新主机的情况&#xff0c;换空间相对来说比较麻烦&#xff0c;有很多问题需要我们注意&#xff0c;其中网站的安全是一定要…

python脚本根据cookies自动登录网站_python接口自动化4-绕过验证码登录(cookie)

前言 有些登录的接口会有验证码&#xff1a;短信验证码&#xff0c;图形验证码等&#xff0c;这种登录的话验证码参数可以从后台获取的&#xff08;或者查数据库最直接&#xff09;。 获取不到也没关系&#xff0c;可以通过添加cookie的方式绕过验证码。 一、抓登录cookie 1.登…

网站拒绝访问_你的网站被为什么会被DDoS攻击 如何防御DDoS

互联网安全威胁无处不在&#xff0c;随着网络安全问题的不断演化&#xff0c;DDoS攻击情况愈演愈烈&#xff0c;侵害了很多网站的利益&#xff0c;甚至威胁了很多网站的生存。DDoS攻击日趋增强据卡巴斯基2018 Q3全球DDoS攻击分析报告指出&#xff0c;在DDoS攻击方面&#xff0c…

bbt如何制作流程图_超级好用的5个免费在线版流程图制作网站

目录&#xff1a;zen flowchartZen Flowchart - Sign In​www.zenflowchart.comvisual paradigm onlineVisual Paradigm Online​online.visual-paradigm.comdraw ioFlowchart Maker & Online Diagram Software​app.diagrams.net迅捷画图迅捷画图-专业的在线作图网站,在线…