我们原来程序是用c/s做的,现在客户要求全用b/s构架,但是有些部分用asp.net开发有些问题,现在我们想用activex来做,外面套一个IE,这样也不违背客户的要求,请问activex能做到以一般应用程序那样直接访问数据库或者中间层,IE页面里可以套一个form窗口吗?没有用activex做过网页用的,请问有什么特别规定之处吗?
谢谢!

解决方案 »

  1.   

    ActiveX 可以封装功能,但不能做网页。
    楼主有点混肴了,不过你说的都能实现。
      

  2.   

    activex与服务器怎么交换数据?通过web service?
      

  3.   

    activex调用web service返回数据,谁做过吗?
      

  4.   

    服务器数据库是oracle,有没有更好的方法?
      

  5.   

    activex可以通过webservice或者其他远程调用的方式——比如com+调用中间层组件,如果你不介意在客户端安装.net 框架的话,还可以用remoting:)
      

  6.   

    activeX 调用 web service 跟C/S下调用 web service 是一样的。
    如果你程序运行在局域网内,甚至可以用c/s程序一样的代码用ADO直接访问数据库。
      

  7.   

    oracle数据库不安装客户端不行呀
      

  8.   

    a typical 3-tier app. Browser-Web Server-Database ServerYou should write server scripts such asp, jsp or php to access the database.
      

  9.   

    可直接用RDS,RDS是IE的内置组件,同时提供了两层和三层模型.当然你也可以自己写activeX,不过最好记得加个Implements IObjectSafetyTLB.IObjectSafety,空的也好
    另RDS不提供什么有用的出接口(事件),不过可在OBJECT元素中得到有用的事件对象
      

  10.   

    看看有没有用:ASP与ActiveX控件交互实战
    来源:未知  作者:未知  时间:2005-9-27 2:14:20  点击:291 
     
    ActiveX控件运行在客户端。我们可以获得客户端的一些信息,如IC卡的信息,客户端的验证等等。但是ActiveX控件也有许多缺点:客户端的部署很困难,如客户端不能正确下载,下载了以后不能正确执行,下载的时候需要设置IE的安全级别等等。 更多的时候,我都在使用COM组件来扩展ASP的功能。准确地说,是服务端运行的Activex Dll组件。使用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控件接口向导…,菜单->外接程序->外接程序管理器->VB 6 ActiveX控件接口向导。确定即可。 打开ActiveX控件接口向导,下一步,对于可用名称和选定名称我们默认下一步,新建自定义成员,GetInfo类型:属性,下一步,共有方法中选择我们刚才添加的GetInfo,映射到控件选择TxtInfo,成员选择Text,下一步直到完成。代码窗口中会生成一些我们不需要的,删除,剩下的代码如下: Option Explicit 
    '注意!不要删除或修改下列被注释的行! 
    'MappingInfo=txtinfo,txtinfo,-1,Text 
    Public Property Get GetInfo() As String 
    GetInfo = txtinfo.Text 
    End Property 
    Public Property Let GetInfo(ByVal New_GetInfo As String) 
    txtinfo.Text() = New_GetInfo 
    PropertyChanged "GetInfo" 
    End Property 
    '从存贮器中加载属性值 
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag) 
    txtinfo.Text = PropBag.ReadProperty("GetInfo", "Text1") 
    End Sub 
    '将属性值写到存储器 
    Private Sub UserControl_WriteProperties(PropBag As PropertyBag) 
    Call PropBag.WriteProperty("GetInfo", txtinfo.Text, "Text1") 
    End Sub 
    OK,好了,我们编译成fOcx.ocx文件,然后F5直接运行,VB会打开一个测试页。如下: 
    E:\Program Files\Microsoft Visual Studio\VB98\UC1.html 
    同时,打开你的IE浏览器,看到了吧,你做的控件出现在了这个测试页中。 
    你可以打开测试页,可以看到ClsID,比如:890D1028-298B-45CF-9A64-6ED5A5BACBC9 因为VB编译的时候已经完成注册.所以无法模拟客户端没有安装该控件时出现的提示. 我们继续 使用regsvr32 F:\csdn_vb\com+_activeX\sample1\fOcx.ocx –u卸载 
    或者 打开注册表,在HKEY_CLASSES_ROOT\CLSID下面找到 890D1028-298B-45CF-9A64-6ED5A5BACBC9项,删除之,当然这种方式还有项存在而没有删除干净. 
    此时浏览http://yang/uc1.htm,由于IE中ActiveX设置为启动,所以,控件会显示出来。 下载后的ocx到哪里去了??? 
    打开该目录(可能有所不同)E:\WINDOWS.0\Downloaded Program Files,看到了吧,fOcx.UC1文件在这个目录下. 
    原理:客户端下载该控件后,自动注册,然后放在上述这个目录下.这时我们可以打开注册表看看CLSID,呵呵,还是以前的那个. 
    我们可以右键看看fOcx.UC1的属性,看看相关内容,这里显示了该OCX所依赖的所有文件.所以,你的OCX尽量减少使用高级控件或者第三方的控件,否则,下载就有些问题了. 
    如果IE中关于ActiveX的选项设为禁用,那么浏览器就会出现对话框”当前安全设置禁止运行该页中的ActiveX控件.因此可能无法正确显示该页”,这个就需要其他的方式来处理了。 一般用户默认的都是禁用ActiveX选项,所以让用户自己设置不太合适。我们来看看如何从服务端获取数据,传递到ActiveX控件中。 1) 初始化时使用参数绑定 
    2) 运行时得到数据 
      

  11.   

    接上:打开vb6,新建ActiveX控件工程。 
    工程名:fOcx,用户控件名:UC2 
    为了方便,我们使用ActiveX控件接口向导…,菜单->外接程序->外接程序管理器->VB 6 ActiveX控件接口向导。确定即可。 打开ActiveX控件接口向导,下一步,对于可用名称和选定名称我们默认下一步,新建自定义成员,GetInfo类型:属性,下一步,共有方法中选择我们刚才添加的GetInfo,映射到控件选择TxtInfo,成员选择Text,下一步直到完成。代码窗口中会生成一些我们不需要的,删除, 
    '注意!不要删除或修改下列被注释的行! 
    'MappingInfo=txtinfo,txtinfo,-1,Text 
    Public Property Get GetInfo() As String 
    GetInfo = txtinfo.Text 
    End Property 
    Public Property Let GetInfo(ByVal New_GetInfo As String) 
    txtinfo.Text() = New_GetInfo 
    PropertyChanged "GetInfo" 
    End Property 
    Private Sub Command1_Click() 
    Label2.Caption = GetInfo() 
    End Sub 
    '从存贮器中加载属性值 
    Private Sub UserControl_ReadProperties(PropBag As PropertyBag) 
    txtinfo.Text = PropBag.ReadProperty("GetInfo", "Text1") 
    End Sub 
    '将属性值写到存储器 
    Private Sub UserControl_WriteProperties(PropBag As PropertyBag) 
    Call PropBag.WriteProperty("GetInfo", txtinfo.Text, "Text1") 
    End Sub 
    编译成OCX控件.运行生成的测试页.Text中默认的是Text1 如何将服务器端的数据传递给OCX呢? 使用Microsoft ActiveX Control Pad这个工具,可以很容易找到. 直接用这个工具把测试页打开. 菜单->Edit->Edit Activex Control,呵呵,打开了一个可视化的界面. 
    看到了吧,有一个属性框,我们可以进行设置,设置完成以后的代码如下: <HTML> 
    <HEAD> 
    <TITLE>New Page</TITLE> 
    </HEAD> 
    <BODY> <OBJECT ID="GetClient" WIDTH=507 HEIGHT=440 CLASSID="CLSID:890D1028-298B-45CF-9A64-6ED5A5BACBC9" CODEBASE="http://localhost/xml/fOcx.ocx"> 
    <PARAM NAME="_ExtentX" VALUE="13414"> 
    <PARAM NAME="_ExtentY" VALUE="11642"> 
    <PARAM NAME="GetInfo" VALUE="这是ocx得到的客户端读卡器的信息"> 
    </OBJECT> </BODY> 
    </HTML> 增加了ID,ID就是我们用来访问的标志.还有我们的属性GetInfo,我们也设定初始值了 好了,运行. Text中就出现了我们设定的值”这是ocx得到的客户端读卡器的信息” 我们把上边的页面改成asp的,看代码: 
    <HTML> 
    <HEAD> 
    <TITLE>龙卷风测试页</TITLE> 
    </HEAD> <BODY> 
    <% 
    dim sValue 
    sValue="这是ocx得到的客户端读卡器的信息" 
    %> <OBJECT ID="GetClient" WIDTH=507 HEIGHT=440 CLASSID="CLSID:56DFCA88-F5B8-4879-853B-97FE504423FD" CODEBASE="http://localhost/xml/fOcx.ocx"> 
    <PARAM NAME="_ExtentX" VALUE="13414"> 
    <PARAM NAME="_ExtentY" VALUE="11642"> 
    <PARAM NAME="GetInfo" VALUE="<%=sValue%>"> 
    </OBJECT> </BODY> 
    </HTML> OK,运行即可 
    我们看看第二种情况 
    运行时得到数据 
    <HTML> 
    <HEAD> 
    <TITLE>龙卷风测试页</TITLE> 
    <% 
    dim sValue 
    sValue="这是ocx得到的客户端读卡器的信息" 
    %> 
    <SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript> 
    <!-- 
    function button1_onclick() 

    GetClient.GetInfo='<%=sValue%>'; 

    //--> 
    </SCRIPT> 
    </HEAD> <BODY> <OBJECT ID="GetClient" WIDTH=507 HEIGHT=440 CLASSID="CLSID:56DFCA88-F5B8-4879-853B-97FE504423FD" CODEBASE="http://localhost/xml/fOcx.ocx"> 
    <PARAM NAME="_ExtentX" VALUE="13414"> 
    <PARAM NAME="_ExtentY" VALUE="11642"> 
    </OBJECT> 
    <INPUT id=button1 type=button value=Button name=button1 LANGUAGE=javascript onclick="return button1_onclick()"> 
    </BODY> 
    </HTML> 
    运行后,点击按钮即可看到效果. 问题提出: ActiveX控件得到客户端的信息,如何传递到服务端??? 一种方法就是得到值后,使用Get,Post方式提交,这可能也是最常用的. 
    有没有更好一些的方法呢? 能不能在控件中直接向服务器发出请求而得到数据呢? 打开vb6,新建ActiveX控件工程。 
    工程名:fOcx,用户控件名:UC3 
    添加1个按钮,2个文本框 
    代码如下: 
    Option Explicit 
    Private Sub Command1_Click() 
    '注意字符串和数字的写法有些区别 
    '使用AsyncRead通过HTTP发送你的请求 
    UserControl.AsyncRead "http://yang/xml/activex.asp?s1=" &am ... nbsp;& "", vbAsyncTypeByteArray 
    UserControl.AsyncRead "http://yang/xml/activex.asp?s1=" & Text1.Text, vbAsyncTypeByteArray 
    End Sub 'AsyncReadComplete 事件用来从asp页面接受和分析。 
    '当容器刚完成一个异步读取请求时 , 发生该事件? 
    'AsyncProp 中的数值指定了已完成的某个异步数据读取请求, 
    '它与前一个 AsyncRead 方法调用中的数据匹配。 
    'AsyncReadComplete 事件过程中应包含错误处理代码,因为错误状态会终止下载。 
    '如果发生了这种情况,当访问 AsyncProperty 对象的 Value 属性时将会发生错误。 
    Private Sub UserControl_AsyncReadComplete(AsyncProp As AsyncProperty) 
    On Error GoTo errhandle 
    Text2.Text = ByteArrayToString(AsyncProp.Value) 
    errhandle: 
    Err.Raise 601, "异步读取发生了错误", Err.Description 
    End Sub '将字节数组转换成字符串 
    Public Function ByteArrayToString(bytArray() As Byte) As String 
    Dim sAns As String 
    sAns = StrConv(bytArray, vbUnicode) 
    ByteArrayToString = sAns 
    End Function 
    我们来看看http://yang/xml/activex.asp这个文件 
    <% 
    dim str 
    str=request("s1") 
    if str="name" then 
    response.write ("龙卷风") 
    elseif str="age" then 
    response.write ("26") 
    else 
    response.write ("没有可用信息返回") 
    end if 
    %> 很简单,使用request接受参数,response返回。 
    这个例子可以进一步处理,将服务器名以属性的方式传递给控件。 
    比如:<PARAM NAME="ServerName" VALUE="192.168.0.1 "> 
    然后在程序中得到,就可以使用了,如: UserControl.AsyncRead "http://192.168.0.1/xml/activex.asp?s1="  ... t & "", vbAsyncTypeByteArray 
    然后在程序中得到就可以灵活处理了。
      

  12.   

    activeX 调用 web service 跟C/S下调用 web service 是一样的。
    如果你程序运行在局域网内,甚至可以用c/s程序一样的代码用ADO直接访问数据库。