论坛首页
论坛首页 开发者论坛 Beta试验场 百度影音1.0.27.140便携版

百度影音1.0.27.140便携版

公开发布前的软件测试。在此投递您的作品。

版主: David Pi

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
软件百度影音
分类:应用软件
软件介绍:百度的本地和在线视频播放软件
便携版说明:本便携版根据官方1.0.27.140版本制作,去掉了自动更新和用户使用统计数据上传。设置保存于 Data\settings 。

下载百度影音便携版测试2
(12MB下载/46MB安装)

发行说明:

百度影音便携版 测试2(2012.3.7):

[list]
[*] 修改了注册表Key的备份
[*] 修改了火狐插件注册表的备份
[*] 修正了环境变量的使用,更好兼容Win7和XP
[*] 需要注册dll,必须以管理员运行
[*] 百度影音下载目录便携化

百度影音便携版 测试1(2012.2.17):

[list]
[*]首次发布,基于官方1.0.27.140版本。
[*]去掉了自动更新和用户使用统计数据上传
[*]启动自动添加文件关联,退出时解除文件关联
[*]本便携版本在Windows7下测试使用正常。尚未在XP下测试。
最后由 paulhybryant 编辑于 2012-03-08 2:51,总共编辑了 1 次

David Pi 头像
建寨老工
建寨老工

帖子: 213

Hi paulhybryant。我看了,很不错。提一点建议:

1、为了不破坏系统内安装的其它百度软件,不应该备份整个Baidu根目录。
BaiduPlayerPortable=HKEY_LOCAL_MACHINE\Software\Baidu\BaiduPlayer

2、为避免破坏其它火狐插件,应该仅备份百度影音插件的注册表值:
MozillaPlugins=HKLM\Software\MozillaPlugins\@baidu.com/npxbdyy

3、AutoUpdate=%PROGRAMDATA%\Baidu\
这一行有两个问题。一是PROGRAMDATA这个变量在Vista以上系统才有,应该用PAL自带的%ALLUSERSAPPDATA%这个变量(文档)。第二个问题是最后多了个后斜杠,你也知道,会导致移动失败(同样的问题还有第97行)。

4、%USERPROFILE%\AppData\LocalLow
这样写,仅能适应Vista以上系统,另外硬编码也是应该尽量避免的。应该通过CustomCode,创建一个环境变量LocalLow,根据不同的系统,对LocalLow赋予不同的值:
代码: 全选
${SegmentInit}
   ${If} ${AtLeastWinVista}
      System::Call `shell32::SHGetKnownFolderPath(g"{A520A1A4-1780-4FF6-BD18-167343C5AF16}",i0x4000,in,*w.R0)`
      ${SetEnvironmentVariablesPath} LocalLow $R0  ;用WinAPI得到LocalLow目录位置
   ${Else}
      ${SetEnvironmentVariablesPath} LocalLow $LOCALAPPDATA ;在小于Vista的系统,赋予LocalLow 其它值。
   ${Endif}
!macroend

然后在Launcher.ini中直接使用%LocalLow%这一变量。

5、Custom.nsh 中的问题:
代码: 全选
    ${If} $Bits = 64
        StrCpy $SYSTEM32DIR "$WINDIR\SysWOW64"
    ${Else}
        StrCpy $SYSTEM32DIR "$WINDIR\system32"
    ${EndIf}
Delete $SYSTEM32DIR\bdsecushr.dat

这是没有必要的。因为NSIS是个32位程序,在64位系统中,$SYSDIR会被操作系统重定向到$WINDIR\SysWOW64,直接Delete $SYSDIR\bdsecushr.dat,即可,无论在32位或是64位系统。

6、$PROGRAMDIR 的问题:
PAL在处理非正常退出时,会跳过Pre的所有区段,直接执行Post恢复。那么你在 ${SegmentPreExecPrimary} 将 $PROGRAMDIR 赋值,在非正常退出恢复的时候,会跳过赋值所在的区段。那么你写在在 ${SegmentUnload} 里的 $PROGRAMDIR 就会是一个空值了。应该注意,由于要考虑到崩溃恢复问题,可认为 Pre 区段设置的所有变量都不能传递到 Post 区段。应该在 SegmentInit 中赋值,或者作为常量在文件头部 !define 。

