[转]VC2005起开发MFC ActiveX ocx控件到公布到.net网站的周历程

正文转自:http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html

 

开篇语:最近以弄ocx控件发布暨asp.net网站上运用,就是用户以动过程遭到,自动下载安装ocx控件。(此篇也罢是总了网上广大人写的文章,我只是汇总一下,加上有的融洽的物,在此处谢谢所有以网上发表相关内容之情侣等。)

ActiveX控件用于Web的历程是用控件嵌入主页中,用户通过浏览器访问该主页时,将主页中之控件下载,并以用户机器上登记,以后就是不过于用户之浏览器上运行。控件下充斥同不善后就是驻留于用户本地机械及,下次再度拜同的主页时,可不再下充斥该控件,而是直接运行用户本地的控件。这里控件容器就是浏览器,用户不需要经浏览器调用控件的特性或措施。因此,开发面向Web的ActiveX控件比付出桌面的控件还要简单些,所复杂的凡怎样以欠控件很好地停放主页,使用户能够正常浏览。下面介绍者题材。

一.        创建MFC ActiveX项目

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

C语言 1

 

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

C语言 2

WoSign 免费供的光阴穿服务URL:
http://timestamp.wosign.com/timestamp

    
时间穿服务好重要,添加时间戳后,即使你的代码签名证书已经过期,但由你的代码是以关系有效期内签约的,则时间戳服务包了这个代码仍然可信,最终用户仍然可以放心下载,使得即使代码签名证书已经过,您吗不论需再签和再次公布就签的代码。

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

 

二.        添加控件方法

VC2005会为我们机关创建好MFC
ActiveX程序框架,我们只要给该ActiveX控件添加方法即可。现在我们给控件添加一个“AddFun”方法,这个艺术是用鲜独数相加并回结果。

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

C语言 3

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

C语言 4

 

3.       打开添加办法向导窗口。因为我们是添加一个加法方法,所以我们安的回路为LONG型,方法名设为AddFun,添加两单LONG类型参数Add1,Add2。

C语言 5

 

 

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

C语言 6

5.       打开代码视图,我们见面意识VC2005已经为我们加加了一个“AddFun”方法,我们当章程外上加“return Add1 +
Add2;”语句。

C语言 7

 

 三、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 文件中落实以下方法

 

 

C语言 8C语言 9代码

#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)

C语言 10

 

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文件,用笔记本编辑以下信息:

 

C语言 11C语言 12代码

[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窗体中;

C语言 13

8、单击”下一致步(N)”按钮,选择而进行数字签名的还都做成CAB包的文件Dome.cab文件;

C语言 14

9、选择好CAB包后单击”下一样步(N)”按钮,在增选想要之签署类型里挑”自定议(C)”并单击”下一样步(N)”按钮;

C语言 15

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

C语言 16

11、在单击”下一样步(N)”,然后选取”CSP中之私钥(K)”;

C语言 17

12、在单击“下一样步(N)”按钮,然后以散列算法中选择“shal”,并单击“下一样步(N)”按钮。

C语言 18

13、在”证书路径中之证明”中精选”证书路径中的有所证,包括根证书(C)”,在”其它证书(可选)”中选取”包括以偏下PKCS
#7
证书(.p7b)文件中之关系(P):”,并单击”浏览(R)…”按钮选择demo.spc文件,选择结束晚单击”下同样步(N)”按钮;

C语言 19

14、接下去当弹出的”数据描述”窗口中输入公司之名目与网址并单击”下一致步(N)”按钮;

C语言 20

15、现大部卖工作且已经成功,在接下去的均等步当中是可选的操作,其意图只是吗CAB加入时间穿,此步骤完全好无开,VeriSign: 
http://timestamp.verisign.com/scripts/timstamp.dll;

C语言 21

16、完成,单击”下一样步(N)”按钮便只是过来数字签名向导的末段一步,即操作总览,如图26所显示,单击”完成”按钮便可死功告成;

 C语言 22

 

下是微软代码签名证书(.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)
,请小心:如果签名的文本就有数字签名,则会让新的签署覆盖:

C语言 23

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

C语言 24

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

C语言 25

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

C语言 26

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

C语言 27

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

C语言 28

(7) 点击“下同样步”后,如下图 7
所展示,选择什么关系包括到数字签名中,直接点击“下同样步”即可,即挑短省的包括根证书:

C语言 29

(8) 如下图 8
所著,要求填写该签名代码的作用描述,推荐一定要是认真填写,因为这信息用会见于最终用户下载者代码时展示,有助于最终用户了解这个代码的功力为确定是否下载安装。第一尽“描述”是负者代码的成效文字描述,第二实行“
Web
位置”则叫最终用户点击文字描述来详细摸底是代码的意义及下方法等,本演示着的“
Web 位置”为WoTrust代码签名证书简介页面:

C语言 30

 (9) 点击“下一致步”后,如下图 9
所出示,选中“将日戳添加到数量被”,请用:

 

WoSign 免费提供的光阴穿服务URL:
http://timestamp.wosign.com/timestamp

    
时间穿服务很关键,添加时间戳后,即使你的代码签名证书已经过,但由你的代码是当证明有效期内签署的,则时间戳服务保证了之代码仍然可信,最终用户仍然可放心下载,使得即使代码签名证书已经晚点,您也管需另行签和再次发布已经签署的代码。

C语言 31

(10) 点击“下同样步”后,如下图 10
所显示,会唤醒已完结数字签名向导,点击“完成”后还见面提醒您输入私钥密码,就得代码签名证书之代码签名。

C语言 32

(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 验证
”就是以此代码签名证书之关系颁发者。

C语言 33

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

请注意:不克独签约CAB文件,CAB包吃装有DLL文件都要先行签后又封装,再签字CAB文件,否则IE浏览器会显示也“未认证的发行者”而影响正常使用,甚至杀毒软件会以为是毒而受去除!如下图所出示之实际上案例:

 

C语言 34

 

每当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绘制C语言丰富多彩的立体图,则只要初始化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控件的挂号