如何用代码注册activex控件(顶者有分)

niaoren 2004-08-28 05:39:14
现在正在写一个程序,碰到几个问题:
1、怎么检测某个activex控件在本机器上是否注册,如果注册了,注册的是什么版本
2、如果没有注册,如何注册
以上问题都需要用代码实现
...全文
200 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
曲滨_銘龘鶽 2004-08-29
  • 打赏
  • 举报
回复
建议用 VC,Delphi 写这种东西,
即时用户重新作了系统也可以跑起来
不光能监测 com 组件
还能监测有没有 .net 环境。
koalapopo 2004-08-29
  • 打赏
  • 举报
回复
顶者有分 那回答问题是不是没有啊
哈哈
还好我只会顶
曲滨_銘龘鶽 2004-08-29
  • 打赏
  • 举报
回复
1,监测的这个程序一定要不能引用 你要监测的那个 activex 否则起不来程序

2,启动程序后 执行:如
判断是否有 excel 的com对象
Type obzty =Type.GetTypeFromProgID("Excel.Application");
如果报错或 obzty 为null 那么就是计算机没有 你的那个 activex。

com 组件都有个这个东西 “Excel.Application” 类似的

可以根据 控件的路径 在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
下找到,找到会有版本什么的其他信息

3,没有就用上面那些朋友的注册方法都可以了(不能每次启动都注册一次啊)。
marvelstack 2004-08-29
  • 打赏
  • 举报
回复
补充一下regsvcs.exe 命令
用法:regsvcs.exe [options] AssemblyName
选项:
/? 或 /help 显示此用法信息。
/fc 查找或创建目标应用程序(默认)。
/c 创建目标应用程序,如果该程序已存在则出错。
/exapp 需要现有的应用程序。
/tlb:<tlbfile> 已导出类型库的文件名。
/appname:<name> 对目标应用程序使用指定的名称。
/parname:<name> 对目标分区使用指定的名称或 ID。
/extlb 使用现有的类型库。
/reconfig 重新配置现有的目标应用程序(默认)。
/noreconfig 不重新配置现有的目标应用程序。
/u 卸载目标应用程序。
/nologo 取消显示徽标。
/quiet 取消显示徽标和成功消息。
/componly 仅配置组件,不配置方法或接口。
/appdir:<path> 将应用程序根目录设置为指定路径。


============================================================
Regsvr32在注册表中作为命令组件注册 .dll 文件。

语法
regsvr32 [/u] [/s] [/n] [/i[:cmdline]] DllName

参数
/u
未注册服务器。
/s
指定 regsvr32 安静运行,且不显示任何消息框。
/n
指定不调用 DllRegisterServer。此选项必须与 /i 共同使用。
/i:cmdline
调用 DllInstall 将它传递到可选的 [cmdline]。在与 /u 共同使用时,它卸载 .dll。
DllName
指定要注册的 .dll 文件名。
/?
在命令提示符下显示帮助。
示例
要为“Active Directory Schema”注册 .dll,请键入:

regsvr32 schmmgmt.dll

格式化图例
格式 含义
斜体 用户必须提供的信息
粗体 用户必须准确键入的要显示的元素
省略号 (...) 在命令行中可多次重复的参数
中括号 ([]) 可选项
大括号 ({});选项用竖线 (|) 分隔。例如:{even|odd} 用户必须从选项集合中选择一个
Courier 字体 代码或程序输出


jinbingg 2004-08-29
  • 打赏
  • 举报
回复
读写注册表怎么样。。
niaoren 2004-08-29
  • 打赏
  • 举报
回复
lxcc(虫子) 的方法太麻烦了,搞了半天还没有写出来,哪位高手能否用c#写出来,最好写成通用的。
我暂时用下面的方法先用着
Process p = new Process();
p.StartInfo.FileName = @"RegSvr32.exe";
p.StartInfo.Arguments = @"/s D:\WorkShop\DLL\DSOFramer\dsoframer.ocx";
p.Start();
p.Close();
sim 2004-08-29
  • 打赏
  • 举报
回复
Regsvr32这个文件就是调用楼上的api来注册的。
tltaolan 2004-08-29
  • 打赏
  • 举报
回复
UP
lxcc 2004-08-29
  • 打赏
  • 举报
回复
以下是VB代码,改成c#,用Dllimport实现即可

