Asp.net中开发使用ActiveX控件

           最近应该在一个项目中要限制客户登陆的场地,为此要开发一个ActiveX控件。由于也是第一次在网页中使用ActiveX控件,找了不少资料,不过最终还是完满的把问题解决了。现在在网页中使用AcitiveX控件的还是比较少,应该ActiveX控件对于客户来说存在安全上的问题,一般很难让客户接受同时加之一些浏览器会自动限制,要开发一个能够让客户端能够自动安装使用的AcitiveX控件起码的做两件事:一在代码中将控件注册为安全控件,二为控件加入数字签名还得受信用才行。我开发的这个控件基本上实现了,这个两项只是在数字签名上只是用工具加入一个数字签名,但还是没能使它受信用.下面来讲讲我这个ActiveX控件的实现过程吧:

一 使控件实现 IObjectSafety 接口

   1. 从 Visual Basic 6.0 光盘获取 OLE 自动化类型库生成器。 要这样做, 将所有四个文件从 \Common\Tools\VB\Unsupprt\Typlib\ 文件夹复制到项目文件夹。 注意 : VIsual Basic 5.0 中 \VB5.0\Tools\Unsupprt\Typlib\ 文件夹中复制所有文件。

  2. 将以下文本复制到记事本, 并作为 Objsafe.odl 项目文件夹以保存文件:      [

          uuid(C67830E0-D11D-11cf-BD80-00AA00575603),

          helpstring("VB IObjectSafety Interface"),
      version(1.0)     ]
      library IObjectSafetyTLB
      {
          importlib("stdole2.tlb");
          [
              uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
              helpstring("IObjectSafety Interface"),
              odl
          ]
          interface IObjectSafety:IUnknown {
              [helpstring("GetInterfaceSafetyOptions")]
           HRESULT GetInterfaceSafetyOptions(
                    [in] long riid,
                       [in] long *pdwSupportedOptions,
                        [in] long *pdwEnabledOptions);
               [helpstring("SetInterfaceSafetyOptions")]
             HRESULT SetInterfaceSafetyOptions(
                        [in] long riid,
                        [in] long dwOptionsSetMask,
                        [in] long dwEnabledOptions);}}

       3. 创建可保存所有文件, 本示例中创建新文件夹。

      4. 从 Visual Basic 6.0 光盘获取 OLE 自动化类型库生成器。 要这样做, 将所有四个文件从\Common\Tools\VB\Unsupprt\Typlib\ 文件夹复制到项目文件夹。 注意 : VIsual Basic 6.0 中 \VB6.0\Tools\Unsupprt\Typlib\ 文件夹中复制所有文件。
3. 将以下文本复制到记事本, 并作为 Objsafe.odl 项目文件夹以保存文件:    
[
          uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
          helpstring("VB IObjectSafety Interface"),
          version(1.0)
      ]
      library IObjectSafetyTLB
      {
          importlib("stdole2.tlb");
          [
              uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
              helpstring("IObjectSafety Interface"),
           odl
       ]
          interface IObjectSafety:IUnknown {
              [helpstring("GetInterfaceSafetyOptions")]
              HRESULT GetInterfaceSafetyOptions(
                        [in] long riid,
                        [in] long *pdwSupportedOptions,
                        [in] long *pdwEnabledOptions);
              [helpstring("SetInterfaceSafetyOptions")]
              HRESULT SetInterfaceSafetyOptions(
                       [in] long riid,
                        [in] long dwOptionsSetMask,
                        [in] long dwEnabledOptions);
           }}

    4. 在命令提示符处, 使用 CD < 路径 > 命令移到项目文件夹, 然后键入以下命令以生成 .tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
5. 从vb中新建ActiveX控件项目
6. 在 项目 菜单上, 单击 引用 , 浏览并添加 Objsafe.tlb, 它前面创建。
7. 向使用以下代码, 项目添加一个新模块并命名模块 basSafeCtl:      

