InstallShield 制作INF驱动安装程序

news2024/12/23 0:03:52

题外话:
使用INF文件制作经过签名的CAT文件可以参考如下博文:
https://blog.csdn.net/qq_29729577/article/details/113537243

回归正题:
本例使用InstallShield 2020版本

驱动文件准备

将INF、CAT、SYS等驱动相关文件放至同一目录下,本例为简单示例,文件如下:
在这里插入图片描述

新建工程

NewProject,新建InstallScript MSI工程
在这里插入图片描述

Project Assistant设置

  • Application Information
    自行填写
    在这里插入图片描述

  • Installation Requirements
    默认都选No

  • Installation Architecture
    默认选No

  • Application Files
    先不填写

  • Application Shortcuts
    默认不填

  • Application Registry
    默认选No

  • Installation Localization
    简体中文即可

Installation Designer设置

1. 驱动设置

选择OGANIZATION下的Setup Design
在这里插入图片描述
删除默认项目DefaultFeature,选择PROJECT下的Device Driver
在这里插入图片描述
进入设备驱动向导
Device Driver Package选择驱动存放目录下的INF文件
System Architecture根据具体情况选择
在这里插入图片描述
下一页会自动列出目录下相关的驱动文件
在这里插入图片描述
下一页如下勾选即可
在这里插入图片描述
下一页选择平台
在这里插入图片描述
最后点击完成即可

2. 安装脚本设置

选择BEHAVIOR AND LOGIC中的InstallScript
在这里插入图片描述
选择Setup.Rul -> Before Move Data -> OnFirstUIBefore
在这里插入图片描述

去掉代码中不必要的过程,最终代码如下:

function OnFirstUIBefore()
    NUMBER nResult, nSetupType, nvSize, nUser;
    STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
    STRING szLicenseFile;
	BOOL bCustom, bIgnore1, bIgnore2;
begin	
    // TO DO: if you want to enable background, window title, and caption bar title                                                                   
    // SetTitle( @PRODUCT_NAME, 24, WHITE );                                        
    // SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION ); 	                  
    // Enable( FULLWINDOWMODE );						   
    // Enable( BACKGROUND );							  
    // SetColor(BACKGROUND,RGB (0, 128, 128));					   

    // Added in InstallShield 15 - Show an appropriate error message if
    // -removeonly is specified and the product is not installed.
    if( REMOVEONLY ) then
        Disable( DIALOGCACHE );
		szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
   		SdSubstituteProductInfo( szMsg );
		MessageBox( szMsg, SEVERE );
		abort;
    endif;
    
	nSetupType = TYPICAL;	

Dlg_SdWelcome:
    szTitle = "";
    szMsg   = "";
    nResult = SdWelcome(szTitle, szMsg);
    if (nResult = BACK) goto Dlg_SdWelcome;
	
	szTitle   = "";
	svName    = "";
    svCompany = "";

Dlg_SdStartCopy:
    szTitle = "";
    szMsg   = "";
    nResult = SdStartCopy2( szTitle, szMsg );			
	
    if (nResult = BACK) then
       goto Dlg_SdWelcome;;
    endif;

    // Added in IS 2009 - Set appropriate StatusEx static text.
    SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );

    // setup default status
    Enable(STATUSEX);
 
    return 0;
end;

编译

最终进入Project Assistant的Build Installation进行编译即可
在这里插入图片描述
编译完成后,生成setup.exe,即可进入安装流程,安装流程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

以上就是INF驱动简单的安装包制作流程,但还遇到一个问题尚未解决:

还未找到方法能够编译出同时适配x86和x64平台的安装包,目前x86和x64是分开编译为两个安装包

如果知道方法的朋友请给我留言,大家共同进步,谢谢!

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

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

相关文章

【动态内存管理】C语言

前言: 为什么会存在动态内存分配 我们以前学过的开辟空间的方式有两个特点: 1 空间开辟大小是固定的; 2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配; 但是对于空间的需求&#xff0c…

Qt基于CTK Plugin Framework搭建插件框架--插件通信【注册接口调用】

文章目录一、前言二、插件完善2.1、添加接口文件2.2、添加接口实现类2.3、服务注册(Activator注册服务)三、接口调用四、接口 - 插件 - 服务的关系4.1、1对14.2、多对14.3、1对多一、前言 通过Qt基于CTK Plugin Framework搭建插件框架–创建插件一文&am…

解决方案|Keithley吉时利源表测试软件的典型应用及案例介绍

数字源表又称源测量单元(SMU),是数字万用表(DMM)、电压源、实际电流源、电子负载和脉冲发生器的有用功能集成在仪器中,相当于电压源、电流源、电压表、电流表和电阻表的综合体可以作为四象限电压源或电流源提供精确的电压或电流,同时测量电流…

聚类模型(K-means聚类,系统聚类,DBSCAN算法)

所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。聚类和分类的区别:分类是已知类别的&#xf…

Kafka 生产者

Kafka 生产者 生产者就是负责向 Kafka 发送消息的。 生产者业务逻辑 (生产者业务逻辑流程) 生产者开发示例 一个正常的生产逻辑流程如下: 配置生产者客户端参数及创建相应的生产者实例 构建待发送的消息 发送消息 关闭生产者实例 生…

