前言

最近因项目需求:安装后的程序即使拷贝其他电脑也不使用,安装包只能在一台电脑安装,在此电脑安装后不能在其他电脑安装即使单独拷贝安装包也不能安装。另外就是不使用加密狗或者license key等,而且也没有服务器不联网。最后就是发布的安装包随U盘交付给客户。

这里记录分享下自己的实现过程及方法

解决方案

只有一天不到的开发时间(临时发客户)还有需求限制(也包括自己的水平)的情景下首先想到的最简单最快的办法就是利用识别文件来当做软件运行和安装的条件。根据需求功能分了3部分:1.安装后的程序防拷贝:安装程序时在用户电脑生成一个文件,当然这个文件只有你知道在哪,程序启动时判断文件是否存在,如果程序被拷贝至其他电脑那肯定没有你生成的文件,就不执行或者给个提示未授权。这样就很简单完成了第一个需求功能。2.U盘里的安装包防多台电脑安装:一开对U盘做手脚折腾了一阵子,还是觉得利用文件作为条件判断最简单有效。安装包执行后要在U盘里面生成文件,里面还需要保存电脑的一些硬件配置信息比如MAC地址、CPU型号,这样用U盘在其他电脑安装时通过安装程序判断文件里面的电脑硬件信息就可知道是不是原始安装电脑,如果不是直接退出程序安装。貌似是解决了多台电脑安装的问题。3.U盘安装包防拷贝安装:这个就是用户将安装exe从U盘拷贝走安装防护,这个思路和第一部分一样,在U盘生成一个文件,安装时检测文件是否存在,不存在就退出安装,这样拷贝走也不能安装。这一部分属于出场设置一样,提前在U盘生成一个文件。
重点哈:标识文件赤裸裸的在U盘里面客户全部拷贝不一样使用,所以需要对这些文件做些保护,至少不能直接被客户看到,首先想到的就是设置隐藏,不过这未免也太low了,简单的文件隐藏属性一般人都能察觉(至少交付给测试同事的时候他还有意识的点开了查看隐藏文件,不过他失望了啥也没看到0_0)。因为这里追加了一个属性就是将文件属性设置成系统+隐藏属性。即使点击文件查看隐藏文件也不会显示出来。而且即使你发现了你也改不了,有很多恶意病毒也利用过这点。当然对程序员来说就很简单了,cmd敲一行命令即可去掉系统隐藏属性。我也直接给大家贴出来了:

attrib G:\ProgramFiles +s +h
这个是对ProgramFiles文件夹设置系统隐藏属性,去除就是-s -h,文章后面我也增加了C++设置文件系统隐藏属性的代码。

方法虽然简单,可落地也经历了不少麻烦事。其实是对Inno setup打包工具编码不是很熟悉。毕竟在安装时需要运行exe检查文件以及获取安装电脑硬件信息并写入文件。这些操作都离不开inno setup打包程序。

BB了那么多下面写下实现过程

使用Inno Setup打包Qt exe程序

需要发布的程序是基于Qt平台的,因此在使用Inno setup打包前需要先打包Qt运行环境,Qt程序运行环境打包操作方法我也简单说明下,
1.新建一个文件夹将你工程release下的exe文件拷贝进去。比如:
2.根据你exe的编译器版本选择启动

在cmd中将目录切换至刚才新建的文件夹中。
然后输入指令:windeployqt RunbeforInstall.exe,这里你写自己的exe.运行完成后文件夹里面就会有exe运行需要的Qt文件

如果你的exe还依赖其他dll,也要拷贝到此目录,这时候双击exe是可以直接运行的。

运行环境打包完毕,后面就是要使用Inno Setup打包成安装包exe,这个需要下载一个Inno setup工具,网上有。我就介绍下怎么使用:
1.打开Inno Setup

选择 File->New,弹出窗口后点Next
App Name就是你应用程序的名字就像,其他看着填。下一步即可

这里指定安装包在安装时生成的目录名称用程序名即可。下一步

这里就需要点击“Browse”选择我们刚才打包好的Qt运行环境里面的exe,其他依赖文件点击Add folder,文件点击Add file,

添加完成后点击下一步:

这里没啥说的,,直接下一步:

不需要的话可以直接下一步,我这里不需要。。。

没中文,,,只能英文,下一步:

