论坛首页
论坛首页 开发者论坛 PortableApps开发 请教我的制作过程有什么问题?

请教我的制作过程有什么问题?

讨论关于便携软件开发的技术与问题,包括PAL、NSIS、VMware ThinApp及其他。
joshatt 两把菜刀
两把菜刀

帖子: 27
第一次尝试PAL啊. 大家帮忙, 看看我的问题在哪里.
工具和教程, 都是在本论坛学的.
尝试制作一个软件, 其本身特点是:
1, 它会自动创建C:\WYSIWYG DOCS文件夹, 在里面读写一些文件夹和文件.
2, 我经常手动运行该软件的一个导出功能-------创建c:\LOCAL PUBLISH文件夹, 导出到里面形成一些文件夹和文件.
3, 需要注册. 我已经发现并导出了一个reg文件.


制作过程:
下载并安装了PAL和NSIS, 都是portable版, 安装在并列位置.
根据本论坛"使用Portableapps.com Launcher制作便携软件:以Evernote Portable为例"一文, 照猫画虎, 先下载了模板, 然后改写了两个ini文件, 并创建了DATA文件夹, 里面创建了上述1,2两个空文件夹,再创建settings文件夹, 里面放上reg文件.........最后运行PAL, 出错了. log文件如下:
代码: 全选
MakeNSIS v2.46.3-Unicode - Copyright 1995-2009 Contributors
See the file COPYING for license details.
Credits can be found in the Users Manual.

Command line defined: "PACKAGE=G:\WYS7UniPortable"
Command line defined: "NamePortable=wys7uni Portable"
Command line defined: "AppID=wys7uniPortable"
Command line defined: "Version=2.1.2.0"
Changing directory to: "F:\PortableApps.comLauncher\Other\Source"

Processing script file: "F:\PortableApps.comLauncher\Other\Source\PortableApps.comLauncher.nsi"
Processing plugin dlls: "F:\NSISPortable\App\NSIS\Plugins\*.dll"
 - AdvSplash::show
 - Banner::destroy
 - Banner::getWindow
 - Banner::show
 - BgImage::AddImage
 - BgImage::AddText
 - BgImage::Clear
 - BgImage::Destroy
 - BgImage::Redraw
 - BgImage::SetBg
 - BgImage::SetReturn
 - BgImage::Sound
 - Dialer::AttemptConnect
 - Dialer::AutodialHangup
 - Dialer::AutodialOnline
 - Dialer::AutodialUnattended
 - Dialer::GetConnectedState
 - EmbeddedLists::Dialog
 - EmbeddedLists::InitDialog
 - EmbeddedLists::Show
 - EnumINI::KeyExist
 - EnumINI::Section
 - EnumINI::SectionExist
 - EnumINI::SectionNames
 - FindProcDLL::FindProc
 - InstallOptions::dialog
 - InstallOptions::initDialog
 - InstallOptions::show
 - KillProcDLL::KillProc
 - LangDLL::LangDialog
 - Math::Script
 - MoreInfo::GetComments
 - MoreInfo::GetCompanyName
 - MoreInfo::GetFileDescription
 - MoreInfo::GetFileVersion
 - MoreInfo::GetInternalName
 - MoreInfo::GetLegalCopyright
 - MoreInfo::GetLegalTrademarks
 - MoreInfo::GetOSUserinterfaceLanguage
 - MoreInfo::GetOriginalFilename
 - MoreInfo::GetPrivateBuild
 - MoreInfo::GetProductName
 - MoreInfo::GetProductVersion
 - MoreInfo::GetSpecialBuild
 - MoreInfo::GetUserDefined
 - NSISdl::download
 - NSISdl::download_quiet
 - RealProgress::AddProgress
 - RealProgress::DetailProgress
 - RealProgress::FileProgress
 - RealProgress::GetProgress
 - RealProgress::GradualProgress
 - RealProgress::SetProgress
 - RealProgress::Unload
 - RealProgress::UseProgressBar
 - SelfDel::Del
 - Splash::show
 - StartMenu::Init
 - StartMenu::Select
 - StartMenu::Show
 - System::Alloc
 - System::Call
 - System::Copy
 - System::Free
 - System::Get
 - System::Int64Op
 - System::Store
 - System::StrAlloc
 - TypeLib::GetLibVersion
 - TypeLib::Register
 - TypeLib::UnRegister
 - UserInfo::GetAccountType
 - UserInfo::GetName
 - UserInfo::GetOriginalAccountType
 - VPatch::GetFileCRC32
 - VPatch::GetFileMD5
 - VPatch::vpatchfile
 - dialogsEx::FileBox
 - dialogsEx::FolderBox
 - dialogsEx::InputBox
 - dialogsEx::InputRegBox
 - execDos::exec
 - execDos::isdone
 - execDos::wait
 - inetc::get
 - inetc::head
 - inetc::post
 - inetc::put
 - md5dll::GetFileMD5
 - md5dll::GetMD5
 - md5dll::GetMD5File
 - md5dll::GetMD5Random
 - md5dll::GetMD5String
 - newadvsplash::hwnd
 - newadvsplash::play
 - newadvsplash::show
 - newadvsplash::stop
 - newtextreplace::_FillReadBuffer
 - newtextreplace::_FindInFile
 - newtextreplace::_FreeReadBuffer
 - newtextreplace::_ReplaceInFile
 - newtextreplace::_Unload
 - nsDialogs::Create
 - nsDialogs::CreateControl
 - nsDialogs::CreateItem
 - nsDialogs::CreateTimer
 - nsDialogs::GetUserData
 - nsDialogs::KillTimer
 - nsDialogs::OnBack
 - nsDialogs::OnChange
 - nsDialogs::OnClick
 - nsDialogs::OnNotify
 - nsDialogs::SelectFileDialog
 - nsDialogs::SelectFolderDialog
 - nsDialogs::SetRTL
 - nsDialogs::SetUserData
 - nsDialogs::Show
 - nsExec::Exec
 - nsExec::ExecToLog
 - nsExec::ExecToStack
 - registry::_Close
 - registry::_CopyKey
 - registry::_CopyValue
 - registry::_CreateKey
 - registry::_DeleteKey
 - registry::_DeleteKeyEmpty
 - registry::_DeleteValue
 - registry::_Find
 - registry::_HexToStr
 - registry::_HexToStrUTF16LE
 - registry::_KeyExists
 - registry::_MoveKey
 - registry::_MoveValue
 - registry::_Open
 - registry::_Read
 - registry::_ReadExtra
 - registry::_RestoreKey
 - registry::_SaveKey
 - registry::_StrToHex
 - registry::_StrToHexUTF16LE
 - registry::_Unload
 - registry::_Write
 - registry::_WriteExtra