ContractedBlock.gif ExpandedBlockStart.gif Model Code
None.gifOption Explicit
None.gif
None.gif      
Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
None.gif      
Public Const IID_IPersistStorage = _
None.gif        
"{0000010A-0000-0000-C000-000000000046}"
None.gif      
Public Const IID_IPersistStream = _
None.gif        
"{00000109-0000-0000-C000-000000000046}"
None.gif      
Public Const IID_IPersistPropertyBag = _
None.gif        
"{37D84F60-42CB-11CE-8135-00AA004BB851}"
None.gif
None.gif      
Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
None.gif      
Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
None.gif      
Public Const E_NOINTERFACE = &H80004002
None.gif      
Public Const E_FAIL = &H80004005
None.gif      
Public Const MAX_GUIDLEN = 40
None.gif
ExpandedBlockStart.gifContractedBlock.gif      
Public Declare Sub CopyMemory()Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
InBlock.gif         (pDest 
As Any, pSource As Any, ByVal ByteLen As Long)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Public Declare Function StringFromGUID2()Function StringFromGUID2 Lib "ole32.dll" (rguid As _
InBlock.gif         Any, 
ByVal lpstrClsId As LongByVal cbMax As IntegerAs Long
InBlock.gif
InBlock.gif      
Public Type udtGUID
InBlock.gif          Data1 
As Long
InBlock.gif          Data2 
As Integer
InBlock.gif          Data3 
As Integer
InBlock.gif          Data4(
7As Byte
InBlock.gif      
End Type
InBlock.gif
InBlock.gif      
Public m_fSafeForScripting As Boolean
InBlock.gif      
Public m_fSafeForInitializing As Boolean
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif      
Sub Main()Sub Main()
InBlock.gif          m_fSafeForScripting 
= True
InBlock.gif          m_fSafeForInitializing 
= True
ExpandedSubBlockEnd.gif      
End Sub


8.从 ProjectProperties@@, Startup 对象更改到要执行上述 SubMain SubMain 。 使用 m_fSafeForScripting 和 m_fSafeForInitializing 变量来指定安全执行脚本和/或初始化变量的值。
9.打开控件的代码窗口。 将下列行的代码添加到声明部分 (OptionExplicit 后或作为第):Implements IObjectSafety
10.新建一个模块复制下面两个过程到模块

ContractedBlock.gif ExpandedBlockStart.gif Two Function
ExpandedBlockStart.gifContractedBlock.gifPrivate Sub IObjectSafety_GetInterfaceSafetyOptions()Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
InBlock.gif      
Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)
InBlock.gif
InBlock.gif          
Dim Rc      As Long
InBlock.gif          
Dim rClsId  As udtGUID
InBlock.gif          
Dim IID     As String
InBlock.gif          
Dim bIID()  As Byte
InBlock.gif
InBlock.gif          pdwSupportedOptions 
= INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
InBlock.gif                                INTERFACESAFE_FOR_UNTRUSTED_DATA
InBlock.gif
InBlock.gif          
If (riid <> 0Then
InBlock.gif              CopyMemory rClsId, 
ByVal riid, Len(rClsId)
InBlock.gif
InBlock.gif              bIID 
= String$(MAX_GUIDLEN, 0)
InBlock.gif              Rc 
= StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
InBlock.gif              Rc 
= InStr(1, bIID, vbNullChar) - 1
InBlock.gif              IID 
= Left$(UCase(bIID), Rc)
InBlock.gif
InBlock.gif              
Select Case IID
InBlock.gif                  
Case IID_IDispatch
InBlock.gif                      pdwEnabledOptions 
= IIf(m_fSafeForScripting, _
InBlock.gif                    INTERFACESAFE_FOR_UNTRUSTED_CALLER, 
0)
InBlock.gif                      
Exit Sub
InBlock.gif                  
Case IID_IPersistStorage, IID_IPersistStream, _
InBlock.gif                     IID_IPersistPropertyBag
InBlock.gif                      pdwEnabledOptions 
= IIf(m_fSafeForInitializing, _
InBlock.gif                    INTERFACESAFE_FOR_UNTRUSTED_DATA, 
0)
InBlock.gif                      
Exit Sub
InBlock.gif                  
Case Else
InBlock.gif                      Err.Raise E_NOINTERFACE
InBlock.gif                      
Exit Sub
InBlock.gif              
End Select
InBlock.gif          
End If
ExpandedBlockEnd.gif      
End Sub

None.gif
ExpandedBlockStart.gifContractedBlock.gif      
Private Sub IObjectSafety_SetInterfaceSafetyOptions()Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
InBlock.gif      
LongByVal dwOptionsSetMask As LongByVal dwEnabledOptions As Long)
InBlock.gif          
Dim Rc          As Long
InBlock.gif          
Dim rClsId      As udtGUID
InBlock.gif          
Dim IID         As String
InBlock.gif          
Dim bIID()      As Byte
InBlock.gif
InBlock.gif          
If (riid <> 0Then
InBlock.gif              CopyMemory rClsId, 
ByVal riid, Len(rClsId)
InBlock.gif
InBlock.gif              bIID 
= String$(MAX_GUIDLEN, 0)
InBlock.gif              Rc 
= StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)
InBlock.gif              Rc 
= InStr(1, bIID, vbNullChar) - 1
InBlock.gif              IID 
= Left$(UCase(bIID), Rc)
InBlock.gif
InBlock.gif              
Select Case IID
InBlock.gif                  
Case IID_IDispatch
InBlock.gif                      
If ((dwEnabledOptions And dwOptionsSetMask) <> _
InBlock.gif                   INTERFACESAFE_FOR_UNTRUSTED_CALLER) 
Then
InBlock.gif                          Err.Raise E_FAIL
InBlock.gif                          
Exit Sub
InBlock.gif                      
Else
InBlock.gif                          
If Not m_fSafeForScripting Then
InBlock.gif                              Err.Raise E_FAIL
InBlock.gif                          
End If
InBlock.gif                          
Exit Sub
InBlock.gif                      
End If
InBlock.gif
Case IID_IPersistStorage, IID_IPersistStream, _
InBlock.gif                IID_IPersistPropertyBag
InBlock.gif                      
If ((dwEnabledOptions And dwOptionsSetMask) <> _
InBlock.gif                    INTERFACESAFE_FOR_UNTRUSTED_DATA) 
Then
InBlock.gif                          Err.Raise E_FAIL
InBlock.gif                          
Exit Sub
InBlock.gif                      
Else
InBlock.gif                          
If Not m_fSafeForInitializing Then
InBlock.gif                              Err.Raise E_FAIL
InBlock.gif                          
End If
InBlock.gif                          
Exit Sub
InBlock.gif                      
End If
InBlock.gif
InBlock.gif                  
Case Else
InBlock.gif                      Err.Raise E_NOINTERFACE
InBlock.gif                      
Exit Sub
InBlock.gif              
End Select
InBlock.gif          
End If
ExpandedBlockEnd.gif      
End Sub


11在 文件 菜单上, 保存您的项目和文件。 生成 OCX 文件从项目。 现在您控件实现 IObjectSafety 接口。
到此为止你已实现了一个标记为安全控件的ActiveX控件,你可以试试没有实现IObjectSafety 接口的控件的差别。

二.为控件加入数字签名,要加入数字签名你需要一下工具: 

1使用makecert.exe创建私钥和证书

 格式:makecert –sv YourPrivateName.pvk -ss Yourname –n “CN-YourName” YourCerName.cer执行命令将生产两个文件私钥YourPrivateName.pvk和证书:YourCerName.cer。

2使用signcode.exe将证书附件到ActiveX控件中(如果你在网页中是控件打包成cab,你也可以直接将证书附件到安装包上),运行后会有一个可视化的界面让你选择要控件和证书和私钥。

这样就完成了数字签名。

三在网页中加入ActiveX控件

<OBJECT

CLASSID="CLSID:DEE4306A-8D4A-4070-B1E6-EB08516101C0"

CODEBASE="YourActiveX.ocx#version=1,0,0,0" id="ScNO" name ="ScNO" height="15px" width="25px">

</OBJECT>

4306A-8D4A-4070-B1E6-EB08516101C0"

CODEBASE="YourActiveX.ocx#version=1,0,0,0" id="ScNO" name ="ScNO" height="15px" width="25px">

</OBJECT>

DEE4306A-8D4A-4070-B1E6-EB08516101C0为你控件在注册表中的CLSID值:当你用vb编译是自动注册到注册表中了你可以HKEY_CLASSES_ROOT查找,CODEBASE放的是你要被客户下载的控件路径和版本,当客户端的控件版本和这个不同是就会让客户安装。

调用控件中的方法:

 <script language="javascript" type="text/javascript">

function GetDeriveID()

 {

  try

  {

  var Ctrl=document.getElementById ("ScNO");

  if(Ctrl!=null)

  {

   var Msg=Ctrl.GetYourFun();

   alert("调用成功");

  }

  else

  {

   alert("调用失败");

   }

</script>

到现在为止你已可以发布你的网页了让在客户端试试会不会自动安装,如果没有客户端没有限制那么就能自动安装。如果万一不能自动安装你还可以写个程序让客户下载安装,我是写了一个批处理程序,来注册控件的。很简单:

注册:

@echo off

"regsvr32" " YourActiveX.ocx"

取消注册:

@echo off

"regsvr32" "-u" "SMCActX.ocx"

 

大家如果在开发中要用户ActiveX控件不妨参考一下,可省去不少弯路。

转载于:https://www.cnblogs.com/ruinet/archive/2007/08/18/860450.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值