导航
全部
C#综合技术
C#互联网桌面应用
AppLauncher
WinForm&WPF
C#开发新技术
博文收录
Ada助手
问答
...
C#综合技术
C#互联网桌面应用
AppLauncher
WinForm&WPF
C#开发新技术
博文收录
Ada助手
问答
登录/注册
社区
C#
帖子详情
C#如何实现正真意义的ActiveX控件!该控件可能由vb6,c++等调用!
麦壳饼
2007-05-22 07:13:01
由于参与的项目是两公司做的,而且都用的是不同语言。 现在必须提供ActiveX控件以便对方程序调用。 我们的项目是 .net 开发的。而且本人对其他语言不了解,用着不顺,语法也不是很懂。只对vb和c#熟悉。 但是又不想用vb6做。 我知道怎么实现com调用,然后写vb6程序来处理,但是一些报表等, vb6下又不是很爽。 所以急求.net 实现 activex控件的源码。
...全文
给本帖投票
864
24
打赏
收藏
C#如何实现正真意义的ActiveX控件!该控件可能由vb6,c++等调用!
由于参与的项目是两公司做的,而且都用的是不同语言。 现在必须提供ActiveX控件以便对方程序调用。 我们的项目是 .net 开发的。而且本人对其他语言不了解,用着不顺,语法也不是很懂。只对vb和c#熟悉。 但是又不想用vb6做。 我知道怎么实现com调用,然后写vb6程序来处理,但是一些报表等, vb6下又不是很爽。 所以急求.net 实现 activex控件的源码。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
怎样在C#与vb.net中动态建立菜单(假设在winform上有menuStrip一个控件),并在相应的菜单中写其单击事件
>>
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
发表回复
按下Enter换行,Ctrl+Enter发表内容
编辑
预览
轻敲空格完成输入
显示为
卡片
标题
链接
打赏红包
whw123456
2007-09-25
打赏
举报
回复
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
// 有关程序集的常规信息通过下列属性集
// 控制。更改这些属性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ORRSG")]
[assembly: AssemblyDescription("ActiveX控件")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("麦壳饼小屋")]
[assembly: AssemblyProduct("ORRActiveX")]
[assembly: AssemblyCopyright("版权所有 (C) MysticBoy Limited 2007")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AllowPartiallyTrustedCallers()]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(true )]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("f49a066c-1a61-4d05-8041-cb6948a85f72")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值,
// 方法是按如下所示使用“*”:
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]
新建一个接口 名为 IObjectSafety
添加
using System.Runtime.InteropServices;
/// <summary>
/// 这个guid不要更改
/// </summary>
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IObjectSafety
{
//
/// <summary>
///
/// </summary>
/// <param name="riid"></param>
/// <param name="pdwSupportedOptions"></param>
/// <param name="pdwEnabledOptions"></param>
void GetInterfacceSafyOptions(
System.Int32 riid,
out System.Int32 pdwSupportedOptions,
out System.Int32 pdwEnabledOptions);
/// <summary>
///
/// </summary>
/// <param name="riid"></param>
/// <param name="dwOptionsSetMask"></param>
/// <param name="dwEnabledOptions"></param>
void SetInterfaceSafetyOptions(
System.Int32 riid,
System.Int32 dwOptionsSetMask,
System.Int32 dwEnabledOptions);
}
新建一个控件
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Microsoft.Win32;
namespace orRActiveX
{
/// <summary>
/// 用户控件。
/// </summary>
[ProgId("ORRActiveX.ORRShowGlass")] //我们的控件名
[Guid("E6DB4C0C-4B29-4806-89B5-17DE7BB79C54")] //guid.
[ClassInterface(ClassInterfaceType.AutoDual)] //必须的,否则你无法调用 。
public partial class orRShowGlass : UserControl, IObjectSafety //集成用户控件和安全接口。
{
/// <summary>
/// 设置父对象。
/// </summary>
/// <param name="hWndChild">在这里应该是本窗体本身</param>
/// <param name="hWndNewParent">要显示该窗体的对象。 </param>
/// <returns></returns>
[DllImport("user32.dll")]
private static extern int SetParent(IntPtr hWndChild, int hWndNewParent);
/// <summary>
///
/// </summary>
public orRShowGlass()
{
InitializeComponent();
}
///<summary>
///</summary>
public void LoadMe(Int32 hWnd)
{
SetParent(this.Handle, hWnd);
}
/// <summary>
///
/// </summary>
/// <param name="top"></param>
/// <param name="left"></param>
public void SetLoc(Int32 top, Int32 left)
{
Left = left;
Top = top;
}
/// <summary>
///
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
//[ComEventInterface() ]
public void SetSize(Int32 width, Int32 height)
{
Width = width;
Height = height;
}
///<summary>
/// 注册函数,假如你能实现标准dll的方式的话,我们就可以做到完全的标准ocx了。
///</summary>
///<param name="key">键值,这个是注册时,注册程序给程序传的。 </param>
[ComRegisterFunction()]
public static void RegisterClass(string key)
{
// 去掉这个, 我们不需要他 HKEY_CLASSES_ROOT\
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
// 打开 CLSID\{guid}
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
// 创建'Control'键
//ActiveX 控件容器
RegistryKey ctrl = k.CreateSubKey("Control");
ctrl.Close();
// 创建CodeBase入口,- 这里是必须的.
RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
inprocServer32.Close();
k.Close();
}
/// <summary>
/// 调用反注册控件
/// </summary>
/// <param name="key">Tke registry key</param>
[ComUnregisterFunction()]
public static void UnregisterClass(string key)
{
StringBuilder sb = new StringBuilder(key);
sb.Replace(@"HKEY_CLASSES_ROOT\", "");
// 打开HKCR\CLSID\{guid}
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
// 删除'Control'如果不存在,不要抛出错误
k.DeleteSubKey("Control", false);
// 下一步,打开InprocServer32
k.OpenSubKey("InprocServer32", true);
//删除 CodeBase键,如果不存在,不要抛出错误
k.DeleteSubKey("CodeBase", false);
k.Close();
}
#region 为 html调用提供的接口。 IObjectSafety
/// <summary>
///
/// </summary>
/// <param name="riid"></param>
/// <param name="pdwSupportedOptions"></param>
/// <param name="pdwEnabledOptions"></param>
void IObjectSafety.GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
{
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
/// <summary>
///
/// </summary>
/// <param name="riid"></param>
/// <param name="dwOptionsSetMask"></param>
/// <param name="dwEnabledOptions"></param>
void IObjectSafety.SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
{
}
#endregion
}
}
然后需要给程序集添上 签名 。 在项目属性中的 生成菜单中选择 为 com Interop 注册 .
要在html中使用 使用下面的方法。
<body >
<object id="23423"
classid="clsid:E6DB4C0C-4B29-4806-89B5-17DE7BB79C54" >
</object>
</body>
classid 是程序中的控件前面的guid中的内容。
在vb6中调用时先引用生成的 tlb文件,和你的项目名相同。
程序中可以使用下面的方法。
Dim x As New orRShowGlass.ORRShowGlass
Private Sub Form_Load()
x.LoadMe hWnd
' x.SetLoc 1, 1 使用这个也可以
x.Top = 0
x.Left = 0
x.Width = Me.Width / 15
x.Height = Me.Height / 15
x.Refresh
End Sub
Private Sub Form_Resize()
x.Top = 0
x.Left = 0
x.Width = Me.Width / 15
x.Height = Me.Height / 15
x.Refresh
End Sub
InteropFormTools中有更好的实现。
建议采用InteropFormTools,但是他是vb代码的。 c#的目前没有,因为InteropFormTools是微软为vb用户做的!
xiaoliangwh
2007-09-17
打赏
举报
回复
up
shrinerain
2007-09-17
打赏
举报
回复
楼主的昵称不错.
liusong_china
2007-09-17
打赏
举报
回复
学习
shinaterry
2007-09-17
打赏
举报
回复
还是用VB6或VC++写比较实现...
C#写的要.Net Framework的支持...
感觉不好...
KKND2006
2007-09-17
打赏
举报
回复
C#不支持完全的ACTIVE X
开发团队开发到一半放弃支持了
现在的支持不完整
Avoid
2007-09-17
打赏
举报
回复
vb开发吧,最简单。
lonelygames
2007-09-17
打赏
举报
回复
我也在想这个问题,关注中 .
麦壳饼
2007-05-25
打赏
举报
回复
呵呵。
jjyjjyjjy
2007-05-24
打赏
举报
回复
mark 一下
morning1230
2007-05-24
打赏
举报
回复
关注中!有时间可以研究哈!
麦壳饼
2007-05-24
打赏
举报
回复
这是我最终的实现结果 。 但是下面这篇文章中介绍了更好的实现方式 。
相关链接如下:
http://www.mysticboy.cn/article.asp?id=31
我实现的源码可以从 http://www.dotnetx.cn/soft/sourcecode/csharpcode/200705/25.html 下载 。
InteropFormTools中有更好的实现。
建议采用InteropFormTools,但是他是vb代码的。 c#的目前没有,因为InteropFormTools是微软为vb用户做的!
InteropFormTools 工具可以从 http://www.dotnetx.cn/soft/tools/utility/200705/26.html 下载 。
由于项目需要,后面我可能会完全使用c#实现activex .如果有兴趣的可以关注www.dotnetx.cn 的内容。
wx25007
2007-05-24
打赏
举报
回复
关注一下
麦壳饼
2007-05-23
打赏
举报
回复
vb6无法引用。
Qim
2007-05-23
打赏
举报
回复
也关注中...
killer_liqiao
2007-05-23
打赏
举报
回复
关注中...
麦壳饼
2007-05-23
打赏
举报
回复
楼上的不错
麦壳饼
2007-05-23
打赏
举报
回复
么有实现完。
麦壳饼
2007-05-23
打赏
举报
回复
html中的却可以。但是html中不行。
估计是 vb6会调用 其中函数的问题 。
regsvr32 无法找到 regdll....那个函数。 估计就是这个原因。
hertcloud
2007-05-22
打赏
举报
回复
http://www.qqread.com/picindex/20060802/bd690187002-1.html
http://www.china-askpro.com/csharp30.shtml
http://www.5iaspx.com/aspnet/Yong-C-BianXie-ActiveX-KongJian-Yi-n1rb0319.html
加载更多回复(4)
C#
开发
ActiveX
控件
及
控件
的发布
ActiveX
控件
,早期也被称为OLE
控件
或OCX
控件
,主要由
C++
或VB开发。本文将详细介绍如何在Visual Studio 2005环境下使用
C#
来开发和发布
ActiveX
控件
。 **一、理解
ActiveX
控件
**
ActiveX
控件
是基于COM(Component ...
VS2005
C#
开发
ActiveX
控件
尽管通常
ActiveX
控件
使用
C++
或VB开发,但本文将探讨如何在VS2008环境下使用
C#
来
实现
ActiveX
控件
的技术。 在开始之前,需要明确开发环境,本文中使用的是Windows 2003操作系统、Visual Studio 2008开发工具以及.NET...
C#
编写web页面
ActiveX
控件
尽管传统的开发方式多使用
C++
或VB来构建
ActiveX
控件
,但随着.NET框架的发展,使用
C#
开发此类
控件
已成为一种可行且高效的方法。 #### 二、
ActiveX
控件
的作用与应用场景 ##### 作用 - **增加功能**:通过
ActiveX
控件
...
使用C_开发
ActiveX
控件
传统的
ActiveX
控件
开发通常采用
C++
或Visual Basic (VB)。然而,随着.NET Framework的发展,
C#
作为一种现代编程语言,也被引入到
ActiveX
控件
的开发中,这为开发者提供了更为便捷、高效的方式。 #### 二、问题背景与...
ActiveX
控件
编写及使用例程
ActiveX
控件
通常以`.ocx`文件的形式存在,它们提供了方法、属性和事件,使得其他应用程序可以通过接口
调用
这些功能,
实现
跨语言和跨平台的交互。 在本文中,我们将深入探讨如何使用
C++
来编写和使用
ActiveX
控件
。...
C#
111,074
社区成员
642,571
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
积分榜
荣誉榜
原力榜
学习榜
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章
手机看
关注公众号
客服
返回
顶部