Notes


  • 首页

  • 归档

  • 标签
Notes

Visual Studio 硬盘版制作教程

发表于 2015-09-18

很多人问我这个 VS 硬盘版是如何自己定制出来的,所以在这里写一篇简略的教程。相关代码在此

首先要说的是,制作 VS 硬盘版的过程,其实和制作所有其他绿色软件的过程是完全一样的。但由于 VS 本身的巨大体量以及和系统的高度耦合性,导致整个过程中的大坑小坑不计其数。这个过程真的很复杂,所以至少现在我还没有那个精力把它写成一篇详尽的新手教程(说白了,搜索引擎能查到的东西我都不会写在这里)。真的想要做一个符合自己需求的VS硬盘版,你一定要会编程进行基本的文件和文本处理(貌似是废话)。本文仅仅是作为一个摘要,给后人指路。

准备工作

首先是虚拟机。现在的vs已经不支持xp系统了,所以选择在vmware里安装一个纯净的win7系统。至于装64位还是32位看你的需求。装完之后记得把杂七杂八的预装软件都删了,清清垃圾文件之类的。贵在纯净(这里推荐过期罐头的纯净系统)。虚拟机硬盘可以分两个区,设置为只恢复C盘快照,这样会方便一些,不分也无所谓。

下一步单独提一下,如果你需要使用.net平台语言,那么一定要把系统预装的.net framework卸载掉(不要偷懒,除非已经是最新版了,不然就卸载),装上你要定制的那个VS版本所对应的.net framework。列几个较新VS版本的对应关系:

Vs2017: 4.6.1
Vs2015: 4.6.1
Vs2013: 4.5.1

如果想偷懒就直接装微软官方最新版的.net framework也可以。严格按照对应版本安装只是为了减少一点体积。自用的话这个就不重要啦。

然后是需要在虚拟机里运行的软件:RegWorkShop用于编辑注册表,TotalUninstaller用于批量删除不需要的软件(裁剪VS的功能就靠这个)以及大杀器Total Uninstall(下面简称TU)。

这里要注意,TotalUninstaller和Total Uninstall是两个不同的软件哦。前面一个我给地址了,后面一个自己百度找下载,我们需要这个TU软件的专业版或者旗舰版。

那么现在.net framework装好了,软件也都放进虚拟机了,这时候用虚拟机做一个初始虚拟机快照,同时再用TU创建一个初始TU快照。虽然名字都叫快照,但它们是完全不同的东西。

这些都搞定之后就可以装VS了,需要哪些功能就装哪些功能,尽量别全装,反正一会儿还要删的:)

如果你是从头开始下载安装这些东西,那么等最后一步装完VS,应该一天时间已经快过去了。装完之后其他的事情啥都别干,立即再用虚拟机做一个VS快照。OK,现在准备工作已经完成,接下来的一两星期时间里,你可以反复尝试下面列出的这些步骤直到成功或者放弃了。如果出了什么问题(那几乎是一定的),不要灰心,只要恢复到之前的快照,然后一切重来就行啦:)

精简

打开TotalUninstaller。你会发现它列出了很多原先在控制面板的“添加和删除程序”里看不到的软件。所谓定制嘛,就是你需要一个一个弄清楚它们的作用,自己判断是否需要这个功能,并把不需要的卸载掉(在前面打勾,然后批量卸载即可)。

那么这个时候分歧就出现了。可能有人想保留ASP.net开发功能,有些人不需要C++语言,而另一些人不需要.net语言,这时候该保留哪些功能呢?又该删除哪些呢?很遗憾,我没有准确的答案,需要你自己来试验。最简单的判断方法,就是看删掉某个功能之后,你是否还能按你的需求正常使用VS,而不是发现你要的功能找不到了(所以有可能需要反复实验)。

举我自己制作VS2013的例子。对于我来说,我只用C++/.net做桌面开发,也不搞通用应用,那么我ASP.net之类的功能压根一开始就没装,另外删除的软件大概是这样的:

  • 所有名字里带2012的软件。vs2012的东西留着干啥。

  • 所有名字里带phone/arm的软件。我不开发wp,没用。

  • Silverlight/Blend。我顶多用一下wpf而已。

