论坛风格切换切换到宽版
  • 9693阅读
  • 17回复

文件关联头文件(Assoc.nsh)(08.2.27更新) [复制链接]

上一主题 下一主题
离线ansifa
 

发帖
211
金钱
0
威望
0
只看楼主 倒序阅读 0 发表于: 2008-01-27
回来学校啦~~~更新下

介绍:
由于写一个媒体播放器,需要关联大量文件,被重复的代码搞得心烦,所以花了一个下午
写了一个能实现文件关联的头文件,可以令NSIS编写关联文件代码更方便.
而且能完美解决各种重复关联,重复取消关联所引起的错误.
功能:
1. 关联多个文件为一个类型,如关联"*.rmvb"为"Real 媒体文件";
2. 同时关联多个文件为一个类型,如"*.rmvb;*.rm;*.ra;*.rv"为"Real 媒体文件";
3. 关联的文件可以分为(1)需要注册对象容器媒体文件(2)不需要注册对象容器普通文件;
4. 取消文件关联,支持同时取消上述的多个文件关联的操作.
5. 取消关联后可选择 恢复/不恢复 旧有关联.
_____


修正:2008年2月15日
*修正了关联错误(发布太急了,没发现,惭愧).
     就是将下面代码改好了.如果谁有以前那个的可以看看改了什么,没有直接用新的就行
     WriteRegStr HKCR "${Project}.${type}" "" "${desc}"
     WriteRegStr HKCR "${Project}.${type}\shell" "" open
     WriteRegStr HKCR "${Project}.${type}\shell\open" "" "打开(&O)"
     WriteRegStr HKCR "${Project}.${type}\shell\open\command" "" '${openexe} "%1"'
*将关联普通文件的"播放(&P)"改为"打开(&O)",这样好些.
*增加检查当前关联的宏:CheckSection


更新:2008年2月26日
增加了打开方式字串的设置,只需要在你的代码加入:
!define Ass_Str "打开(&O)"
!define Ass_Str_Media "播放(&P)"
就能设置打开方式字串,如果不设置就默认设置为 "打开(&O)" "播放(&P)".

修正:2008年2月27日
修正了取消关联后恢复的BUG.


(Assoc.nsh+一个例子)
[attachmentid=24322]


QUOTE
答问:

4楼zhfi:
1.      DeleteRegValue HKCR ".$R5" ""不错,改好了~~~
2.      将"播放(&P)"定义成一个变量?考虑过,不过这样每次进行
     !insertmacro Assoc aac,a4c,m4a "MP4" "AAC-MPEG Layer 4 音频" $exe "$Me"
     都要加上一个
     !insertmacro Assoc aac,a4c,m4a "MP4" "AAC-MPEG Layer 4 音频" $exe "$Me" "播放"
     似乎冗余很大,不如直接去改Assoc.nsh方便

8楼zhfi:
此脚本已经将关联操作备份到
WriteRegStr HKCR "Back.${Project}" ".扩展名"
而且解决了备份/恢复要处理的各种问题.

* 备份/恢复要处理的问题情况大概有(就是此代码能处理下面情况):
(下面为了方便说明,指使用了此代码的程序为a.exe,另有一个b.exe.大家都会对*.jpg进行关联,而在此之前*.jpg关联于c.exe)
1.      假设某时刻a.exe关联了*.jpg,将会备份*.jpg的旧关联为c.exe,取消关联时恢复*.jpg关联为c.exe.
2.      假设某时刻a.exe关联了*.jpg,并备份*.jpg的旧关联为c.exe.
     但a.exe关联后,b.exe夺取了*.jpg的关联.当执行a.exe取消关联时,a.exe会检测关联,
     因为关联已经被b.exe夺取,所以不能恢复*.jpg关联为c.exe.只能忽略而过.让b.exe继续关联*.jpg
3.      假设某时刻a.exe关联了*.jpg,并备份*.jpg的旧关联c.exe.但a.exe关联后,
     b.exe夺取了*.jpg的关联.然后再次执行a.exe关联*.jpg,应该将备份的关系"*.jpg的旧关联为c.exe"改为"*.jpg的旧关联为b.exe"

