实现vb activeX控件安全性(IE不提示安全问题) 继承IObjectSafety接口

前端之家收集整理的这篇文章主要介绍了实现vb activeX控件安全性(IE不提示安全问题) 继承IObjectSafety接口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文http://support.microsoft.com/kb/182598/zh-cn

从 Visual Basic 6.0 CD-ROM(安装目录) 中获取 OLE 自动化类型库生成器。若要执行此操作将所有四个文件从 /Common/Tools/VB/Unsupprt/Typlib/ 文件夹复制到您的项目文件夹中。

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

  1. [


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


  3. helpstring("VB IObjectSafety Interface"),


  4. version(1.0)


  5. ]


  6. library IObjectSafetyTLB


  7. {


  8. importlib("stdole2.tlb");


  9. [


  10. uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),


  11. helpstring("IObjectSafety Interface"),


  12. odl


  13. ]


  14. interface IObjectSafety:IUnknown {


  15. [helpstring("GetInterfaceSafetyOptions")]


  16. HRESULT GetInterfaceSafetyOptions(


  17. [in] long riid,


  18. [in] long *pdwSupportedOptions,


  19. [in] long *pdwEnabledOptions);





  20. [helpstring("SetInterfaceSafetyOptions")]


  21. HRESULT SetInterfaceSafetyOptions(


  22. [in] long riid,


  23. [in] long dwOptionsSetMask,


  24. [in] long dwEnabledOptions);


  25. }


  26. }











  27. 在命令提示符使用 CD <path>


  28. 将移动到项目文件夹,然后键入以下命令来生成.tlb 文件的命令:
MKTYPLIB objsafe.odl /tlb objsafe.tlb

利用tlb注册工具将文件注册

注册工具可以在http://download.csdn.net/source/2841891下载到

从 Visual Basic 创建 ActiveX 控件项目

项目 菜单上单击 引用 ,浏览到并添加 Objsafe.tlb,您早先创建的。

