C#自动实现Dll(OCX)控件注册的两种方法

尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写。当需要用到Dll引用的时候,我们通常会通过“添加引用”的方式将它们纳入到项目中,然后就可以像使用自己的类一样方便的使用它们了。但是,有些Dll库(OCX)文件是需要注册到Windows注册表后才能正常添加和使用的。本文介绍两种为Dll库(OCX)自动注册的方法,为大家提供参考。

首先,大家都知道在Windows的“运行”中,输入“Regsvr32.exe 路径”这样的方法来手动注册Dll控件(OCX),显示这种方法对于程序的自动化部署等带来极大的不便,因此,今天我们着重介绍如何用C#实现自动注册。

方法一:调用Regsvr32法

既然可以在运行栏中输入“Regsvr32.exe 路径”的方法来注册,那么,一定可以在C#程序中采用同样的方法来调用Regsvr32,以实现注册:

Process p = new Process();p.StartInfo.FileName = "Regsvr32.exe";p.StartInfo.Arguments = "/s C:\\DllTest.dll";//路径中不能有空格p.Start();

采用这种方法,注意要添加对命名空间System.Diagnostics的引用:

using System.Diagnostics;

另外,这种方法有一个不足之处,那就是注册工作是在本程序之外由Regsvr32.exe程序来完成的,系统内不方便知道注册的结果,也不方便对注册过程弹出的对话框进行自定义和控制。这里附Regsvr32的参数说明:(感谢网友伍华聪的提醒)

regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:

  regsvr32 [/u] [/s] [/n] [/i[:cmdline]] DLL文件名

  命令可以在“开始→运行”的文本框中,也可以事先在bat批处理文档中编写好命令。未带任何参数是注册DLL文件功能,其它参数对应功能如下:

  /u:反注册DLL文件;

  /s:安静模式(Silent)执行命令,即在成功注册/反注册DLL文件前提下不显示结果提示框。

  /c:控制端口;

  /i:在使用/u反注册时调用DllInstall;

  /n:不调用DllRegisterServer,必须与/i连用。

方法二:调用DllRegisterServer函数法

既然方法一不大实用,那么我们就来寻找一种真正实用的方法来达到我们的目的吧。研究Regsvr32.exe和Dll文件,我们会发现,其实每个需要注册的文件都包括一个DllRegisterServer()方法,Regsvr32.exe就是通过调用该方法来完成Dll的注册的。呵呵,知道了这个,我们就可以自己调用DllRegisterServer()来完成注册过程啦。

首先,还得引入外部方法:

[DllImport("DllTest.dll")]public static extern int DllRegisterServer();//注册时用[DllImport("DllTest.dll")]public static extern int DllUnregisterServer();//取消注册时用
int i = DllRegisterServer();if (i >= 0){    注册成功!}else//注册失败
}
取消注册的过程就不应再贴代码啦。

 

两种方法介绍完啦,可是好像还缺点什么?对了,那就是对Dll是否已经注册过了的判断。一般情况下,我们可以将对Dll控件的注册过程放在系统启动的过程中来完成,但是,总不能每次启动都注册一次吧?这样做显然不合理。那么,我们就来判断一下,当前Dll是否已经注册过,如果已注册过,就跳过注册过程。

每一个Dll的注册都会在注册表里记录下有关它本身的资料,如注册路径,唯一ID等。我们这里就是利用它留下的唯一ID号来判断:

