随笔 - 49  文章 - 2  评论 - 426 

用C#编写ActiveX控件(一)


    前些日子做一个Web项目,必须自己编写一个ActiveX控件。如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件。

    首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图:

UserControl1.cs内容如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace HelloWorld
{
    
/// <summary>
    
/// UserControl1 的摘要说明。
    
/// </summary>

    public class Demo : System.Windows.Forms.UserControl
    
{
        
private System.Windows.Forms.Label label1;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
public Demo()
        
{
            
// 该调用是 Windows.Forms 窗体设计器所必需的。
            InitializeComponent();

            
// TODO: 在 InitComponent 调用后添加任何初始化

        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if( components != null )
                    components.Dispose();
            }

            
base.Dispose( disposing );
        }


        
组件设计器生成的代码
    }

}


    此时编译项目,可以生成HelloWorld.dll。将此dll拷贝到IIS的虚拟根目录下,然后建立一个helloworld.htm的文件,html代码如下:
<body bgcolor='#223344'>
<object id="helloworld" classid=’http://localhost/HelloWorld.dll#HelloWorld.Demo’ Width="184" Height="96" VIEWASTEXT> </object>
</body>
在IE地址栏中输入以下地址:http://localhost/helloworld.htm,出现界面:

如图,控件已经成功在页面上显示了。OK,我们已经完成了第一步。

    但是问题到这里还没有解决。不相信?你可以试试在另外一台机器上测试,注意需要修改对应的html代码和URL地址。你可以看到这个在原来显示控件的地方是一个红色的叉,或者还会弹出一个对话框,表示这个控件没有任何权限。出现这个结果是微软的默认设置造成的,作者必须在控件所在的控件的 AssemblyInfo.cs/vb 中执行一个安全声明,声明这个控件必须使用赋予的权限,才可以显示出界面。我们在AssemblyInfo.cs中引用System.Security命名空间,并添加一句:
[assembly : AllowPartiallyTrustedCallers()]
现在重新编译,并且替换以前的dll,界面又可以显示出来了。

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

    首先使用 工具—〉创建GUID 生成一个GUID,并修改UserControl1.cs文件。首先增加引用System.Runtime.InteropServices命名空间,并在Demo前面加入一条语句:

注意Guid中的字符串,就是你生成的Guid字符串。它是你所生成的ActiveX控件的唯一标识符。然后修改项目属性,如图:

注意面板中的最后一项,我们唯一需要修改的是将其值改为True。

    重新编译。我们使用 工具—〉OLE/COM对象查看器 查看,如图:

可以看到,我们写的HelloWorld.Demo已经被正确识别为COM组件。现在,我们已经可以像使用其它ActiveX控件一样在网页中显示了。在HelloWorld.Demo点击鼠标右键,如图:

选择Copy HTML <object> Tag to Clipboard,可以将代码拷入剪贴板。

现在,我们改写helloworld.htm,html代码如下:
<body bgcolor='#223344'>
<object id="helloworld"
   classid
="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" Width="184" Height="96">
</object>
</body>
使用IE查看,我们的控件又可以在网页中显示了。不过,这个时候它已经不再是以前的.net WinForm控件了,而是货真价实的ActiveX控件了。

    不过,编写ActiveX控件的任务还没有完成。我们还没有实现脚本互动或者读写I/O,也没有实现ActiveX控件的自动分发。在下一篇Blog中,我会完成ActiveX控件的编写。

    PS:这是我在博客园上的第一个Post,希望得到大家的支持。

红马天下 版权所有
博客:http://homer.cnblogs.com/
欢迎转载,但转载必须注明作者和出处。

posted on 2005-01-04 23:00 红马天下 阅读(43362) 评论(116)  编辑 收藏 所属分类: Asp.Net

  回复  引用  查看    
2005-01-04 23:11 | 洛特      
支持!接着写下去.建议把你的CSS换一下啊.这个黑黑的看不清.
等这个很久了呢..

  回复  引用  查看    
2005-01-05 00:20 | suyife      
支持作者。
  回复  引用  查看    
2005-01-05 08:13 | jhtchina      
支持作者,我才开始学习.
  回复  引用  查看    
2005-01-05 08:23 | xp      
不过,这个时候它已经不再是以前的.net WinForm控件了,而是货真价实的ActiveX控件了。

======================================
请问一下,客户端还要不要装.net framework啊?

  回复  引用  查看    
2005-01-05 09:44 | floerggyy      
客户端是需要装framework的,第一次看见在.net下写ActiveX组件,呵呵:)找这个很久了一直没有他细研究
  回复  引用  查看    
2005-01-05 09:59 | Lion      
不错
  回复  引用  查看    