这里是指定你打包的安装包输出路径以及安装包的名称。不填写默认在你打包的exe同级目录下Output文件夹里面生成。直接下一步,点完Finsh:

这个文件可以理解成生成安装包的源代码文件,还需要编译后才能生成安装包exe,其实前面的引导界面也就是生成了这里面的代码,一般熟悉inno的都是直接使用源文件的,当然有界面会方便一点。这个弹窗可以选择否,因为还有点地方需要修改,刚才我们添加了文件夹,需要在[Files]字段的DestDir:{app}后面加上文件夹名,如下图:
{app}可以理解成exe打包安装目录,如果不加你会发现安装包运行后那些文件夹里的文件全部和exe释放一起了,运行时文件路径不正确。这也是我踩的第一个坑,毕竟边学边用。
然后点击保存,然后点击编译按钮,那个绿色圈圈的,在保存按钮右侧:

编译后会在生成一个stup.exe,直接运行就可以安装了。

到这里普通的安装就算成功了,不过我这里还有许多工作要做,就是安装时检测电脑硬件信息以及生成系统隐藏属性文件。由于没时间去研究inno setup的编码功能,就写一个exe专门做检测和生成文件,在安装包运行的时候调用这个exe进行检测。
这就需要修改iss文件(刚才打包编译的inno setup源代码文件),增加功能代码安装前运行检测exe,(CSDN的博客编辑在这里有点坑爹,我粘贴Inno 代码会导致文档为空。。。。还好提前保存了)我只能截图了。。。

代码意思对程序员不难理解,[Code]字段是函数代码段,procedure Fun();这是定义一个函数。紧跟其后是函数内容。Exec(ExpandConstant(’{app}\RunbeforInstall_boxed.exe’), ExpandConstant(’{src}’),’’, SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode)这是调用其他exe的执行函数,第一个参数是你要调用的exe,第二个参数是调用exe的输入参数(main函数的参数),后面的默认,最后一个ResultCode是你exe Main函数返回值。我这里因为需要在安装包路径下生成系统隐藏文件并写入MAC地址信息,所以需要传入安装包执行路径’{src}‘,也就是我U盘的路径。如果检测失败可以返回1,安装程序根据返回值判断要不要结束安装。
函数调用是在[Files]字段中添加,Flags:deleteafterinstall BeforeInstall: RunOtherInstaller。

Source: "E:\Ligs2.0\RunbeforInstall_boxed.exe"; DestDir: "{app}"; Flags: ignoreversion deleteafterinstall
Source: "E:\Ligs2.0\主程序.exe"; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: RunOtherInstaller

RunbeforInstall_boxed.exe是我需要在安装包运行时调用的程序,用来检测是否可安装,BeforeInstall: RunOtherInstaller这个属性要加在exe下一条指令上,至于原因是exe是在安装包释放到app目录执行的,如果你加在第一条指令上会提示找不到exe,因为它还没拷贝过来。可能还有别的办法不过我也没时间追究了。有兴趣的可以研究研究。
本想把Qt生成系统隐藏属性的代码分享下,由于时间问题就不整理了,而且代码也很简单,就是生成文件设置下属性,属性设置代码我给大家贴出来:

#include <windows.h>
SetFileAttributes((LPCWSTR)tempHideDir.unicode(),FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN);//tempHideDir可以是文件夹也可以是文件名。

还有很多细节没时间写了。至于inno setup的编码可以网上查下资料,也可以查看自带的帮助手册,也很全有demo。

整理下流程

写了2个exe(不算发布主程序)封装于setup安装包中,一个是在安装包install完成后调用,运行时在C盘下某个路径生成一个启动辨识文件(系统隐藏属性)为了防止程序拷贝使用。另外一个是在setup安装包运行前调用检测U盘中是否有出场设置生成的标识文件有的话就保存电脑硬件信息(系统隐藏属性),防止安装包多台电脑安装以及拷贝安装。

想记录的东西太多又想分享的细节一点奈何有心无力。挺扯蛋的一个解决办法。勿喷,,,,交流学习可以~~