'在本例子里使用的是 ComCtl32.OCX,如果是其他,使用相应的名称
Private Declare Function RegComCtl32 Lib "ComCtl32.OCX" _
Alias "DllRegisterServer" () As Long
Private Declare Function UnRegComCtl32 Lib "ComCtl32.OCX" _
Alias "DllUnregisterServer" () As Long
Private Const ERROR_SUCCESS = &H0

'使用:

Private Sub Command1_Click()
If RegComCtl32 = ERROR_SUCCESS Then
MsgBox "Registration Successful"
Else
MsgBox "Registration Unsuccessful"
End If

If UnRegComCtl32 = ERROR_SUCCESS Then
MsgBox "UnRegistration Successful"
Else
MsgBox "UnRegistration Unsuccessful"
End If
End Su
diaoerlangdang 2004-08-29
  • 打赏
  • 举报
回复
我也只知道用regsver32 来手动注册
robin0925 2004-08-29
  • 打赏
  • 举报
回复
顶!只知道Regsvr32 /s you.dll来注册!
whmjw 2004-08-29
  • 打赏
  • 举报
回复
你可以在程序中调用Regsvr32 /s you.dll来注册,不管对方机子是否已经注册了,这样不会弹出注册成功的窗口
3610 2004-08-29
  • 打赏
  • 举报
回复
ding
niaoren 2004-08-29
  • 打赏
  • 举报
回复
能否判断当前注册的是什么版本吗?
zhpsam109 2004-08-28
  • 打赏
  • 举报
回复
不会,帮你顶!
Reeezak 2004-08-28
  • 打赏
  • 举报
回复
什么注册?
给钱的那种吗?
niaoren 2004-08-28
  • 打赏
  • 举报
回复
UP一下,明天再来瞧瞧

Active Audio Record ActiveX控件 可以直接录制声音为MP3、WAV、wma 、ogg、au、aiff 和vox格式的音频文件。您可以通过设置内码参量完全控制音像文件的质量。

Active Audio Record ActiveX控件 支持标准声卡,还支持多张声卡并且具有多条设备线。您能容易地记录任一个来源的声音:譬如在网上流出的音像、收音机、音像球员(即传媒播放装置、WinAmp, 真正的球员等), midi 、话筒、CD 、磁带、LPs等。

Active Audio Record ActiveX控件 兼容许多支持ActiveX的语言,譬如:Visual C++, Visual Basic, Delphi, C++ Builder, .Net languages like C#, VB.Net, Java, Scripts like Perl, Php, Python, ASP.Net。