(If you get a compile error with !searchparse, please upgrade to Unicode NSIS 2.46 or later and try again.) (RequireLatestNSIS.nsh:11)
Including required files... (macro:!echo:3)
 - UAC::_
 - newtextreplace::_FillReadBuffer
 - newtextreplace::_FindInFile
 - newtextreplace::_FreeReadBuffer
 - newtextreplace::_ReplaceInFile
 - newtextreplace::_Unload
 - xml::_CloneNode
 - xml::_Coordinate
 - xml::_CreateNode
 - xml::_CreateText
 - xml::_CurrentAttribute
 - xml::_DeclarationEncoding
 - xml::_DeclarationStandalone
 - xml::_DeclarationVersion
 - xml::_ElementPath
 - xml::_FindCloseElement
 - xml::_FindNextElement
 - xml::_FirstAttribute
 - xml::_FirstChild
 - xml::_FirstChildElement
 - xml::_FreeNode
 - xml::_GetAttribute
 - xml::_GetNodeValue
 - xml::_GetText
 - xml::_GotoHandle
 - xml::_GotoPath
 - xml::_InsertAfterNode
 - xml::_InsertBeforeNode
 - xml::_InsertEndChild
 - xml::_IsCDATA
 - xml::_LastAttribute
 - xml::_LastChild
 - xml::_LoadFile
 - xml::_NextAttribute
 - xml::_NextSibling
 - xml::_NextSiblingElement
 - xml::_NoChildren
 - xml::_NodeHandle
 - xml::_NodeType
 - xml::_Parent
 - xml::_PreviousAttribute
 - xml::_PreviousSibling
 - xml::_RemoveAllChild
 - xml::_RemoveAttribute
 - xml::_RemoveNode
 - xml::_ReplaceNode
 - xml::_RootElement
 - xml::_SaveFile
 - xml::_SetAttribute
 - xml::_SetAttributeName
 - xml::_SetAttributeValue
 - xml::_SetCDATA
 - xml::_SetCondenseWhiteSpace
 - xml::_SetEncoding
 - xml::_SetNodeValue
 - xml::_SetText
 - xml::_Unload
 - xml::_XPathAttribute
 - xml::_XPathNode
 - xml::_XPathString
Loading language strings... (macro:!echo:3)
Initialising variables and macros... (macro:!echo:3)
Loading segments... (macro:!echo:3)
warning: !include: could not find: "G:\WYS7UniPortable\App\AppInfo\Launcher\Custom.nsh" (Segments.nsh:122)
warning: !include: could not find: "G:\WYS7UniPortable\App\AppInfo\Launcher\Debug.nsh" (Debug.nsh:87)
Specifying program details and setting options... (macro:!echo:3)
Error while loading icon from "G:\WYS7UniPortable\App\AppInfo\appicon.ico": can't open file
Error in script "F:\PortableApps.comLauncher\Other\Source\PortableApps.comLauncher.nsi" on line 150 -- aborting creation process
最后由 joshatt 编辑于 2012-03-31 8:19,总共编辑了 1 次

joshatt 两把菜刀
两把菜刀