2005-01-05 11:18 | 水云间      
太好了,终于找到了一些比较实际的,支持一下。
  回复  引用  查看    
2005-01-05 12:27 | arui      
新鲜 不错 支持 继续 呵呵
  回复  引用  查看    
2005-01-05 12:40 | 风之子      
Good,顶
  回复  引用  查看    
2005-01-05 13:03 | ww      
客户端要装framework的话,这样的控件有什么意义??
  回复  引用  查看    
2005-01-05 16:27 | scong      
简单明了,入门得好例子,继续:)
  回复  引用  查看    
2005-01-05 17:02 | lay      
客户端要装framework,那winform跟它有什么区别啊
  回复  引用  查看    
2005-01-06 09:30 | hello      
好啊,好啊。期待着!!谢了
  回复  引用  查看    
2005-01-06 13:42 | Xpc      
具有一定的研究意义,

没什么实用价值

  回复  引用  查看    
2005-01-06 16:53 | canny      
很有意义啊!!!我们的项目正好可以参考!!
  回复  引用  查看    
2005-01-18 15:05 | ares      
支持,等待发布篇,小弟现在正要学写这个!!!太感谢了
  回复  引用  查看    
2005-01-18 15:50 | ares      
首先使用 工具—〉创建GUID 生成一个GUID,并修改UserControl1.cs文件。首先增加引用System.Runtime.InteropServices命名空间,并在Demo前面加入一条语句:

请问生成GUID时,GUID的类型选什么?

  回复  引用  查看    
2005-01-22 05:41 | xxy      
好,支持!!!!
  回复  引用  查看    
2005-01-27 09:00 | jizhe@msn.com      
老大,颜色改一下吧,累眼!

我想用这个做个在线安装程序,好像msn or yahoo的在线安装!怎么样?

  回复  引用  查看    
2005-01-27 11:31 | lin      
你好:D 文章很好啊
不过有一个地方我不明白阿
工具—〉创建GUID 生成一个GUID
还有ole对象察看器,我都找不到阿
是vs2003 IDE 里的吗?
请告诉我哪能打开阿 ,谢谢!

  回复  引用  查看    
2005-01-28 11:35 | 红马天下      
To lin:

是的,vs2003 IDE附带的工具。

  回复  引用  查看    
2005-03-17 09:23 | 小斌      
你好:ActiveX控件,如何一次安裝後以後的運行都不要提示用戶

“這個畫面上某個ActiveX控制項與其他部分相互作用時可能會不安全。要允許相互作用?”

然後兩個按鈕 「是」 「否」

因為我要寫的程序如果老是這樣的話每次用戶刷新都要提示非常的煩。就像webpos的發票打印一樣,如果每一次交易都提示一次界面特別的不友好。能不能討論一下我的MSN: hunter_32252@hotmail.com QQ:
33890361

好,支持。

  回复  引用  查看    
2005-04-21 15:42 | szx      
超级不错的文章,长见识了,学到东西了
  回复  引用  查看    
2005-05-11 11:23 | jenie      
不得不说一句, 挺好,谢谢了, 不过不知道有没有关于vc++这样好的实例!·!!
  回复  引用  查看    
2005-05-18 16:02 | cc      
如果在客户端要装framework,那这个控件的适用范围太小了,能不能不装阿
  回复  引用  查看    
2005-06-14 10:51 | 学习的人      
很值得学习,不错
  回复  引用  查看    
2005-06-21 09:30 | Jason.NET      
作者有没有测试需不需要装Framework也可以跑啊?
如果要装Framework,那说到底还不是ActiveX,只是一个ActiveX的代理而以.最终的实现还是其于Framework.

如果客户端不需要装Framework,那可真是如获至宝啊

  回复  引用  查看    
2005-07-04 17:52 | 古月      
你好:D 文章很好啊
不过有一个地方我不明白阿
工具—〉创建GUID 生成一个GUID
还有ole对象察看器,我都找不到阿
是vs2003 IDE 里的吗?
请告诉我哪能打开阿 ,谢谢!


我也找了半天了,都找不到

  回复  引用  查看    
2005-07-04 17:57 | 古月      
首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图:
 那个图怎么是那样子的???

  
|

  
|

  
|

  
|

  
|

  
|

  回复  引用  查看    
2005-08-20 15:26 | sheepchang      
  
|

  
|

  
|

  
|

  回复  引用    
2005-10-19 13:03 | 花纯春[未注册用户]
写得太好了,
虽然有人提出,客户要装.net framework可是,在以后发布的OS中的自带有的,随着时间的推移,这不是问题,
期盼作者,能尽快写出下篇。

  回复  引用    
