您的位置 首页 > 雕刻工具

activex 如何写ActiveX控件

大家好,感谢邀请,今天来为大家分享一下activex的问题,以及和如何写ActiveX控件的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

这里的项目项目名称为:TestActiveX

在用户控件放置button并创建单击事件

ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]\n[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]\npublicinterfaceIObjectSafety\n{\n[PreserveSig]\nintGetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]refintpdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]refintpdwEnabledOptions);\n\n[PreserveSig()]\nintSetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]intdwOptionSetMask,[MarshalAs(UnmanagedType.U4)]intdwEnabledOptions);\n}4.将下面的代码,粘贴在控件类中

#regionIObjectSafety接口成员实现(直接拷贝即可)\n\nprivateconststring_IID_IDispatch="{00020400-0000-0000-C000-000000000046}";\nprivateconststring_IID_IDispatchEx="{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";\nprivateconststring_IID_IPersistStorage="{0000010A-0000-0000-C000-000000000046}";\nprivateconststring_IID_IPersistStream="{00000109-0000-0000-C000-000000000046}";\nprivateconststring_IID_IPersistPropertyBag="{37D84F60-42CB-11CE-8135-00AA004BB851}";\n\nprivateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=0x00000001;\nprivateconstintINTERFACESAFE_FOR_UNTRUSTED_DATA=0x00000002;\nprivateconstintS_OK=0;\nprivateconstintE_FAIL=unchecked((int)0x80004005);\nprivateconstintE_NOINTERFACE=unchecked((int)0x80004002);\n\nprivatebool_fSafeForScripting=true;\nprivatebool_fSafeForInitializing=true;\n\npublicintGetInterfaceSafetyOptions(refGuidriid,refintpdwSupportedOptions,refintpdwEnabledOptions)\n{\nintRslt=E_FAIL;\n\nstringstrGUID=riid.ToString("B");\npdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;\nswitch(strGUID)\n{\ncase_IID_IDispatch:\ncase_IID_IDispatchEx:\nRslt=S_OK;\npdwEnabledOptions=0;\nif(_fSafeForScripting==true)\npdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;\nbreak;\ncase_IID_IPersistStorage:\ncase_IID_IPersistStream:\ncase_IID_IPersistPropertyBag:\nRslt=S_OK;\npdwEnabledOptions=0;\nif(_fSafeForInitializing==true)\npdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;\nbreak;\ndefault:\nRslt=E_NOINTERFACE;\nbreak;\n}\n\nreturnRslt;\n}\n\npublicintSetInterfaceSafetyOptions(refGuidriid,intdwOptionSetMask,intdwEnabledOptions)\n{\nintRslt=E_FAIL;\nstringstrGUID=riid.ToString("B");\nswitch(strGUID)\n{\ncase_IID_IDispatch:\ncase_IID_IDispatchEx:\nif(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&&(_fSafeForScripting==true))\nRslt=S_OK;\nbreak;\ncase_IID_IPersistStorage:\ncase_IID_IPersistStream:\ncase_IID_IPersistPropertyBag:\nif(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&&(_fSafeForInitializing==true))\nRslt=S_OK;\nbreak;\ndefault:\nRslt=E_NOINTERFACE;\nbreak;\n}\n\nreturnRslt;\n}\n\n#endregion5.在控件类,加上Guid特性,生成一个guid,这个在web页面使用的(切记)

[Guid("4a202141-e8fc-42c8-b061-5d2c5f5cd35d")]//记住这个Guid在页面上使用,要用这个\npublicpartialclassUserControl1:UserControl,IObjectSafety\n{\n//此处省略若干代码和事件代码\n}6.设置程序集信息和注册com互操作

在项目属性,应用程序->程序集信息

在项目属性,生成->为com互操作注册

在这之前,需要将Activex控件打包成应用程序,如果是vs2017的话,默认没有打包工具,在vs2017的应用商店中安装,搜索关键字Installer即可.

<!DOCTYPEhtml>\n<html>\n<head>\n<metacharset="utf-8"/>\n<title>测试Activex控件</title>\n</head>\n<body>\n\n<!--控件id为clsid:后跟我们在控件类使用的guid,一定要一致,是因为要通过这个guid查找注册表,最终定位控件动态库-->\n<objectid="TestActiveX"classid="clsid:4a202141-e8fc-42c8-b061-5d2c5f5cd35d"width="400"height="100">\n</object>\n\n</body>\n</html>

看测试结果:

最重要的一步在AssemblyInfo.cs文件,添加以下代码

//一定要加的\n[assembly:AllowPartiallyTrustedCallers()]进入真正的主题,因为上面都是准备工作的

1.在控件类,添加该函数

///<summary>\n///公开调用,该函数要public去修饰,其他和正常函数一样\n///</summary>\n///<paramname="txt">文本参数</param>\n///<returns>返回调用结果</returns>\npublicstringTestActiveXMethod(stringtxt)\n{\nreturn$"hello{txt}";\n}

2.在页面上调用公开的csharp函数

<!DOCTYPEhtml>\n<html>\n<head>\n<metacharset="utf-8"/>\n<title>测试Activex控件</title>\n</head>\n<body>\n\n<!--控件id为clsid:后跟我们在控件类使用的guid,一定要一致,是因为要通过这个guid查找注册表,最终定位控件动态库-->\n<!--这个时候,已经不需要显示控件了-->\n<objectid="TestActiveX"classid="clsid:4a202141-e8fc-42c8-b061-5d2c5f5cd35d"width="0"height="0"></object>\n<inputtype="text"id="txtUserName"/>\n<inputtype="button"id="btnCallActiveX"value="调用Activex控件中的函数"/>\n<script>\nvarbtnCallActiveX=document.getElementById('btnCallActiveX');\nvartxtUserName=document.getElementById('txtUserName');\nbtnCallActiveX.onclick=function(){\n//调用ActiveX控件,控件id后跟控件公开的函数\nvarcallResult=TestActiveX.TestActiveXMethod(txtUserName.value);\nalert(callResult);\n};\n</script>\n\n</body>\n</html>

调用结果:

ActiveX调用公开的函数,进行和csharp交互操作

由于是迁移的文章,Activex现在用的比较少了,在特定的行业中还是有使用的,比如医疗行业软件,不过使用的是越来越少.

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023