最后我按照自己的需求,卸载了大概60多个软件。这里提示一句,如果你只需要C++开发功能,可以尝试不用VS,而使用QtCreator+别人提取好的VS编译器。我觉得现在QtCreator的C++代码提示功能不比VS差。

看看感觉删得差不多了,再用虚拟机做一个精简快照,用TU也做一个精简快照,好,这一步也搞定了。

注意,到目前为止我们做了三个虚拟机快照:初始快照,VS快照和精简快照。以及两个TU快照:初始快照和精简快照。TU的快照都存放在TU安装目录下的System Snapshots文件夹下。只要把所有快照文件都拷贝进去就可以被TU软件所读取分析。不解释为什么要这么做,你做了就知道了。

提取

在安装任何软件的过程中,Windows做的事情其实只有两种:写文件和写注册表。而硬盘版其实就是快速重现一个软件的安装过程。我们利用Total Uninstall的“比较系统快照”功能来比对一下初始快照和精简快照,即可找出安装VS前后写文件以及写注册表的情况。一般来说硬盘版之所以安装快,是因为不需要再往安装目录拷贝大批文件,只要写入注册表的改动部分就行了。

那么是不是把注册表的改动重新打包为安装程序,软件的硬盘版就算是做好了呢?对于一些小软件来说是可行的,而对于VS来说,并不是。

从Total Uninstall的快照比较结果可以看出,就算是精简安装VS2013,也会占用大概9个G左右的C盘空间,而且安装过程中往C盘的windows文件夹(主要是.net framework相关目录)拷贝了大量文件。这部分文件是不好乱动的。即使是硬盘版,安装时也必须把这一部分文件拷贝到原先C盘对应的目录下。这是制作过程中需要注意的小问题之一。事实上为了保险起见,我发布的版本会把除了VS默认安装目录(就是安装的时候可以改的那个目录)之外的其他文件都复制到C盘的原始位置,这是为了尽量和VS原本的安装过程保持一致。

然而我们的最终目标是在不出问题的情况下做到尽量精简,这又该怎么办呢。下面就是坑最多的环节了。打开TU的快照比较结果,很明显分为三个部分:文件系统,注册表和服务。其实服务还是注册表,不用管它,只看前面两个。可以告诉大家的是,我最后把9个G的硬盘占用精简到了5个G。做一个硬盘版软件我们并不需要顾忌太多,文件系统和注册表里其实有很多可以删除的东西。这个时候直接在TU的快照比较结果里删除就行了,删完之后分别把注册表修改记录和文件系统修改记录导出即可。

删除的东西:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs 删除并利用脚本添加
C:\ProgramData\Package Cache
C:\Users
C:\Windows\Installer
C:\Windows\Microsoft.NET\Framework\v4.0.30319\SetupCache
C:\Windows\Panther
C:\Windows\rescache
C:\Windows\ServiceProfiles

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print
HKEY_USERS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\Path 删除并利用脚本添加
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet 只保留control和services

那么这个时候分歧又出现了。原因还是上面那个:可能有人想保留ASP.net开发功能,有些人不需要C++语言,而另一些人不需要.net语言,这时候是不是还有其他的东西可以删除呢?我仍然不知道。自己慢慢试吧,出错了还原系统快照就行了。祝你玩得开心。

打包

我使用InnoSetup制作最终的硬盘版安装文件。如果你真的做到这一步了,再去研究InnoSetup也并不迟。这一步的坑其实一点不比上一步少,然而我已经踩过一遍之后写工具把坑都填平了。上一步里我们导出了注册表和文件系统的修改记录,那么现在就是把这些记录转化为InnoSetup的安装脚本了。

首先处理文件系统修改记录,只要读取记录并把所有新增文件拷贝出来就行了。反正这部分工作我是写代码完成的。你可以把文件拷到虚拟机里,也可以拷到客户机里。这个在我的代码里改改就行。