2005-10-19 13:04 | 花纯春[未注册用户]
支持,请写出下篇,谢谢。

好文章

  
|

  
|

  回复  引用  查看    
2005-10-28 17:07 | 吹雪      
我按lz的第一步来放一个Label的时候也遇到如下情况
# re: 用C#编写ActiveX控件(一)
做了N次都不是楼主那样的!
http://www.cnblogs.com/images/cnblogs_com/sheepchang/32749/r_error.JPG">http://www.cnblogs.com/images/cnblogs_com/sheepchang/32749/r_error.JPG
sheepchang 评论于 2005-08-20 15:26

不知道是什么原因造成的,难道是.net Framework版本问题?

  回复  引用  查看    
2005-11-02 16:01 | freeman      
吹雪:
问题主要处在 classid=’http://localhost/HelloWorld.dll#HelloWorld.Demo">http://localhost/HelloWorld.dll#HelloWorld.Demo’ 你需要在#号后面更改成你的项目名称和类名

  
|

  
|

  回复  引用    
2005-12-03 10:48 | 阿良[未注册用户]
楼主,你那个 OLE/COM Objects Viewer 在哪里启动的?
  
|

  回复  引用    
2006-02-27 14:22 | 12343456567aa[未注册用户]
很好的帖子。不过在vs2005开发环境下还需要做一点调整.应该把设置属性[ComVisible(true)]才能够注册
  
|

  回复  引用    
2006-03-23 11:29 | re[未注册用户]
ActiveX 现在已经过时了。
  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  回复  引用    
2006-11-06 13:12 | bluewater[未注册用户]
強人啊。頂。。。。。
  
|

  回复  引用    
2007-01-18 20:13 | Namebus[未注册用户]
http://www.openssl.com.cn/thread-101-1-1.html

这个论坛有提供免费的国际认证代码签名证书,可以很方便的用于ActiveX的数字签名,这样发布代码就变为可信了。

  
|

  
|

  
|

  
|

  
|

  
|

  回复  引用  查看    
2007-06-13 20:48 | ma.cnblogs.com      
基本我认为不包含可为 COM Interop 注册是不可能成功的,因为我试了N遍后,还是 不包含可为 COM Interop 注册的任何类型。
  
|

  
|

  
|

  
|

  
|

  
|

  回复  引用  查看    
2007-06-22 16:58 | 红马天下      
@tuonibao
你可以使用微软的工具tstcon32.exe在客户机上测试一下你的控件。这个工具在vs的安装目录里搜索。

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  
|

  回复  引用    
2007-11-01 11:03 | xq168[未注册用户]
我的在vs2005里面生成成功了!
下面是步骤!
http://www.xq168.cn/article.asp?id=221

  
|

  回复  引用  查看    
2007-12-13 15:34 | 马可香蕉      
我也正在找这方面的信息
  
|

  
|

  
|

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

官方网站 - http://***/yzm_advocr
识别效果怎么样一试就知道 - DEMO下载 http://***/yzm_advocr/advocr.rar

  回复  引用  查看    
2008-05-26 11:33 | 孤苏一叶      
按文档中的提示:
在AssemblyInfo.cs中引用System.Security命名空间,并添加一句:
[assembly : AllowPartiallyTrustedCallers()]

重新编译并且替换以前的.dll


在本机通过IP访问一切显示正常,在另一台测试上(安装过.net)仍然无法显示..仍然显示为红叉..请楼主回复.谢谢!是不是需要注册此组件?




  回复  引用  查看    
2008-06-23 08:59 | shunliy      
我的helloworld只显示了hellowor,另外当与客户端交互时提示对象不支持此方法或属性,期待解决。
  
|

  回复  引用  查看    
2008-12-27 18:40 | Bob&xiaobo.liu      
我也跟楼上的一样 一个白色的框体 应该是没有正常显示 看有的地方说是没有写codebase属性 但是好像不好设置codebase属性
  回复  引用  查看    
2008-12-27 18:45 | Bob&xiaobo.liu      
楼主能说说可能的原因和解决方法吗?
  
|

  
|

  
|

  回复  引用    
2009-03-30 13:09 | isunny      
你好,按照您的方法,我试了试,可是第一步就不太对劲儿,网页上只显示了一个白框框,在页面最开始加载的时候,框框的坐上角会出现一个小图标(不是红X),然后马上就消失了。
我只是把UserControl1.cs中的类名Demo换成了UserControl1...
楼主能不能把所有代码发给我看看?
我的邮箱是:isunny.dotwe@gmail.com
如果楼主方便加我QQ的话,更好!617561564
先谢过了!

  
|

  
|

  
|




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 86473


相关文章:

相关链接: