制作Activex程序网上有很多方法我就不说了,我的业务主要做的就是将DLL打包成CAB供浏览器下载。

下面制作证书,以及制作cab包需要用到一些工具。我将工具包上传到自己的博客园里了,以供大家下载。

工具包下载地址:https://files.cnblogs.com/files/Scholars/CABTest.7z

一,制作安装程序。

先新建一个安装程序。我用的是VS 2017,目前来说VS 2012以后VS默认已经不携带自定义安装部署程序了。这是需要去下载一个,下载地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects

由于我是DLL打包,所以这个地方选择添加文件。将要打包下载的DLL全部添加进来。

随后针对于你的DLL,F4属性,将Register更改为vsdraCOM。意思是与COM组件相关联。

接下来针对于Application Folder,F4属性有个DefaultLocation默认安装地址。我这边直接暴力写死在C盘。

随后,挺重要的一点。

对项目F4查看属性,有一个ProductCode,设置成你的Activex所要调用的guid。

随后就可以生成,生成之后便会有一个msi文件。接下来就可以制作cab包了,以及证书签名了。

在debug里有exe跟msi。exe是安装程序,msi用于cab用。

二,生成cab包。

如果只是生成了msi文件,用户安装的时候比较麻烦,像安装一般软件一样,需要用户慢慢点击下一步,慢慢安装,在本项目中采用打包成cab文件的方式,做到用户点击运行后,即可自动安装。

需要准备以下文件有:

(1)cabarc.exe:微软提供的cab打包工具

(2)SetupByte.msi:  本案例中SetupByte项目生成的windows部署安装文件

(3)install.inf : 需要跟EasySetup.msi打包在一起的文件,制作方法请见下文

(4)build.bat:  打包的批处理命令,制作方法请见下文

(5)RunBat.exe:用于通过C#程序以管理员权限,注册DLL写入注册表的程序。可依据自己的需求进行去留操作。

1, install.inf,inf文件制作。inf文件主要是用于,ie打开浏览器时读取cab包之后。首先自动运行inf文件,随后由inf文件调取msi文件实现自动安装。

这个文件挺麻烦,我搞了好久也不太懂。反正有些类似于批处理。其中[version]是必须写的,[Setup Hooks]好像运行inf文件之后的运行顺序。

[hook1] 则是调用windows自带的msiexec.exe程序去执行msi文件进行安装

run=msiexec.exe /i "%EXTRACT_DIR%\SetupByte.msi" /qn

后面加上/qn,则是静默安装。无交互式,由于我这边需要跟用户做一些交互所以去掉了静默安装。

[hook2]则是我调用了一个程序,用来调用我写的批处理文件。通过C#程序,以管理员权限来注册DLL,写注册表。

[version]
signature="$CHICAGO$"
AdvancedINF=2.0 [Setup Hooks]
hook1=hook1
hook2=hook2 [hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\SetupByte.msi" [hook2]
run=%EXTRACT_DIR%\RunBat.exe

2,build.bat制作。新建txt文件,加入以下内容,将文件名重新命名build.bat即可。其中SetupPackagev1.cab是生成目标cab的名称;install.inf是第一步生成的文件名,而SetupByte.msi是需要打包的安装程序名;第二条ping命令仅仅是让批处理不要那么快退出,起到更利于观察生成结果的作用。

"cabarc.exe" -s 6144 n SetupPackagev1.cab install.inf SetupByte.msi RunBat.exe
ping -n 20 127.0.0.1 >nul

把以上五个文件复制到同一个文件夹中,双击build.bat批处理命令即可生成cab文件。由于我需要携带上我写的一个C#控制台注册DLL程序,就也携带上了。所以“RunBat.exe”可以去掉不是必须。

这时cab包中,包含的就是inf,msi,exe(注册DLL写注册表程序(可不要))三个程序。

三,对cab包进行数字签名及证书制作

cmd切换到makeCAB目录

然后输入如下命令:makecert /sv "RemtCard.pvk" /n "CN=公司名称" -r RmtCard.cer

会弹出私钥设置界面:

再次确认密码之后会生成两个文件:

创建SPC测试软件出版商证明书,在命令行中输入“cert2spc RmtCard.cer RmtCard.spc”

出现以下三个文件就表明证书生成成功了,接下来给cab包进行签名。

运行signcode.exe

选择需要签名的cab包

自定义:

从文件选择,选择你刚生成的证书:

再以刚刚的操作,在你生成文件夹的地方找到私钥文件:

输入你设置的私钥密码:

哈希算法选择sha1

其他证书选择

随后一直点击下一步,弹出私钥密码输入窗口输入你的私钥密码即可。

四,HTML在线测试cab包

新建一个HTML文件,内容如下:

classid为你Activex程序的guid,路径需要写相对路径。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=9" >
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> -->
<!-- <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" > -->
<meta content="always" name="referrer">
<meta name="theme-color" content="#2932e1">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<hr />
<div>
<div>
<a href="makeCAB/RmtCard.spc">第一次运行,请先下载并安装根证书。</a>
<h3>或者</h3>在浏览器安全设置上面设置为“下载未签名Activex”,等安装成功后再将浏览器设置还原。
</div>
<object id="csharpActiveX" codebase="CAB/SetupPackagev1.cab?v=2" classid="clsid:{67631A1F-4AA9-469C-A7DE-E12C51130000}">
<div>aaa</div>
</object>
<!-- 67631A1F-4AA9-469C-A7DE-E12C51130000 -->
</div>
</form>
</body>
<script>
var doc = document.getElementById("csharpActiveX")
var a3 = doc.PatientIdentification("");
alert(a);
</script>
</html>

五,生成完毕后测试出现的问题,及解决方式。

一,ie无法自动安装

我在测试期间,有些同事的电脑打开ie可以直接调起安装程序,有些却不可以。思来想去找了很久,大概花了三天的时间也没解决。那些不可以调起安装程序的是因为ie运行cab包时一直弹出用户控制窗口,点击是之后没有任何反应。

解决办法:将ie以管理员身份运行。ie在打开你的测试界面时,就不会弹出用户控制窗口。而是直接调用安装程序!

二,注册DLL的批处理无法自动执行

msi安装成功之后,注册DLL的批处理无法自动执行,并写入注册表。也是头疼。

解决办法:新建一个控制台程序,以管理员方式调用批处理文件。进行注册DLL写入注册表。(因为我在安装部署时,就已经把DLL的安装地址写死了。你们依据自己的情况进行修改)

            using (Process proc = new Process())
{
string command = @"C:\SetupByte\BytePluginReg.bat";
proc.StartInfo.FileName = command;
proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(command); //run as admin
proc.StartInfo.Verb = "runas"; proc.Start();
while (!proc.HasExited)
{
proc.WaitForExit(1000);
}
}

C# 将DLL制作CAB包并在浏览器下载,自动安装。(Activex)(包括ie打开cab包一直弹出用户账户控制,确定之后无反应的解决办法。)的更多相关文章

  1. 解决ubuntu安装ssh服务无法打开解析包问题

    Windows下做Linux开发需要SSH强大功能的支持.安装SSH的过程会出现了很多问题,看完这篇文章可以让你少走些弯路,PS:折腾一下午的成果. Ubuntu的apt-get工具的牛逼之处简直无人 ...

  2. 发布一个PHP包到Packagist, 然后使用Composer安装

    Composer 能够方便的进行项目的依赖管理,  当我们发布一个包并且希望别人通过Composer安装的时候, 就需要将包发布到Composer的包仓库Packagist上面. 下面进行详细的说明一 ...

  3. IDEA13中配置struts错误:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter +找不到java程序包 解决办法

    问题一:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter解决办法 1.确保所有strut ...

  4. 程序包 javax.servlet 不存在 解决办法

    其原因是java编译器没有找到软件包javax.servlet. 下载servlet.jar放到lib下没有效果,后发现需要在jdk中添加,如下: 解决办法: 从tomcat lib目录下拷贝一个se ...

  5. maven如何安装oracle驱动jdbc的jar包

    一.因为oracle驱动的压缩包在maven官网上并没有提供,所以需要自己去手动下载. 二.下载安装步骤如下: (1)第一步:找到你本地的oracle驱动包所在位置: (2)在cmd中打开jar包所在 ...

  6. dll ocx cab IE 自动安装

    我们打开淘宝等网站时,IE浏览器会提示安装空间,这个控件便是用于对用户名密码进行加密的ActiveX控件.如何在我们的站点上安装如此控件,让用户可以通过简单的点击便可方便使用我们的空间呢? 下面是如何 ...

  7. 【java-console】如何双击运行可执行jar包及遇到依赖dll报错问题的解决办法

    如何配置双击运行可执行jar包的步骤,请移步到   这里   查看具体的操作,此处不再介绍. 本文主要解决如何处理依赖dll报错的问题解决办法. 我有一个jar包可执行文件运行需要依赖第三方的dll文 ...

  8. Visual Studio警告IDE0006的解决办法 引用的dll或者包出现黄色叹号

    首先这种错误,一般是web项目出现的. 一.按照微软官方给的解决方案,查找错误日志: 1. 关闭 Visual Studio. 删除解决方案下的.vs文件夹,这个文件夹默认是隐藏的,找不到的需要打开隐 ...

  9. war包部署在tomcat下,使用windows service服务方式启动tomcat服务器,在包含调用dll的模块,报dll找不到问题的解决办法

    问题描述: 开发了一个需要调用dll的java web程序,在idea开发环境下运行调试没问题,可以正常运行,在tomcat/bin下,运行批处理startup.bat,启动tomcat服务器,也可以 ...

随机推荐

  1. 为什么传统软件厂商都想转型做Saas?

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 早些年,我工作笔记用的最多的是微软的OneNote,这东西好用不说,不仅能够存在云端,也能存放在本地.可惜到了Office2019之后,On ...

  2. 软件篇-04-OMPL和FCL用于SLAM轨迹规划

    使用OMPL内置的infoRRTstar算法模块和FCL碰撞检测库实现当前点和目标点的轨迹规划, 参考文章:https://www.cnblogs.com/shhu1993/p/7062099.htm ...

  3. Android动态调试so库JNI_Onload函数-----基于IDA实现

    之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...

  4. 洛谷P1085 不高兴的津津

    题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而 ...

  5. Windows核心编程 第六章 线程基础知识 (下)

    6.6 线程的一些性质 到现在为止,讲述了如何实现线程函数和如何让系统创建线程以便执行该函数.本节将要介绍系统如何使这些操作获得成功. 图6 - 1显示了系统在创建线程和对线程进行初始化时必须做些什么 ...

  6. 【Mybtais】Mybatis 插件 Plugin开发(一)动态代理步步解析

    需求: 对原有系统中的方法进行'拦截',在方法执行的前后添加新的处理逻辑. 分析: 不是办法的办法就是,对原有的每个方法进行修改,添加上新的逻辑:如果需要拦截的方法比较少,选择此方法到是会节省成本.但 ...

  7. dubbo服务暴露原理

    1.发布流程 暴露本地服务 暴露远程服务 启动netty 连接zookeeper 到zookeeper注册 监听zookeeper 2.官方文档 3.看输出日志,就会发现在暴露本地服务之前,有一句很重 ...

  8. ES常用查询语法

    1.query string search GET /index/type/_search?q=name:zhangsan&sort=age:desc 2.query DSL(Domain S ...

  9. 测开之Python自动化全栈工程师+性能专项(送思维导图)

    测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...

  10. Java常用类详解

    目录 1. String类 1.1 String的特性 1.2 String字面量赋值的内存理解 1.3 String new方式赋值的内存理解 1.4 String 拼接字面量和变量的方式赋值 1. ...