Qt/C++程序防拷贝及限制多次安装的一个简单案例相关推荐

  1. 打地鼠程序代码C语言,自己用C写的一个简单的打地鼠游戏代码出了个问题(鼠标和循环不能...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 b=0; /*保证上面不出界*/ if(a>getmaxx()-R) a=getmaxx()-R; /*保证右边不出界*/ if(b>getm ...

  2. python程序30行_30行Python代码,打造一个简单的微信群聊助手,简单方便

    大家都知道,最近代码君迷上了Python,一直在研究这门语言,还是那句话,人生苦短,我学Python,今天代码君要教大家一个黑科技,30行代码实现自己定制的微信群聊助手,这个助手有什么用呐,就是用来活 ...

  3. 嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序

    第一个嵌入式QT应用程序 在成功安装 Qt Creator 开发环境后,我们通过一个简单的嵌入式Qt应用程序,来说明一下如何构建和编译一个Qt界面应用程序. 关于如何安装并构建 Qt Creator ...

  4. 苹果电脑拷贝文件到u盘很慢_U盘防拷贝哪家比较好?哪个做得好?

    U盘防拷贝软件是可以加密U盘,将U盘里的文件加密,不让人随意查看文件.将文件放在防复制U盘中,如果在自己不知情的情况下U盘被他人使用了,不用担心里面的文件丢失或者被窃取.可以设置访客权限和密码,设置访 ...

  5. 嵌入式linux qt 开源,嵌入式Linux应用程序开发-(1)第一个嵌入式QT应用程序

    第一个嵌入式QT应用程序 在成功安装Qt Creator开发环境后,我们通过一个简单的嵌入式Qt应用程序,来说明一下如何构建和编译一个Qt界面应用程序. 关于如何安装并构建Qt Creator开发环境 ...

  6. 用java开发一个简单的安卓程序,Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  7. 使用timer控件创建一个简单的报警程序

    简介: 当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了"一会儿"去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来 ...

  8. JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)

    JAVA加密狗(JAVA程序加密保护,防拷贝和防止反编译)      众所周知,java为开发语言提供了很方便的开发平台,但开发出来的程序很容易在不同的平台上面被移植,现在越来越多的人使用它开发软件. ...

  9. asp打开exe执行本地程序._基于QT应用程序打包成可执行程序exe

    [本文属原创,转载请附上原文出处链接.] 众所周知QT编译好的应用程序依赖很多动态链接库,不能方便的在其他PC上使用.这里介绍QT5版本的应用程序打包成可执行EXE的方法. 首先把QT应用程序项目编译 ...

最新文章

  1. ipad连接电脑_Ipad已经停用需要连接iTunes的一种解决方案,
  2. Redis附加功能之键过期功能
  3. opencv python destroyAllWindows() destroyWindow() 销毁窗口
  4. 解决ssh远程连接错误问题
  5. RunTime.getRunTime().addShutdownHook的用法
  6. 【最新合集】IDEA 快捷键整理
  7. java调用julia脚本,Julia请求脚本中的用户输入
  8. [蓝桥杯2018初赛]全球变暖-dfs,bfs,连通块
  9. python r语言 作图_生物医学绘图,Python 并不比R语言差
  10. oracle12 快照保存时间,【AWR】调整AWR数据采样时间间隔及历史快照保留时间
  11. DOM JS实现动态表格
  12. Tomcat的部署+第一个Servlet
  13. Linux下安装与使用本地的perl模块
  14. Python 处理视频文件
  15. CSS中animation动画-详解
  16. 32位plsql连接64位Oracle数据库
  17. 2017全国高校计算机大赛,我校在2017中国高校计算机大赛中获全国高校银奖
  18. Cadence OrCAD Capture 检索和定位功能的介绍图文视频教程
  19. Timer延时任务和ScheduledThreadPool执行延时任务
  20. 全球与中国丁苯乳胶市场应用前景及营销渠道分析报告2021~2026年

热门文章

  1. 2018年股市行情点评
  2. java正则表达式中的数量词
  3. Java自定义异常类以及异常拦截器
  4. Wallpaper Engine创意工坊下载
  5. C# word 转换成pdf 并且修改其中控件内容
  6. iptables策略详解
  7. 90后乱花钱?报告:攒钱是花钱4.5倍,初次理财比父母早10年
  8. 2022-2028全球与中国液化石油气储罐市场现状及未来发展趋势
  9. 树莓派4b:PWM调速风扇+DIY亚克力板外壳的定制降温方案
  10. 【Linux基础】zsh 和 Oh My Zsh