RegistryKey rkTest = Registry.ClassesRoot.OpenSubKey("CLSID\\{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}\\");if (rkTest == null)
{
//Dll没有注册,在这里调用DllRegisterServer()吧

注意要添加对命名空间Microsoft.Win32的引用:

using Microsoft.Win32;

其中的“{7713F78A-44DE-42BA-A1F6-3FB0BD6CA63B}”就是该Dll的唯一ID啦,每一个Dll文件都会不一样的。但是,问题又来了,怎么样知道它的唯一ID呢?其实很简单,那就是“逆向思维”。我们可先注册这个Dll文件,然后到注册表的“HKEY_CLASSES_ROOT\CLSID”分支下“查找”Dll的名称或路径,就可以看到这个ID啦。简单我就不多说啦。

转载于:https://www.cnblogs.com/wwwzzg168/p/3569974.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyCharm+Python3转换xls文件为xlsx文件格式

import os import os.path import win32com.client as win32"""主函数功能测试""" if __name__ __main__:xlsFilePath os.path.join(os.getcwd() "\\" "通知单.xls")# 文件存在就加载,不存在就提示检查。if …

全网最详细 Python如何读取NIFTI格式图像(.nii文件)和 .npy格式文件和pkl标签文件内容

在医学图像处理中,我们经常使用一种NIFTI格式图像(.nii文件),现在我们来看看 什么是.nii文件?该如何读取.nii文件? 1. NIFTI格式图像 什么是NIFTI(Neuroimaging Informatics Technology Initia…

十三、PyQt5的QFileDialog文件打开、文件保存、文件夹选择对话框

import PyQt5.QtCore,PyQt5.QtGui # 获取文件路径对话框 file_name = QFileDialog.getOpenFileName(self,"打开文件","C:\\Users\\Administrator\\Desktop","Txt files(*.txt)") ##"open file Dialog "为文件对话框的标题,第三个是打…

Spring Boot 最佳实践(三)模板引擎FreeMarker集成

一、FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT、电子邮件、配置文件、源代码等)的工具,它不是面向最终用户的,而是一款程序员使用的组件。 FreeMarker最初设计是用来在M…

Android开发之通过浏览器链接打开任意app页面

老套路先上图: 先说下上面的流程,第一张图是模拟浏览器的网页点击链接打开app,第二张图系统弹框提示是否打开app,第三张图已打开APP,弹出的吐司是打开APP携带的数据 具体实现分为两步,第一步配置你要打开的activity页面如下&…

windows2008C盘清理

因为原来的设计,现在C盘的空间只有2G了,今天在网上看到了清理的方法,居然清理出4G出来,先把方法记录下来,以备以后使用。我们建议您通过以下方法来清理C盘空间:1.尽量不要在C盘安装应用软件,在软…

DVWA下载、安装、使用(漏洞测试环境搭建)教程

DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。 一共有十个模块&#xf…

Spring Boot 最佳实践(四)模板引擎Thymeleaf集成

## 一、Thymeleaf介绍 Thymeleaf是一种Java XML / XHTML / HTML5模板引擎,可以在Web和非Web环境中使用。它更适合在基于MVC的Web应用程序的视图层提供XHTML / HTML5,但即使在脱机环境中,它也可以处理任何XML文件。它提供了完整的Spring Fram…

Centos7安装Postgresql 13 详细步骤(远程连接)

版本信息 CentOS : 7.6 postgresql: 10.012 安装 可以参考官网PostgreSQL: Linux downloads (Red Hat family) #安装存储库RPM: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgd…

mysql复制: 一个master对应1个slave

2019独角兽企业重金招聘Python工程师标准>>> 复制的步骤:1.在主库上开启二进制日志,把数据更改记录到二进制日志(binary log)中. mysql会按照事物提交的顺序而非每条语句的执行顺序来记录二进制日志,在记录二进制日志后&#xff…

python3、sqlmap下载与安装教程

一 、前提 需要安装python3,可以参考其他教程 二 、下载 官网下载http://sqlmap.org/ 三 、安装 将下载的sqlmap.zip解压到文件夹sqlmap中,并拷贝到Python安装路径下 四、 配置 在桌面上创建一个cmd进入python的快捷方式(这步可以不做…

Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8

## 一、Spring Data JPA 介绍 JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。 开发环境 Spring Boo…

Windows MinGW配置C、C++编译环境

写在前面的前面:这篇文章vscode和cpp插件版本有点老了,仅供大家参考,最新的和最详细的更新见我的另一篇文章:整理:Visual Studio Code (vscode) 配置C、C环境/编写运行C、C(主要Windows、简要Linux&#xf…

Burpsuite超详细安装教程

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文转载于链接:https://blog.csdn.net/LUOBIKUN/article/details/87457545 Burpsuite的超详细安装教程 概述工具分享安装一&#xff…

分析容灾备份建设需求

重要信息系统灾难备份需求分析应包括对数据处理中心的风险分析和对重要信息系统的业务分析,以确定灾难恢复目标。① 数据处理中心风险分析分析数据处理中心的风险,如物理安全,数据安全,人为因素,已有的容灾备份建设和L…

使用Hexo搭建个人博客的终极资料

# 一、前言 Hexo 是一个基于 NodeJs 博客框架,可以快速的帮我们搭建一个博客系统,Hexo使用的是Markdown(下文简称MD)解析文章的,在几秒内即可利用靓丽的主体生成静态网页。 推荐使用 Hexo 有三大理由: 有…

Linux Ubuntu 安装编译Opencv 3.4.3 C++开发环境

在安装Autoware之前,需要先安装Opencv,之前在Windows下安装了Opencv,挺复杂的。不过,在Ubuntu 16.04环境中配置安装Opencv相对来说,比较简单。 Linux Ubuntu 安装编译Opencv 3.4.3 C开发环境 1.1 下载Opencv 3.4.3 …

[原创]状态值在数据库中的检索

对于关系型数据库而言,针对表的检索,一般来说,建立合适的索引就可以达到很好的检索效果。(这里不包含表设计的合理与否)比如像状态列这样可选择性非常低的值,该如何检索? 其实这个已经不是关系…

Spring Boot(六)集成 MyBatis 操作 MySQL 8

## 一、简介 1.1 MyBatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC代码和手动设置参数以及获取结果集。 1.2 MyBatis发展史 MyBatis 原本是apache的一个开源项目iBatis, 2010年这个项目由ap…

bugku web基础$_POST

意思是通过post传入一个参数what,如果what的值等于flag,即打印出flag 这个我们有好几种办法: 第一种方法: 用FireFox的HackBar插件,传入参数whatflag run一下,爆出了flag 第二种方法: 写个…