[转载] – 用C#编写ActiveX控件 自定义html控件 ActiveX 控件注册


是本控件开发完成后的一个简单应用。我可以利用它以本地文件夹为单批量更新服器的文件。多线程文件传实现

最近做一个Web目,需要自己写一个ActiveX控件ActiveX控件大多是使用C++开发的,而我并不熟悉,因此考使用熟悉的C#ActiveX控件 ActiveX 控件注册

  首先,建立一个Windows控件 My_HtmlControl,并拖入一个textBox控件,此时编译项目,可以生成My_HtmlControl.dll。将此dllIIS的虚根目下,然后建立一个aa.htm的文件,html如下:
<body>
<object classid=”
http://localhost/My_HtmlControl.dll#My_HtmlControl.UserControl1” Width=”184″ Height=”96″>
</object>
</body>

IE地址入以下地址:http://localhost/aa.htm,出界面:可textBox控件文本框 控件已成功在面上示了。OK,我完成了第一

  但是问题没有解决。不相信?你可以试试在另外一台机器上测试,注意需要修改对应htmlURL地址。你可以看到个在原来示控件的地方是一个色的叉,或者出一个对话框,表示个控件没有任何限。出现这果是微的默认设置造成的,作者必在控件所在的控件的 AssemblyInfo.cs/vb 行一个安全声明,声明个控件必使用予的限,才可以示出界面。
AssemblyInfo.csusing System.Security;命名空,并添加一句:
[assembly : AllowPartiallyTrustedCallers()]

  在重新编译,并且替以前的dll,界面又可以示出来了。

  需要提醒的是,到止,我们编写的不是真正的ActiveX控件。个控件到止,只是能够实现自身的示,并且不能实现更多的功能,比如实现与脚本的交互或者操作客端的注册表或者磁是由于.Net Framework的安全模型所限制的。如果我希望个控件突破.Net Framework安全模型的限制,实现与脚本的交互或者操作客端的注册表或者磁,必它成真正的ActiveX控件。下面,我才的控件成真正的ActiveX控件。

  首先使用 工具GUID 生成一个GUID

并修改UserControl1.cs文件。首先using System.Runtime.InteropServices;命名空,并在public class UserControl1 : System.Windows.Forms.UserControl前面加入一条类标记[Guid(“93210714-D354-4e64-96A7-2DA3BE0E16BC”)]

  注意Guid中的字符串,就是你生成的Guid字符串。它是你所生成的ActiveX控件的唯一标识。然后修改目属性,打开项目属性面板->配置属性->生成,将最后一Com Interop注册,我唯一需要修改的是将其True

 重新编译。我使用 工具OLE/COM看器 看,展.NET Category 找到My_HtmlControl.UserControl1  可以看到,我写的My_HtmlControl.UserControl1被正确识别为COM件。在,我可以像使用其它ActiveX控件一在网示了。在My_HtmlControl.UserControl1选择Copy HTML <object> Tag to Clipboard,可以将代拷入剪板。

  在,我改写aa.htmhtml如下:

<body>
<object id=”My_HtmlControl” classid=”clsid:93210714-D354-4E64-96A7-2DA3BE0E16BC”></object>
</body>

  使用IE看,我的控件又可以在网示了。不候它已不再是以前的.net WinForm控件了,而是真价ActiveX控件了。

  不ActiveX控件的任务还没有完成。我们还没有实现脚本互或者I/O,也没有实现ActiveX控件的自。下面尝试实现JS的交互:(UserControl1.cs中添加)
public void ShowMessage(string msg)
{
 if(msg != null)
 {
  MessageBox.Show(msg);
 }
}
重新编译 修改html:添加
<input type=”button” onclick=’My_HtmlControl.ShowMessage(‘Hello World!’)’ value=’Click’>

    访问html,就是提示不安全信息。
  单击确定之后,我们发现JS报错。根据提示,我判断可以通修改IE置使控件运行。打IE 工具->Internet选项->安全->本地Intranet->自定义级别->没有标记为安全的ActiveX控件行初始化和运行,将其值设为启用。我刷新面,于可以正确运行了。报错呢???

    是因实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件。
首先我自己用C#实现这个接口:(UserControl1.cs中添加)

public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TOD
添加 WebCamControl.GetInterfacceSafyOptions 实现
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}