Active Audio Record ActiveX控件的特点: 对wav, MP3 、 wma 、ogg 、vox 、au 、aiff 、mp4 和flac格式音像直接纪录,若正在进行格式化则不创建临时文件; 支持多条声卡和混频线路; 为混频线路设置容量级别; 在录音期间静音探察; 得到音像频道音量值; 支持wav、wma 和MP3; 支持ID3 标记、MP3 和WMA 标记、OGG和FLAC 标记; 提供VB、VBScript、C#、Perl、JScript、VB.Net、Delphi实例。 Active Audio Record ActiveX控件一些组件的功能: LONG GetDeviceCount:得到声音设备的数目; LONG GetDeviceName(LONG idx):得到声音设备的名字; LONG DeviceIndex:获取/设置当前的声音录音设备; SetOutputFileName(String strFile) :设置输出文件的名; StartRecord:以录音参量开始录音,将这些参量传送到声卡; StopRecord:停止录音; LONG GetDeviceLineCount:得到混频线路数量; LONG DeviceIndex: 获取/设置当前的设备目录; LONG DeviceLineVolume:获取/设置当前的混频线路,在0 和100 之间; GetDeviceLineName(LONG idx) :得到混频线路名称; LONG GetRecordTime :在几秒钟内得到记录时间; LONG GetLeftInputLevel:得到左声道输入容限,在0 和32768 之间; LONG LONG GetRightInputLevel:得到右声道输入容限,在0 和32768 之间; LONG LONG SetSilenceLevel:得到当前的门限值; LONG LONG SetDetectSilence :设置默认的容量水平,在0 和32768 之间; LONG LONG FileFormat :设置文件格式; LONG SetCode(String strCode) :设置注册代码(试用版本)。 Active Audio Record ActiveX控件V 2.0的系统需求: Windows 98 以上操作系统,声卡。
VB6.0动态加载ActiveX控件漫谈 深圳 罗汉军 罗德昌 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程, 但唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。 VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功 能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变 量。 如果对象是从属对象,则需使用高层对象的方法,在 Set 语句中指定一个对象引 用: Dim xlApp1 As Excel.Application Set xlApp1 = New Excel.Application 或 Dim xlApp As Object '定义存放引用对象的变量。 Set xlApp = CreateObject("excel.application") xlApp.Visible = True ---- 这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋 友也象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种 考虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如 何实现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说 明。 一、ActiveX控件 ---- ActiveX 控件是 Visual Basic 工具箱的扩充部分。使用 ActiveX 控件的方 法与使用其它标准内装的控件,如 CheckBox 控件,完全一样。在程序中加入 ActiveX 控件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。 ---- ActiveX 部件通过客户端/服务器关系与应用程序— 及与部件相互之间— 交 互作用。客户端是使用部件功能的应用程序代码或部件。服务器是部件及其关联的对象。 例如,假设应用程序使用 ActiveX 控件来提供一个标准的雇员窗体,供公司的多种 应用程序使用。提供雇员窗体的 ActiveX 控件就是服务器,使用这个控件的应用程序 就是服务器的客户端。 二、加载方法 ---- VB6.0中对Controls 集合进行了扩展,以前版本中Controls 集合在窗体上列 举出已加载的控件,这在迭代过程中是很有用的。Controls 集合标识一个叫做 Controls的内在窗体级变量。如果忽略可选的 object 所在处的整数,则关键字 Controls 必须包括在内。我们通常在窗口中使用如下代码: Text1.Text="Hello, world" 其实也可以使用如下代码达到同一目的: Controls(1).Text="Hello, world" ---- 在VB6.0中除了原来的Clear、Remove 方法外(很奇怪,为什么微软在VB5.0中 只提供这两种方法,而没有提供Add方法,因为没有Add,这两种方法也就没什么用处), 增加了Add方法,该方法就是用于动态加载控件的: Controls.Add(progid as String, Name as String); progid: ActiveX部件的ProgID,如:"VB.CheckBox"; Name:ActiveX部件加载后的名称,如: "MyCheckBox"; 若要在窗体上添加一个名为MyButton的按钮,可以使用: dim oControl as Object '窗体级变量 注意:这里声明为Object对象类型 Private Sub LoadControl() Set oControl = Controls.Add ("VB.CommandButton", "MyButton") oControl.Left = 10 oControl.Top = 10 oControl.Visible = True '使控件可见 End Sub ---- 这是VB6.0的标准语法,它在例程中也是如此演示的,不过该方法虽然现实了 控件的动态加载,按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能 预先设计响应事件代码,如:事件Sub MyButton_Click()将是非法的,当然,可以将要 响应的事件封装在控件内部。就编程的观点来看该方法没什么大的用处,开发ActiveX 控件的目的是为了资源共享,为了被其他开发人员利用,所以要提供必要的事件接口, 显然利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender对象 与EventInfo相结合能提供事件陷井捕捉,VBControlExtender对象对动态添加控件特 别有用,它提供了一套通用的属性、方法、事件给开发人员,它的一个突出特点是能编 程设计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生: ---- Dim WithEvents objElemt as CElemtVBControlExtender也不例外,声明的 语法一样,只不过它有个特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到对 象使用RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数 和参数的值。VBControlExtender和 EventInfo相结合,采用Select Case 就可以预先 将不同类对象的事件放置一起,各自独立运作。将上面的代码改写一下就能提供Click 事件了: ---- Dim WithEvents oControl As VBControlExtender '带事件声明声明之后您 就可以在代码窗口的左上角的对象下拉框中发现该对象出现了,也就是说,该对象有了 事件或方法了,它的事件有DragDrop,DragOver ,LostFocus ,GotFocus , ObjectEvent和Validate,其中ObjectEvent是通用的事件捕捉。 Private Sub LoadControl() Set oControl = Controls.Add ("VB. CommandButton", "MyButton") oControl.Visible = True End Sub Private Sub oControl_ObjectEvent(Info As EventInfo) Select Case Info.Name Case "Click" 'Click事件 '您可以添加处理Click事件代码 MsgBox "您按了MyButton!" Case Else ' 其他事件 ' Handle unknown events here. End Select End Sub ---- 当然对微软提供的标准控件能采用该方法添加,大家都不会怀疑,但自己开 发的控件也能吗?答案是肯定的,我们可以用一个实际的例子进行说明。 三、实例描述 ---- 假设一个本地网络的监控系统,需要在原理图与实物示意图间切换,原理图 包括组网结构、传输资源、监控主机等,而实物示意图包括路由器、设备、采集器等, 当然两种图的事件要一致,如双击某个设备图形将显示给设备的实时数据等,为了简化 维护,将原理图与实物示意图封装成ActiveX控件,由于每种图需要加载许多图形控 件,消耗资源较大,不能同时加载,需要将其分解为两个控件,在切换时首先卸载一个 控件,然后加载另一个控件,所以要实现动态加载ActiveX控件。 ---- 原理图控件为--Theory.ocx ,对应工程为CTheory; ---- 实物图控件为---Fact.ocx ,对应工程为CFact; ---- 注意:为了简化,在设计控件时不设置许可证关键字。 ---- 实物图控件上的图形对象可以被拖动,拖动后的位置信息通过事件 ChangePosition来通知拥有该控件的窗体,以便下次加载能显示在最后位置,实物 图和原理图控件都有双击事件完成的工作相同,其他事件此处忽略。 ---- 四、具体示例 ---- 1、准备工作 ---- 对控件Theory.ocx 、Fact.ocx 进行注册(利用Regsvr32.exe注册); ---- 建立窗体frmTest.frm ,在窗体上放置按钮cmdLoadOcx—“原理图” ---- 2、声明窗体级变量与加载函数LoadControl Dim WithEvents oControl As VBControlExtender '地图仿真控件对象 Dim mblnTheory As Boolean '是否显示原理图 Private Function LoadControl(intType As Integer) If Not oControl Is Nothing Then '首先判断对象是否存在,若存在则卸载 Controls.Remove("MapView") '卸载控件,此操作非常重要 End If If intType = 0 Then Set oControl = Controls.Add ("CTheory. Theory", "MapView") Else Set oControl = Controls.Add ("CFact.Fact", "MapView") End If oControl.Height = 3500 oControl.Width = 6500 oControl.Top = 100 oControl.Visible = True End Function Private Sub Form_Load() mblnTheory = True End Sub ---- 3、为按钮cmdLoadOcx编写代码 Private Sub cmdLoadOCX_Click() If mblnTheory Then Call LoadControl(0) mblnTheory = False cmdLoadOCX.Caption = "实物图" Else Call LoadControl(1) mblnTheory = True cmdLoadOCX.Caption = "原理图" End If End Sub ---- 4、为事件ChangePosition编写代码 Private Sub oControl_ObjectEvent (Info As EventInfo) Select Case Info.Name Case "ChangePosition" MsgBox CStr(Info.EventParamters.Item( 1).Value) + ":" + _ CStr(Info.EventParamters.Item(2).Value) Case "DbClick" '双击处理代码 Case Else ' End Select End Sub ---- 注意: EventInfo的参数EventParamters集合中是以1开始的,一般来说,微 软新的集合一般是以1开始的,而旧的是以0开始的,如RdoErrors.Item(0)。 ---- 5、关闭窗口前卸载控件 Private Sub Form_Unload(Cancel As Integer) Controls.Remove("MapView") Set oControl = Nothing End Sub ---- 6、特别注意 ---- 通过Controls.Add方法添加的ActiveX控件一定不能在该工程中有该控件的任 何引用,否则系统将出错。 四、小结 ---- 通过使用动态加载ActiveX控件使用庞大的应用程序变得很小,将不同的 ActiveX控件进行各种组合,使应用程序更加灵活多变,如您的应用系统要处理三十种门禁, 而某个具体的用户可能只有一种或两种门禁,根本没必要首先将所有门禁包含到应用 中,可将各个门禁独立封装,只安装注册需要的组件,就象Windows的自定义安装一样。 微软的未来技术基础是分布式的组件技术(DCOM),将会把代码的重用发挥得淋漓尽致。 您不妨试一试动态加载,也许会产生令您惊喜的效果! ---- 本代码在Win98、VB6.0(英文版)上编译、运行。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