仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 455|回复: 8
打印 上一主题 下一主题

[学习教程] ASP网页编程之ASP与ActiveX控件交互实战

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
当然了,现在国内CRM厂商的产品与其说是CRM,但从至少从我的角度分析上来看,充其量只是一个大型的进销存而已了,了解尚浅,不够胆详评,这里只提技术问题active|activex|交互|控件
关头字:ASP,ActiveX控件,数字署名,平安

ActiveX控件运转在客户端。我们能够取得客户真个一些信息,如IC卡的信息,客户真个考证等等。可是ActiveX控件也有很多弱点:客户真个部署很坚苦,如客户端不克不及准确下载,下载了今后不克不及准确实行,下载的时分必要设置IE的平安级别等等。

更多的时分,我都在利用COM组件来扩大ASP的功效。正确地说,是服务端运转的ActivexDll组件。利用Server.CreateObject(“工程名.类名”)便可完成对组件的挪用。这类体例成绩很少,只需组件中以PUBLIC对外表露办法既可。可是,偶然候我们必需利用ACTIVEX控件(*.OCX)嵌进到网页中实行来猎取客户真个信息。这就有了许很多多的一些成绩。

这是我们必要办理的N个成绩(从复杂到难)

1.怎样从服务端猎取数据,传送到ActiveX控件中。

1)初始化时利用参数绑定

2)运转时失掉数据

2.ActiveX控件失掉客户真个信息,怎样传送到服务端。

3.平安性

1)数字署名

2)利用IOBJSAFE接口

好了,我们入手下手实例进修。

这个功效演示了怎样制造一个复杂的控件,并嵌进网页中实行。

事情情况:WINXP+VB6+IE6

我的IE平安设置为平安级别-中。一切的Activex选项设为启用。



翻开vb6,新建ActiveX控件工程。

工程名:fOcx,用户控件名:UC1

为了便利,我们利用ActiveX控件接口导游…,菜单->外接程序->外接程序办理器->VB6ActiveX控件接口导游。断定便可。



翻开ActiveX控件接口导游,下一步,关于可用称号和选命名称我们默许下一步,新建自界说成员,GetInfo范例:属性,下一步,共无方法当选择我们方才增加的GetInfo,映照到控件选择TxtInfo,成员选择Text,下一步直到完成。代码窗口中会天生一些我们不必要的,删除,剩下的代码以下:

OptionExplicit

注重!不要删除或修正以下被正文的行!

MappingInfo=txtinfo,txtinfo,-1,Text

PublicPropertyGetGetInfo()AsString

GetInfo=txtinfo.Text

EndProperty



PublicPropertyLetGetInfo(ByValNew_GetInfoAsString)

txtinfo.Text()=New_GetInfo

PropertyChanged"GetInfo"

EndProperty



从存贮器中加载属性值

PrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)

txtinfo.Text=PropBag.ReadProperty("GetInfo","Text1")

EndSub

将属性值写到存储器

PrivateSubUserControl_WriteProperties(PropBagAsPropertyBag)

CallPropBag.WriteProperty("GetInfo",txtinfo.Text,"Text1")

EndSub

OK,好了,我们编译成fOcx.ocx文件,然后F5间接运转,VB会翻开一个测试页。以下:

E:ProgramFilesMicrosoftVisualStudioVB98UC1.html

同时,翻开你的IE扫瞄器,看到了吧,你做的控件呈现在了这个测试页中。

你能够翻开测试页,能够看到ClsID,好比:890D1028-298B-45CF-9A64-6ED5A5BACBC9

由于VB编译的时分已完成注册.以是没法摹拟客户端没有安装该控件时呈现的提醒.

我们持续

利用regsvr32F:csdn_vbcom+_activeXsample1fOcx.ocxCu卸载

大概

翻开注册表,在HKEY_CLASSES_ROOTCLSID上面找到

890D1028-298B-45CF-9A64-6ED5A5BACBC9项,删除之,固然这类体例另有项存在而没有删除洁净.



此时扫瞄http://yang/uc1.htm,因为IE中ActiveX设置为启动,以是,控件会显现出来。

下载后的ocx到那里往了???

翻开该目次(大概有所分歧)E:WINDOWS.0DownloadedProgramFiles,看到了吧,fOcx.UC1文件在这个目次下.

道理:客户端下载该控件后,主动注册,然后放在上述这个目次下.这时候我们能够翻开注册表看看CLSID,呵呵,仍是之前的谁人.

我们能够右键看看fOcx.UC1的属性,看看相干内容,这里显现了该OCX所依附的一切文件.以是,你的OCX只管削减利用初级控件大概第三方的控件,不然,下载就有些成绩了.