CSS权威指南(八)基本元素框

文章目录1.基本元素框2.内边距3.边框4.轮廓5.外边距1.基本元素框 文档中每个元素都会生成一个矩形框,我们称之为元素框。这个框体描述元素在文档布局中所占的空间。因此,元素框之间是有影响的,涉及位置和尺寸。 (1)宽…

如何在 Excel VBA 中插入行

在本文中,我将解释如何使用VBA(Visual Basic for Applications)在Excel中插入行。VBA 是一种编程语言,适用于在Excel和其他Office程序中工作的人员,因此可以通过编写所谓的宏来自动化Excel中的任务。使用VBA编码,我们可以执行Excel中执行的所有大多数任务,就像复制、粘贴…

【手写 Vue2.x 源码】第十六篇 - 生成 render 函数 - 代码拼接

一,前言 上篇,生成 ast 语法树 - 构造树形结构部分 基于 html 特点,使用栈型数据结构记录父子关系开始标签,结束标签及文本的处理方式代码重构及ast 语法树构建过程分析 本篇,使用 ast 语法树生成 render 函数 - 代…

双软认证-深圳市

双软认证是软件企业的认证和软件产品的登记,企业申请双软认证除了获得软件企业和软件产品的认证资质,同时也是对企业知识产权的一种保护方式,更可以让企业享受国家提供给软件行业的税收优惠政策。 想要在这个残酷的市场中生存下去的话&#x…

cc1200 Sub-1 GHz RF Transceivers 开发

一些应用需要定制开发无线串口、指定发送频点、调制方式、加密传输等等,需要使用无线数据的传输场景,需要使用公用频段进行数据传输。一些场景需要使用Sub-1 GHz频点进行数据传输,比如无线串口,其他无线申请,在国内选择…

集群调度情况

1 集群调度 2 调度简介 Scheduler是kubernetes的调度器,主要任务是把定义的pod分配到集群的节点上。听起来非常简单,但有很多要考虑的问题 公平: 如何保证每个节点都能被分配资源 资源高效利用:集群所有资源最大化被使用 效率&…

【 uniapp - 黑马优购 | 购物车页面(1)】如何创建购物车编译模式、 商品列表区域实现

个人名片: 🐼作者简介:一名大二在校生,讨厌编程🎋 🐻‍❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&#x1f5bc…

LeetCode[692]前K个高频单词

难度:中等题目:给定一个单词列表 words和一个整数 k,返回前 k个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。示例 1:输入: words ["i"…

【异常】记一次因scripts编写错误导致无法正常build的问题

一、npm 与 scripts之间的关系 Node 开发离不开 npm,而脚本功能是 npm 最强大、最常用的功能之一。 npm 允许在package.json文件里面,使用scripts字段定义脚本命令。 比如以下: "scripts": {"dev": "vue-cli-se…

【C++】引用详解

作者:阿润菜菜 专栏:C 🏃🏃🏃🏃🏃🏃 本文目录 概念及用法 特性 使用场景 1.做参数 2. 做返回值 从函数栈帧角度理解引用 传值、传引用效率比较 引用和指针的区别 概念及用法 引…

洛谷 P1194 买礼物 (图论 最小生成树)

鸽了好几天了今天写个洛谷的题解 题目描述 又到了一年一度的明明生日了,明明想要买 BB 样东西,巧的是,这 BB 样东西价格都是 AA 元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第 II 样东西&#…

Python OpenCV 数字验证码 字母验证码 图片验证码 自动识别方案 第三方库 识别成功率较高 通用解决方案

前言 在学习的前期可使用现有封装好的轮子试试效果,实际调试能否满足需求。使用已经造好的轮子的好处就是能快速解决当下的问题。若能就继续使用,若不能就接入下一步的深度学习模型训练,其实再验证码识别业务场景大多是情况下用于自动化测试仅针对公司内某一单一的业务线,而…

既然有MySQL了,为什么还要有MongoDB?

目录一、基本概念走起二、MongoDB的主要特征三、MongoDB优缺点,扬长避短1、优点2、缺点四、何时选择MongoDB?为啥要用它?1、MongoDB事务2、多引擎支持各种强大的索引需求3、具体的应用场景4、以下是几个实际的应用案例:5、选择Mon…

gcc后续——链接时的静态库和动态库

本篇文章是链接阶段静动态库的理解,点击查看gcc四个阶段 文章目录1 . 库检测linux所用库查找库的位置2. 动静态库的感性理解1. 动态库的理解2. 静态库的理解3. 静动态库整体理解1. 静态库和静态链接2. 动态库和动态链接3. 静动态库对比1.查询当前linux所用库2. 查看…

【洛谷】P1966 [NOIP2013 提高组] 火柴排队

其实这题本身并不难,考的知识点就是归并排序和逆序对;那么难点在哪呢?就在如何发现这题是个逆序对:至少读到这里我们可以知道,虽然火柴高度是唯一的,但我们不可能直接开一个 max long int 大小的数组&#…