然后是处理注册表的修改记录。事实上就是把注册表内容直接转换为安装脚本文件。然而这里面的坑多得令人发指,主要是我使用的转换软件bug太多。但是并没有什么可以担心的,我的代码里都处理过了。如果有新坑,你就看看代码,模仿我的方式处理一下就好。

最后还有一点小的,就是把开始菜单的那些快捷方式也转换为安装脚本。这个也有工具,但是工具也不完善,所以我也写代码填了一些坑。其实这个不复杂,手工搞搞就好。

所有安装脚本制作完毕之后就可以放到InnoSetup里编译为最终的硬盘版安装文件了。编译完可以放到客户机上安装测试一下。如果出错了那么就从最前面的第一步开始查错,重来~ 一般来说单单是最后这整个的打包工作就需要一个小时才能完成一次,乘以新手试错的次数,现在你可以想象一下真正成功做完所需要的时间了:)

为什么要做这个?

简单来说,因为我之前用了五年cntrump制作的VS2008硬盘版。从我和身边人对这个版本的评价来看,我感觉这个东西对很多程序员来说,可能是一个所谓“用户不知道自己有”的需求。但是搞这种东西毕竟不是那么光明正大,所以我只是把它放在那里,你觉得可能有用,就问我要来看看。要是想自己定制一个,踩这个巨坑,这篇文章也算是指了条路。至于这条路有多难走,自己试过才会知道。

版本相关Tip

VS2015:Windows Diagnostic Tools 是debug用的,不要删掉。

VS2017:这个版本由于拥抱开源并且启用了新的模块化安装模式,虽然体积减小了不少,但某些模块的设计逻辑也不再是微软的风格,比如vs启动插件模块时会去ProgramData里的某个文件(而不是注册表)下读取VS的安装目录,需要在安装时做特殊处理。详见pathman工程的代码。

Notes

[Win] OpenCV 管理多摄像头的最简洁方法

发表于 2015-09-18

问题描述

OpenCV 的一个常见问题是它不支持枚举摄像头,连 StackOverflow 上都只给出过很土的方法(类似于穷举),就是依次增大摄像头编号,然后测试它们能否正常工作。就算是用这种土办法得到摄像头的个数,获取摄像头名称或者调整摄像头参数的功能仍然是 OpenCV 的自带 API 所不具备的。

源码分析

OpenCV 从 2.3 版本开始将内置的摄像头操作类由 VFW 换成了 VideoInput,它主要是对DirectShow的一层封装。通过阅读源码可以看出 OpenCV 只是对 VideoInput 库函数的简单利用,为了实现 OpenCV 自身 API 的跨平台,很多 VideoInput 原本自带的功能例如获取摄像头名称以及设置曝光参数等都被屏蔽掉了。值得庆幸的是,OpenCV 作者在编写这部分代码的时候仅仅是将头文件中的函数名以及数据类型做了简单屏蔽,绝大部分函数体仍然完整存在于 OpenCV 的源代码中并在编译过程中保留了下来。这样只要找到 VideoInput 库自带的头文件,就可以把 VideoInput 的自带函数重新利用起来了。

解决办法

看一下 OpenCV 的源码(搜一下 VideoInput 就行啦),按照里面标出的 VideoInput 版本号(其实一般最新版的 VideoInput 库就可以用)下载对应版本的 VideoInput.h 头文件,并添加至工程即可。就这么简单。

唯一需要注意的是由于 DirectShow 是一个 COM 组件,所以程序开头需要调用一下 CoInitialize,之后便可随意使用 VideoInput 库被屏蔽的所有功能。

适用范围

很明显此方法只限 Windows 下使用。但依据类似原理去调用 Linux / Mac 的摄像头管理函数应当可行。对此有需求者不妨一试。

另外有人的电脑最多只能打开两个 USB 摄像头,打开第三个的时候会失败。大多数情况下这是硬件不支持而导致的。一个解决方案是使用 PCI 多路采集卡。

theoractice

theoractice

2 日志
© 2017 theoractice
由 Hexo 强力驱动
主题 - NexT.Muse