zhfi:
既然你坚持,就加个吧~~~哈哈

cnm512 :
原来是恢复关联时删除了*.{ext}下的全部值,导致打不开,跟4楼zhfi的问题原来是一个问题~~哈哈~~这次真的改好了
现在是:删除*.{ext}下默认值,然后判断*.{ext}子项是否为空,是则删除项*.{ext}.然后恢复.
你再试试行不...

附件: Assoc_Example.rar (9 K) 下载次数:10
NSIS狂熱分子

QUOTE

NSIS 新手群:18163599
离线TiGer-X

发帖
134
金钱
0
威望
0
只看该作者 1 发表于: 2008-01-27
支持 ansifa,ansifa 同学灌水的质量可高呢。

这函数对于解码器打包组有很大帮助,方便了不少。

仔细看了脚本,真的是一个令人头痛的著作。
离线chenmy

发帖
2863
金钱
60
威望
6
只看该作者 2 发表于: 2008-01-28
多谢 ansifa 同学,写脚本时方便了不少。
我是中国人·最爱是中文!
离线zhfi

发帖
461
金钱
190
威望
19
只看该作者 3 发表于: 2008-01-28
DeleteRegKey HKCR ".$R5" ;删除旧关联
这一个我感觉还是用
DeleteRegValue HKCR ".$R5" ""
比较稳妥。

WriteRegStr HKCR "${type}\shell\open" "" "播放(&P)"
如果再将"播放(&P)"定义成一个变量,就更加方便了。
人生若只如初见@@一轩果

MyMPC 2013(104210239)
离线爱和承诺

发帖
100
金钱
10
威望
1
只看该作者 4 发表于: 2008-01-28
前辈能不能写个Inno的代码示例啊,谢谢。
离线JunJun

发帖
438
金钱
180
威望
18
只看该作者 5 发表于: 2008-01-29
强大的小A~~呵呵
已经学习并使用了~
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 6 发表于: 2008-01-29
QUOTE(爱和承诺 @ 2008年 01月 28日 18时 33分) [snapback]344151[/snapback]

前辈能不能写个Inno的代码示例啊,谢谢。

用 INNO 是很方便的,不要写代码,直接用 [Registry] 段就行了。比如:
[Registry]
Root: HKCR; Subkey: "Real 媒体文件"; ValueType: String; ValueData: "Real 媒体文件";Flags: uninsdeletekey
Root: HKCR; Subkey: "Real 媒体文件\DefaultIcon"; ValueType: String; ValueData: "{app}\abc.ICO";Flags: uninsdeletekey
Root: HKCR; Subkey: "Real 媒体文件\shell\open\command"; ValueType: String; ValueData: "{app}\myplayer.exe %1";Flags: uninsdeletekey
Root: HKCR; Subkey: "Real 媒体文件\shell\用 My Player 打开(&O)\command"; ValueType: String; ValueData: "{app}\myplayer.exe %1";Flags: uninsdeletekey
Root: HKCR; Subkey: "*.rmvb"; ValueType: String; ValueData: "Real 媒体文件";Flags: uninsdeletekey
Root: HKCR; Subkey: "*.rm"; ValueType: String; ValueData: "Real 媒体文件";Flags: uninsdeletekey
Root: HKCR; Subkey: "*.ra"; ValueType: String; ValueData: "Real 媒体文件";Flags: uninsdeletekey
Root: HKCR; Subkey: "*.rv"; ValueType: String; ValueData: "Real 媒体文件";Flags: uninsdeletekey
离线zhfi

发帖
461
金钱
190
威望
19
只看该作者 7 发表于: 2008-01-29
只是如果需要同时也备份/恢复,实现起来就复杂了。
人生若只如初见@@一轩果

MyMPC 2013(104210239)
离线snow2000
发帖
325
金钱
10
威望
1
只看该作者 8 发表于: 2008-01-29
很好 收藏中
离线山的彼端
发帖
6
金钱
0
威望
0
只看该作者 9 发表于: 2008-01-29
谢谢楼主,虽然现在还是看不懂