添加一个新的模块到您的项目与下面的代码并命名模块 basSafeCtl

  1. Option Explicit
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"
  8.  
  9.  
  10. Public Const IID_IPersistStorage = _
  11.  
  12.  
  13. "{0000010A-0000-0000-C000-000000000046}"
  14.  
  15.  
  16. Public Const IID_IPersistStream = _
  17.  
  18.  
  19. "{00000109-0000-0000-C000-000000000046}"
  20.  
  21.  
  22. Public Const IID_IPersistPropertyBag = _
  23.  
  24.  
  25. "{37D84F60-42CB-11CE-8135-00AA004BB851}"
  26.  
  27.  
  28.  
  29.  
  30.  
  31. Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1
  32.  
  33.  
  34. Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2
  35.  
  36.  
  37. Public Const E_NOINTERFACE = &H80004002
  38.  
  39.  
  40. Public Const E_FAIL = &H80004005
  41.  
  42.  
  43. Public Const MAX_GUIDLEN = 40
  44.  
  45.  
  46.  
  47.  
  48.  
  49. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  50.  
  51.  
  52. (pDest As Any,pSource As Any,ByVal ByteLen As Long)
  53.  
  54.  
  55. Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
  56.  
  57.  
  58. Any,ByVal lpstrClsId As Long,ByVal cbMax As Integer) As Long
  59.  
  60.  
  61.  
  62.  
  63.  
  64. Public Type udtGUID
  65.  
  66.  
  67. Data1 As Long
  68.  
  69.  
  70. Data2 As Integer
  71.  
  72.  
  73. Data3 As Integer
  74.  
  75.  
  76. Data4(7) As Byte
  77.  
  78.  
  79. End Type
  80.  
  81.  
  82.  
  83.  
  84.  
  85. Public m_fSafeForScripting As Boolean
  86.  
  87.  
  88. Public m_fSafeForInitializing As Boolean
  89.  
  90.  
  91.  
  92.  
  93.  
  94. Sub Main()
  95.  
  96.  
  97. m_fSafeForScripting = True
  98.  
  99.  
  100. m_fSafeForInitializing = True
  101.  
  102.  
  103. End Sub
  104.  
  105. 在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。
  106.  
  107.  
  108.  
  109. 打开您的控件的代码窗口。将下面的代码添加到声明部分中
  110.  
  111.  
  112.  
  113.  
  114.  
  115. Implements IObjectSafety
  116.  
  117.  
  118.  
  119.  
  120.  
  121. 将下面的两个过程复制到您的控件的代码
  122.  
  123.  
  124.  
  125.  
  126.  
  127. Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
  128.  
  129.  
  130. Long,pdwSupportedOptions As Long,pdwEnabledOptions As Long)
  131.  
  132.  
  133.  
  134.  
  135.  
  136. Dim Rc As Long
  137.  
  138.  
  139. Dim rClsId As udtGUID
  140.  
  141.  
  142. Dim IID As String
  143.  
  144.  
  145. Dim bIID() As Byte
  146.  
  147.  
  148.  
  149.  
  150.  
  151. pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
  152.  
  153.  
  154. INTERFACESAFE_FOR_UNTRUSTED_DATA
  155.  
  156.  
  157.  
  158.  
  159.  
  160. If (riid <> 0) Then
  161.  
  162.  
  163. CopyMemory rClsId,ByVal riid,Len(rClsId)
  164.  
  165.  
  166.  
  167.  
  168.  
  169. bIID = String$(MAX_GUIDLEN,0)
  170.  
  171.  
  172. Rc = StringFromGUID2(rClsId,VarPtr(bIID(0)),MAX_GUIDLEN)
  173.  
  174.  
  175. Rc = InStr(1,bIID,vbNullChar) - 1
  176.  
  177.  
  178. IID = Left$(UCase(bIID),Rc)
  179.  
  180.  
  181.  
  182.  
  183.  
  184. Select Case IID
  185.  
  186.  
  187. Case IID_IDispatch
  188.  
  189.  
  190. pdwEnabledOptions = IIf(m_fSafeForScripting,_
  191.  
  192.  
  193. INTERFACESAFE_FOR_UNTRUSTED_CALLER,0)
  194.  
  195.  
  196. Exit Sub
  197.  
  198.  
  199. Case IID_IPersistStorage,IID_IPersistStream,_
  200.  
  201.  
  202. IID_IPersistPropertyBag
  203.  
  204.  
  205. pdwEnabledOptions = IIf(m_fSafeForInitializing,_
  206.  
  207.  
  208. INTERFACESAFE_FOR_UNTRUSTED_DATA,0)
  209.  
  210.  
  211. Exit Sub
  212.  
  213.  
  214. Case Else
  215.  
  216.  
  217. Err.Raise E_NOINTERFACE
  218.  
  219.  
  220. Exit Sub
  221.  
  222.  
  223. End Select
  224.  
  225.  
  226. End If
  227.  
  228.  
  229. End Sub
  230.  
  231.  
  232.  
  233.  
  234.  
  235. Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
  236.  
  237.  
  238. Long,ByVal dwOptionsSetMask As Long,ByVal dwEnabledOptions As Long)
  239.  
  240.  
  241. Dim Rc As Long
  242.  
  243.  
  244. Dim rClsId As udtGUID
  245.  
  246.  
  247. Dim IID As String
  248.  
  249.  
  250. Dim bIID() As Byte
  251.  
  252.  
  253.  
  254.  
  255.  
  256. If (riid <> 0) Then
  257.  
  258.  
  259. CopyMemory rClsId,Rc)
  260.  
  261.  
  262.  
  263.  
  264.  
  265. Select Case IID
  266.  
  267.  
  268. Case IID_IDispatch
  269.  
  270.  
  271. If ((dwEnabledOptions And dwOptionsSetMask) <> _
  272.  
  273.  
  274. INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then
  275.  
  276.  
  277. Err.Raise E_FAIL
  278.  
  279.  
  280. Exit Sub
  281.  
  282.  
  283. Else
  284.  
  285.  
  286. If Not m_fSafeForScripting Then
  287.  
  288.  
  289. Err.Raise E_FAIL
  290.  
  291.  
  292. End If
  293.  
  294.  
  295. Exit Sub
  296.  
  297.  
  298. End If
  299.  
  300.  
  301.  
  302.  
  303.  
  304. Case IID_IPersistStorage,_
  305.  
  306.  
  307. IID_IPersistPropertyBag
  308.  
  309.  
  310. If ((dwEnabledOptions And dwOptionsSetMask) <> _
  311.  
  312.  
  313. INTERFACESAFE_FOR_UNTRUSTED_DATA) Then
  314.  
  315.  
  316. Err.Raise E_FAIL
  317.  
  318.  
  319. Exit Sub
  320.  
  321.  
  322. Else
  323.  
  324.  
  325. If Not m_fSafeForInitializing Then
  326.  
  327.  
  328. Err.Raise E_FAIL
  329.  
  330.  
  331. End If
  332.  
  333.  
  334. Exit Sub
  335.  
  336.  
  337. End If
  338.  
  339.  
  340.  
  341.  
  342.  
  343. Case Else
  344.  
  345.  
  346. Err.Raise E_NOINTERFACE
  347.  
  348.  
  349. Exit Sub
  350.  
  351.  
  352. End Select
  353.  
  354.  
  355. End If
  356.  
  357.  
  358. End Sub
  359.  
  360.  
  361.  
  362.  
  363. 生成.ocx控件,用web页面引用。控件与页面交互时IE不再提示安全问题。
  364.  
  365.  
  366.  

猜你在找的VB相关文章