帖子: 27
我的\App\AppInfo\Launcher\wys7uniPortable.ini 如下:
代码: 全选
[Launch]
ProgramExecutable=WYSIWYG Web Builder 7 UNICODE\WebBuilder.exe  ;主程序位置
DirectoryMoveOK=yes          ;路径改变并不会影响便携软件运行,因此检测到路径改变时不提示警告。

[Activate]
Registry=true ;表示本软件需要写注册表

[DirectoriesMove]
DATA\Local Publish=C:\Local Publish   ;当软件启动时,原%LOCALAPPDATA%\Evernote会被重命名(备份)为%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable,当软件结束时,%LOCALAPPDATA%\Evernote会被删除,%LOCALAPPDATA%\Evernote-Backup-by-EvernotePortable被重命名(恢复) 为%LOCALAPPDATA%\Evernote。(-=)的意思是程序结束时不将%LOCALAPPDATA%\Evernote备份到便携软件Data目录,因为这几个目录主要是日志、临时文件,没有备份到便携设备的必要。如果需要备份到Data目录,则将“-”指定为其他名称。下同。
DATA\WYSIWYG docs=C:\WYSIWYG docs

[DirectoriesCleanupIfEmpty]
1=C:\Local Publish    ;如为空目录,则在结束时删除目录,避免留下垃圾文件。下同
2=C:\WYSIWYG docs
3=%USERPROFILE%\My Documents\WYSIWYG Web Builder

[RegistryKeys]
wysiwyg7sn=HKEY_CURRENT_USER\Software\Microsoft\Windows Script

[RegistryValueWrite]

[RegistryCleanupIfEmpty]


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

帖子: 213

看最后:
Error while loading icon from "G:\WYS7UniPortable\App\AppInfo\appicon.ico": can't open file
找不到图标文件。需要把ico放到以上位置中去。

joshatt 两把菜刀
两把菜刀

帖子: 27
谢谢. 不小心把ico拉下了.

加上ico,制作终于完成了. 试着运行, 发现教程中的;注释句子 会导致错误. 去掉了所有分号注释, ok了.

新问题来了: 运行软件弹出注册窗口. 是我写注册表失败了? 还是需要把写注册表提前? (我是这样做的: 我分析注册表后导出的reg文件是: \DATA\SETTINGS\wysiwyg7sn.reg)
代码: 全选
[Launch]
ProgramExecutable=WYSIWYG Web Builder 7 UNICODE\WebBuilder.exe
DirectoryMoveOK=yes

[Activate]
Registry=true

[DirectoriesMove]
DATA\Local Publish=C:\Local Publish
DATA\WYSIWYG docs=C:\WYSIWYG docs

[DirectoriesCleanupIfEmpty]
1=C:\Local Publish
2=C:\WYSIWYG docs
3=%USERPROFILE%\My Documents\WYSIWYG Web Builder

[RegistryKeys]
wysiwyg7sn=HKEY_CURRENT_USER\Software\Microsoft\Windows Script

[RegistryValueWrite]

[RegistryCleanupIfEmpty]

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
运行软件以后可以看一下注册表看看你的reg文件有没有正确导入。
还有就是那个reg文件是不是正确的。
手动导入reg文件,运行看看是不是不会弹出注册窗口

joshatt 两把菜刀
两把菜刀

帖子: 27
多谢版主. 你的方法很管用. 我用它逐步查找故障. 后来在PA英文论坛发贴问了一些东西, 又尝试多次, 终于拼凑成功我的第一个便携版软件了. 但还是糊涂着呢. 请教:
1, [RegistryKeys]
test1=HKCU\Software\AppName
这个功能中的test1.reg文件, 应该是单键的吧, 就是只有一行[hkcu\......\xxxx], 当然里面的值可以有多行. 我就这么搞的, 按此原则我分成了4个reg文件, 是成功的......我理解对吗?

2, \xxxxPortable\App\AppInfo\Launcher\xxxxPortable.ini
为什么下载来的一些标准的PA便携软件, 都没有这个文件呢? 难道都不是用模板制作的?

paulhybryant 头像
分舵香主
分舵香主

帖子: 56
test1=HKCU\Software\AppName的意思是
把HKCU\Software\AppName这个键的内容备份,然后导入test1.reg里的所有内容。
test1.reg里面的内容并不需要是单键的。

xxxxPortable.ini这个文件不存在有两个可能:
1. Launcher的源代码没有公开
2. Launcher是编译Other\Source里面的NSIS代码(如果有的话)生成的

joshatt 两把菜刀
两把菜刀

帖子: 27
test1=HKCU\Software\AppName的意思是
把HKCU\Software\AppName这个键的内容备份,然后导入test1.reg里的所有内容。
test1.reg里面的内容并不需要是单键的。

按这个理解, 就是单键的意思吧----备份只有HKCU\Software\AppName这1键. 当然如果备份单键, 但导入多键(多出的部分不需要事先备份), 也可以理解为多键


回到 PortableApps开发