假如IE中关于ActiveX的选项设为禁用,那末扫瞄器就会呈现对话框”以后平安设置克制运转该页中的ActiveX控件.因而大概没法准确显现该页”,这个就必要其他的体例来处置了。

一样平常用户默许的都是禁用ActiveX选项,以是让用户本人设置不太符合。
我们来看看怎样从服务端猎取数据,传送到ActiveX控件中。

1)初始化时利用参数绑定

2)运转时失掉数据

翻开vb6,新建ActiveX控件工程。

工程名:fOcx,用户控件名:UC2

为了便利,我们利用ActiveX控件接口导游…,菜单->外接程序->外接程序办理器->VB6ActiveX控件接口导游。断定便可。

翻开ActiveX控件接口导游,下一步,关于可用称号和选命名称我们默许下一步,新建自界说成员,GetInfo范例:属性,下一步,共无方法当选择我们方才增加的GetInfo,映照到控件选择TxtInfo,成员选择Text,下一步直到完成。代码窗口中会天生一些我们不必要的,删除,

注重!不要删除或修正以下被正文的行!

MappingInfo=txtinfo,txtinfo,-1,Text

PublicPropertyGetGetInfo()AsString

GetInfo=txtinfo.Text

EndProperty

PublicPropertyLetGetInfo(ByValNew_GetInfoAsString)

txtinfo.Text()=New_GetInfo

PropertyChanged"GetInfo"

EndProperty

PrivateSubCommand1_Click()

Label2.Caption=GetInfo()

EndSub

从存贮器中加载属性值

PrivateSubUserControl_ReadProperties(PropBagAsPropertyBag)

txtinfo.Text=PropBag.ReadProperty("GetInfo","Text1")

EndSub

将属性值写到存储器

PrivateSubUserControl_WriteProperties(PropBagAsPropertyBag)

CallPropBag.WriteProperty("GetInfo",txtinfo.Text,"Text1")

EndSub

编译成OCX控件.运转天生的测试页.Text中默许的是Text1

怎样将服务器真个数据传送给OCX呢?

利用MicrosoftActiveXControlPad这个工具,能够很简单找到.

间接用这个工具把测试页翻开.

菜单->Edit->EditActivexControl,呵呵,翻开了一个可视化的界面.

看到了吧,有一个属性框,我们能够举行设置,设置完成今后的代码以下:

<HTML>

<HEAD>

<TITLE>NewPage</TITLE>

</HEAD>

<BODY>

<OBJECTID="GetClient"WIDTH=507HEIGHT=440

CLASSID="CLSID:890D1028-298B-45CF-9A64-6ED5A5BACBC9"

CODEBASE="http://localhost/xml/fOcx.ocx">

<PARAMNAME="_ExtentX"VALUE="13414">

<PARAMNAME="_ExtentY"VALUE="11642">

<PARAMNAME="GetInfo"VALUE="这是ocx失掉的客户端读卡器的信息">

</OBJECT>

</BODY>

</HTML>

增添了ID,ID就是我们用来会见的标记.另有我们的属性GetInfo,我们也设定初始值了

好了,运转.

Text中就呈现了我们设定的值”这是ocx失掉的客户端读卡器的信息”

我们把上边的页面改成asp的,看代码:

<HTML>

<HEAD>

<TITLE>龙卷风测试页</TITLE>

</HEAD>

<BODY>

<%

dimsValue

sValue="这是ocx失掉的客户端读卡器的信息"

%>

<OBJECTID="GetClient"WIDTH=507HEIGHT=440

CLASSID="CLSID:56DFCA88-F5B8-4879-853B-97FE504423FD"

CODEBASE="http://localhost/xml/fOcx.ocx">

<PARAMNAME="_ExtentX"VALUE="13414">

<PARAMNAME="_ExtentY"VALUE="11642">

<PARAMNAME="GetInfo"VALUE="<%=sValue%>">

</OBJECT>

</BODY>

</HTML>

OK,运转便可

我们看看第二种情形

运转时失掉数据


<HTML>

<HEAD>

<TITLE>龙卷风测试页</TITLE>


<%

dimsValue

sValue="这是ocx失掉的客户端读卡器的信息"

%>

<SCRIPTID=clientEventHandlersJSLANGUAGE=javascript>

<!--

functionbutton1_onclick()

{

GetClient.GetInfo=<%=sValue%>;

}

//-->

</SCRIPT>

</HEAD>

<BODY>

<OBJECTID="GetClient"WIDTH=507HEIGHT=440

CLASSID="CLSID:56DFCA88-F5B8-4879-853B-97FE504423FD"