7、反注册Dll的问题:
我觉得为了避免破坏系统中已安装的程序,处理DLL应该有这几步:
1、用Total Uninstall监视DLL注册过程中修改的所有注册表。在Launcher.ini中备份。
2、在 ${SegmentPreExecPrimary} 中注册DLL。
3、在 ${SegmentPostExecPrimary} 中反注册DLL。
如果关于DLL的所有注册表都备份了,第三步可以省略(恢复注册表即可)。
${SegmentUnload} 是用来卸载 Launcher 留下的文件(一般是删除释放的NSIS插件)。
如果不备份注册表的话,便携软件结束后本地安装的程序就被破坏了。

8、盘符升级功能:
观察到播放器在数个配置文件中保留了最近播放列表,作为标准PortableApp,应该有盘符升级功能。可用[FileWriteN]+Replace升级记录文件中的盘符。

9、关于配置文件:
观察到主配置文件保存在 Data\BaiduPlayerLocalLow\conf.db ,这其实是一个文本配置文件。可用 [FileWriteN]+ConfigWrite 来写配置,特别是其中的DownLoadSavePath等几个路径需要便携化。还有自动升级等选项,可每次启动时强制关闭。

10、在 reg 文件中使用环境变量:
只有在Launcher.ini中才能使用%PAL:AppDir%这样的环境变量,在reg文件中的环境变量是不会被解析的。应该用 [RegistryValueWrite] 来写入注册表。

11、临时文件关联问题:
可写入HKCU而非HKLM,HKCU中的文件关联具有更高优先级,且不需要管理员权限。

12、管理员权限问题:
因注册DLL需要管理员权限,不清楚百度影音是否必须注册那几个Dll。如果必须的话,还应该设置RunAsAdmin。

呵呵,就是这些。最好多装几个虚拟机,在不同的系统(XP+Win7+Win7 X64)用Total Uninstall监控,都能保持干净、功能正常,从一个系统复制到另一个系统可以无缝衔接,就可发布了。请解决以上问题,以便正式发布。

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
非常谢谢David的意见和建议。我有些问题。

David Pi 写道:

10、在 reg 文件中使用环境变量:
只有在Launcher.ini中才能使用%PAL:AppDir%这样的环境变量,在reg文件中的环境变量是不会被解析的。应该用 [RegistryValueWrite] 来写入注册表。



这些变量是在运行时被读取的,用PAL做的便携版启动之后应该会有一个进程级的%PAL:AppDir%环境变量。
所以reg文件里面写这个是不是应该也没有问题?
我这么问是因为如果有一个reg文件里面有很多的路径,那么[RegistryValueWrite] 这个section就会很长。
如果能用%PAL:AppDir%直接替代reg里面原来的路径然后导入reg那么出错的可能性会小一些。
也许有一些场景这样写reg会出问题我不知道。所以麻烦David解释一下。

David Pi 写道:
12、管理员权限问题:
因注册DLL需要管理员权限,不清楚百度影音是否必须注册那几个Dll。如果必须的话,还应该设置RunAsAdmin。


Xbdyy.dll是IE的百度播放器的插件,所以是需要的。npxbdyy.dll是mozilla的插件。
其他的几个dll是解码器的。这些是否需要不一定,但是在安装过程中这些dll都被注册了。

David Pi 头像
建寨老工
建寨老工

帖子: 213

这个问题试一试就知道了,只有Launcher.ini中的环境变量才会被解析,有时候等号左边的变量都不会被解析,关键是源码中有没有调用 ${ParseLocations} 这个命令。

可以在开启UAC的环境中试一试,如果不提权无法正常运行,可能就需要设置RunAsAdmin。

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
等号左边的变量是不会被解析的,至少在DirectoriesMove里面的是这样。在PortableApps.com的论坛上问过。
我的意思是导入的时候存在注册表里面的时候还是包括%PAL:AppDir%变量(并不是在导入的时候被替换成实际的路径),
但是只要这个变量被引用的时候(运行时)能被正确的被Expand就可以了(因为PAL为这个程序创建了%PAL:AppDir%这个环境变量)。