public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TOD
添加 WebCamControl.SetInterfaceSafetyOptions 实现
}

标记Activex控件脚本安全1.Designing Secure ActiveX Controls,这种方法主要适用于ATL Activex控件,最好是用C++实现的,相

2.Marking Business Objects as Safe for Scripting,这种方法,非常简单了,只需要写入两个注册表就可以了,如下:

[HKEY_CLASSES_ROOTCLSID<MyActiveXGUID>Implemented
Categories{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
[HKEY_CLASSES_ROOTCLSID<MyActiveXGUID>Implemented
Categories{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

通常ActiveX控件在开发并注册后,一旦在网中运行,IE并不认为这是一个脚本安全的,会出一个IE提示窗口:

“An ActiveX control on this page might be unsafe to interact with other parts of the page.Do you want to allow this interaction?”

 重新编译,然后将IE里面的置改回来在注册表里添加如上两在,我们发现,和JS的交互已没有问题了。

  这样,一个最基本的ActiveX控件已写好了。你可以在个控件的基上增加任何你需要的功能。到里,写控件的任完成了,我的下一个目就是布它。

  首先,我建立一个windows安装目,在解决方案中添加新目【安装目】

,并将ActiveX控件的主出添加到出中

。然后,改ActiveX控件的主出文件,将其Register属性改vsdrpCOM.

动项目属性,将引程序更改 Web程序。很憾的是,在 Web程序 中的安装文件URL中必使用绝对路径,不能使用相路径。意味着生成安装程序的候就必确定路径,不是很方便。在示例中,我使用了localhost,在布中可以改为实际的域名。

   在我生成安装程序,并把相得程序拷到正确的目中(本例中网站目下的ActiveX文件中)。我可以直接Setup.Exe文件,以验证安装文件的正确性。在我的机器上正确行了,成功了!

<object id=”My_HtmlControl” classid=”clsid:93210714-D354-4E64-96A7-2DA3BE0E16BC” Width=”184″ Height=”96″ codebase=”ActiveX/Setup.Exe”>
</object>

codebase=”ActiveX/Setup.Exe”
  注意,我object中加入了codebase属性,就是制定的下控件的位置,可以使用相路径。忙,我们现不能正确面,因们还没有的控件名。名可以采用两方式,一是在上面生成安装程序的名,另一是使用sn.exe名。推荐大家使用后者,因可以提供更多选项。本人很,就不多写了,大家可以参考csdn上的文章《ActiveX》。先给给大家提个醒,在申请证书选择 级证书

检查ActiveXObject是否可用,然后引并安装,有朋友并安装,个人认为这种做法不太合适,ActiveX是存在风险的,所以我要重的知情哦。
var str1 = new Array();
try
{
var axObj=new ActiveXObject(“My_HtmlControl.UserControl1d”);
}catch(e){
str1.push(“<span class=”red”><a style=”color:#f00;” href=”/ActiveX/Setup.Exe”>
点此安装控件后刷新</a></span>”);
document.write(str1.join(“”));
}

alert(DetActiveX());
//
检测是否禁用ActiveX
function DetActiveX()
{
var kXmlHttp = null;   
try
{/*
非微IE支持的xmlhttp*/
if (typeof XMLHttpRequest != “undefined”)
{
   kXmlHttp = new XMLHttpRequest();
   return true;
}
else/*
IE支持的xmlhttp*/
{
   var MSie = [“MSXML2.XMLHttp.5.0″,”MSXML2.XMLHttp.4.0”,
      “MSXML2.XMLHttp.3.0″,”MSXML2.XMLHttp”,”Microsoft.XMLHttp”];
   for (i in MSie)
   {     
   kXmlHttp = new ActiveXObject(MSie[i]);
   return true;
   }
}
}catch(e){}

return false;
}

针对网友的要求,完善了一下本文的内容

如下在安装目上置即可,在安装注册该组件在注册表中的注册等操作!如下

安装程中的所有界面和安装流程控制都可以定了。有一点就是因ActiveX所有,安全认证关键。他和淘宝等网站上的插件是一的。如果想要被通用那需要认证。建立在信任基端安装应该是最简单的解决法。

 

[出处:http://apps.hi.baidu.com/share/detail/16906716]