CODEBASE="http://localhost/xml/fOcx.ocx">

<PARAMNAME="_ExtentX"VALUE="13414">

<PARAMNAME="_ExtentY"VALUE="11642">

</OBJECT>

<INPUTid=button1type=buttonvalue=Buttonname=button1LANGUAGE=javascript>

</BODY>

</HTML>

运转后,点击按钮便可看到效果.
成绩提出:

ActiveX控件失掉客户真个信息,怎样传送到服务端???

一种办法就是失掉值后,利用Get,Post体例提交,这大概也是最经常使用的.

有无更好一些的办法呢?

能不克不及在控件中间接向服务器收回哀求而失掉数据呢?



翻开vb6,新建ActiveX控件工程。

工程名:fOcx,用户控件名:UC3

增加1个按钮,2个文本框

代码以下:

OptionExplicit

PrivateSubCommand1_Click()

注重字符串和数字的写法有些区分

利用AsyncRead经由过程HTTP发送你的哀求

UserControl.AsyncRead"http://yang/xml/activex.asp?s1="&Text1.Text&"",vbAsyncTypeByteArray

UserControl.AsyncRead"http://yang/xml/activex.asp?s1="&Text1.Text,vbAsyncTypeByteArray

EndSub

AsyncReadComplete事务用来从asp页面承受和剖析。

当容器刚完成一个异步读取哀求时,产生该事务?

AsyncProp中的数值指定了已完成的某个异步数据读取哀求,

它与前一个AsyncRead办法挪用中的数据婚配。

AsyncReadComplete事务过程当中应包括毛病处置代码,由于毛病形态会停止下载。

假如产生了这类情形,当会见AsyncProperty工具的Value属性时将会产生毛病。

PrivateSubUserControl_AsyncReadComplete(AsyncPropAsAsyncProperty)

OnErrorGoToerrhandle

Text2.Text=ByteArrayToString(AsyncProp.Value)

errhandle:

Err.Raise601,"异步读取产生了毛病",Err.Description

EndSub

将字节数组转换成字符串

PublicFunctionByteArrayToString(bytArray()AsByte)AsString

DimsAnsAsString

sAns=StrConv(bytArray,vbUnicode)

ByteArrayToString=sAns

EndFunction

我们来看看http://yang/xml/activex.asp这个文件

<%

dimstr

str=request("s1")

ifstr="name"then

response.write("龙卷风")

elseifstr="age"then

response.write("26")

else

response.write("没有可用信息前往")

endif

%>

很复杂,利用request承受参数,response前往。



这个例子能够进一步处置,将服务器名以属性的体例传送给控件。

好比:<PARAMNAME="ServerName"VALUE="192.168.0.1">

然后在程序中失掉,就能够利用了,如:

UserControl.AsyncRead"http://192.168.0.1/xml/activex.asp?s1="&Text1.Text&"",vbAsyncTypeByteArray

然后在程序中失掉就能够天真处置了。asp可以使用微软的activeX使得网页功能无比强大,不过安全性也较差,而且是基于的windows服务器,所以性能稳定性也一般
简单生活 该用户已被删除
沙发
发表于 2015-1-18 23:18:47 | 只看该作者
我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。
若天明 该用户已被删除
板凳
发表于 2015-1-24 12:21:20 | 只看该作者
ASP的语言不仅仅只是命令格式差不多,而是包含在<%%>之内的命令完全就是VB语法。虽然ASP也是做为单独的一个技术来提出的,但他就是完全继承了VB所有的功能。
若相依 该用户已被删除
地板
发表于 2015-2-1 11:52:53 | 只看该作者
他的语法和设计思路和VB完全相同,导致很多ASP的书都留一句“相关内容请参考VB的相关教材....”更糟糕的是,相当多的ASP教程混合了Javascript,VBscript等等脚本语言,搞的初学者。
爱飞 该用户已被删除
5#
发表于 2015-2-7 04:45:06 | 只看该作者
在平时的学习过程中要注意现学现用,注重运用,在掌握了一定的基础知识后,我们可以尝试做一些网页,也许在开始的时候我们可能会遇到很多问题,比如说如何很好的构建基本框架。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-20 14:20:02 | 只看该作者
哪些内置对象是可以跳过的,或者哪些属性和方法是用不到的?
老尸 该用户已被删除
7#
发表于 2015-3-6 18:17:25 | 只看该作者
代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。
小魔女 该用户已被删除
8#
发表于 2015-3-13 05:10:01 | 只看该作者
还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。
乐观 该用户已被删除
9#
发表于 2015-3-20 13:51:51 | 只看该作者
学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-11 01:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表