David Pi 头像
建寨老工
建寨老工

帖子: 213

paulhybryant 写道:
等号左边的变量是不会被解析的,至少在DirectoriesMove里面的是这样。在PortableApps.com的论坛上问过。
我的意思是导入的时候存在注册表里面的时候还是包括%PAL:AppDir%变量(并不是在导入的时候被替换成实际的路径),
但是只要这个变量被引用的时候(运行时)能被正确的被Expand就可以了(因为PAL为这个程序创建了%PAL:AppDir%这个环境变量)。


问题是你不知道百度影音主程序是否会解析 %环境变量% 这种写法。这种写法在nsis中也需要经过 ExpandEnvStrings 才会被解析,否则就会被当做普通的一个字串。

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
恩是的,还是不要依赖程序的行为比较可靠 :) ,谢谢。

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
关于配置文件的更新,我用了如下的代码:
[FileWrite1]
Type=ConfigWrite
File=%PAL:DataDir%\BaiduPlayerLocalLow\conf.db
Entry=' "DownLoadSavePath" : '
Value='"%PAL:DataDir%\Downloads",'

出现的问题是被替换的文件在被替换的哪一行的结尾会多一个换行符号(在VIM里显示为^M)。
比如原来是
"DownLoadSavePath" : "C:\baidu player"
替换后是
"DownLoadSavePath" : “D:\...\some dir"^M

这导致conf.db这个文件无法被读取,百度影音因此创建并使用默认的配置。

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
paulhybryant 写道:
关于配置文件的更新,我用了如下的代码:
[FileWrite1]
Type=ConfigWrite
File=%PAL:DataDir%\BaiduPlayerLocalLow\conf.db
Entry=' "DownLoadSavePath" : '
Value='"%PAL:DataDir%\Downloads",'

出现的问题是被替换的文件在被替换的哪一行的结尾会多一个换行符号(在VIM里显示为^M)。
比如原来是
"DownLoadSavePath" : "C:\baidu player"
替换后是
"DownLoadSavePath" : “D:\...\some dir"^M

这导致conf.db这个文件无法被读取,百度影音因此创建并使用默认的配置。


问题没有解决,不知道是不是PAL替换的问题。
现在通过将WorkingDirectory设为"%PAL:DataDir%,然后保存路径为".\BaiduDownloads"把保存目录便携化。
第二个测试版本已更新

极度凶残 两把菜刀
两把菜刀

帖子: 17
哇!做一个便携软件还真不是件容易的事

liuwenok 投名入寨
投名入寨

帖子: 1
同感!!表示支持!!!辛苦辛苦!!
我等正式版!!
喜欢在电脑上全用便携式软件的人!!

xiaoyunishui 投名入寨
投名入寨

帖子: 1
虽然我不懂这些代码 真心感谢你们

bxrjmajin 两把菜刀
两把菜刀

帖子: 33
原来做成便携软件需要相当的劳动啊。。。致敬

maiskyo 投名入寨
投名入寨

帖子: 3
只能看各位大神 在说天文。仅有一点点编程基础也没有意义啊。求教育

jooseng 革命同志
革命同志

帖子: 3602
David Pi 写道:
....

7、反注册Dll的问题:
我觉得为了避免破坏系统中已安装的程序,处理DLL应该有这几步:
1、用Total Uninstall监视DLL注册过程中修改的所有注册表。在Launcher.ini中备份。
2、在 ${SegmentPreExecPrimary} 中注册DLL。
3、在 ${SegmentPostExecPrimary} 中反注册DLL。
如果关于DLL的所有注册表都备份了,第三步可以省略(恢复注册表即可)。
${SegmentUnload} 是用来卸载 Launcher 留下的文件(一般是删除释放的NSIS插件)。
如果不备份注册表的话,便携软件结束后本地安装的程序就被破坏了。
....

${SegmentPostExecPrimary} 在PAL CustomCode似乎不能用。
我是用${SegmentPrePrimary} 和 ${SegmentPostPrimary}


回到 Beta试验场