用InstallShield打包 在用户选择的安装目录后面追加路径的问题
2009-12-01 18:56
896 查看
InstallShild选择安装目录主要涉及到SdAskDestPath 和SdAskDestPath2函数。
这两个函数功能貌似差不多,当点击窗口上的“浏览”按钮时,又调用SelectDirNoLog(也可以是SelectDir)方法弹出选择文件夹的对话框,并返回用户选择的结果。
如果想在用户选择的目录后面追加上公司名称等目录(这样做还有一个好处,当用户直接选择安装在磁盘根目录下的时候,仍然可以再追加一个目录而不是直接把各种文件释放到根目录中,显得十分混乱),可以在SelectDir返回之后,在得到的路径后面添加上自己的目录。不过要注意检查是否有重复的问题。在用户选择目录之前一般都会有一个默认的安装路径,SelectDir返回之后应检查一下返回的结果与默认值是否相同,如果不同的话再在用户选择的路径后面追加上公司名。
不过考虑的许多软件的默认安装路径都是C:/Program Files/公司名/产品名,而用户可能是直接把盘符改为D,所以应该对这种情况作出判断,避免D:/Program Files/公司名/产品名/公司名/产品名…… 这样的结果。再扩展一下的话,如果用户已经手动创建了目录,例如在
E:/软件/公司名/产品名;然后在浏览对话框里选择了这个目录,我们也应该能够识别。
具体的可以参考以下代码:
修改前的代码
修改后
把重写后的SdAsdDestPath文件取一个名字,例如MyAskDestPathDlg.rul,函数名叫做MyAskDestPath,然后在主程序里加上#include "MyAskDestPath.rul",然后在以前调用SdAskDestPath2的地方调用自己的函数就可以实现在用户选择的目录后面追加公司名称的效果了。
PS:
SdAskDestPath和SdAskDestPath2以及其他大量系统方法的代码可以在InstallShield安装目录下的 ./InstallShield X/Script/isrt/src 目录中找到。
附:SdAskDestPath2Dlg.h源码
以上是我总结的关于InstallShield制作安装包时,在用户选择的目录后面追加一个目录的解决方法,比较简单。欢迎大家批评指教或转帖。
转帖请注明出处 http://blog.csdn.net/icycode/archive/2009/12/01/4916392.aspx
这两个函数功能貌似差不多,当点击窗口上的“浏览”按钮时,又调用SelectDirNoLog(也可以是SelectDir)方法弹出选择文件夹的对话框,并返回用户选择的结果。
如果想在用户选择的目录后面追加上公司名称等目录(这样做还有一个好处,当用户直接选择安装在磁盘根目录下的时候,仍然可以再追加一个目录而不是直接把各种文件释放到根目录中,显得十分混乱),可以在SelectDir返回之后,在得到的路径后面添加上自己的目录。不过要注意检查是否有重复的问题。在用户选择目录之前一般都会有一个默认的安装路径,SelectDir返回之后应检查一下返回的结果与默认值是否相同,如果不同的话再在用户选择的路径后面追加上公司名。
不过考虑的许多软件的默认安装路径都是C:/Program Files/公司名/产品名,而用户可能是直接把盘符改为D,所以应该对这种情况作出判断,避免D:/Program Files/公司名/产品名/公司名/产品名…… 这样的结果。再扩展一下的话,如果用户已经手动创建了目录,例如在
E:/软件/公司名/产品名;然后在浏览对话框里选择了这个目录,我们也应该能够识别。
具体的可以参考以下代码:
修改前的代码
case SD_PBUT_CHANGEDIR: //svDirLov是调用SdAskDestPath时传递进来的,保存默认安装路径以及SelectDirNoLog返回的结果 SelectDirNoLog( "", "", svDirLoc, TRUE ); CtrlSetText( szDlg, 0x80000000 | SD_STA_DESTDIR, svDirLoc );
修改后
case SD_PBUT_CHANGEDIR: SelectDirNoLog( "", "", svDirLoc, TRUE ); //svYourPath是要追加的路径,如 某某公司/某某产品,因为InstallShield的字符换貌似没有反向查找等函数, //所以采用了这种方法来判断用户选择的路径最后两级安装目录是否等于 某某公司/某某产品 if ( (StrLength(svDirLoc) - StrLength(svYourPath)) != StrFind (svDirLoc,svYourPath) ) //^作用是把两个路径拼接起来,它会自动检查目录间的'/’,如果没有的会自动在中间加上 then svDirLoc = svDirLoc^svYourPath; endif; CtrlSetText( szDlg, 0x80000000 | SD_STA_DESTDIR, svDirLoc );
把重写后的SdAsdDestPath文件取一个名字,例如MyAskDestPathDlg.rul,函数名叫做MyAskDestPath,然后在主程序里加上#include "MyAskDestPath.rul",然后在以前调用SdAskDestPath2的地方调用自己的函数就可以实现在用户选择的目录后面追加公司名称的效果了。
PS:
SdAskDestPath和SdAskDestPath2以及其他大量系统方法的代码可以在InstallShield安装目录下的 ./InstallShield X/Script/isrt/src 目录中找到。
附:SdAskDestPath2Dlg.h源码
////////////////////////////////////////////////////////////////////////////////////////// // // File Name: SdAskDestPath2Dlg.rul // // Description: This file contains the InstallShield script for the SdAskDestPath2 // dialog function. // ///////////////////////////////////////////////////////////////////////////////////////// #ifndef _SDADPATH2_RUL_ #define _SDADPATH2_RUL_ #include "Dialogs.h" #include "CustomDlg.h" #include "Winapi.h" #include "ISRTDefs.h" #include "Silent.h" #include "sdrc.h" #include "sdint.h" #include "DialogsPriv.h" function SdAskDestPath2( szTitle, szMsg, svDir ) STRING szDlg, svDirLoc, szTemp; INT nId, nTemp, nSdDialog, nStyle; HWND hwndDlg; BOOL bDone; begin szDlg = SD_DLG_ASKDESTPATH2; nSdDialog = SD_NDLG_ASKDESTPATH2; svDirLoc = svDir; // record data produced by this dialog if (MODE=SILENTMODE) then SdMakeName( szAppKey, szDlg, szTitle, nSdAskDestPath2 ); SilentReadData( szAppKey, "Result", DATA_NUMBER, szTemp, nId ); if ((nId != BACK) && (nId != CANCEL)) then SilentReadData( szAppKey, "szDir", DATA_STRING, svDir, nTemp ); endif; return nId; endif; // ensure general initialization is complete if (!bSdInit) then SdInit(); endif; if (EzDefineDialog( szDlg, "", "", SD_NDLG_ASKDESTPATH2 ) = DLG_ERR) then return -1; endif; // Loop in dialog until the user selects a standard button bDone = FALSE; while (!bDone) nId = WaitOnDialog( szDlg ); switch (nId) case DLG_INIT: CtrlSetText( szDlg, 0x80000000 | SD_STA_DESTDIR, svDirLoc ); if(szMsg != "") then SdSetStatic( szDlg, SD_STA_CHANGEDIRMSG, szMsg ); endif; hwndDlg = CmdGetHwndDlg( szDlg ); SdGeneralInit( szDlg, hwndDlg, nStyle, szSdProduct ); SdSetDlgTitle(szDlg, hwndDlg, szTitle); case SD_PBUT_CHANGEDIR: SelectDirNoLog( "", "", svDirLoc, TRUE ); CtrlSetText( szDlg, 0x80000000 | SD_STA_DESTDIR, svDirLoc ); case SD_PBUT_CONTINUE: svDir = svDirLoc; nId = NEXT; bDone = TRUE; case BACK: nId = BACK; bDone = TRUE; case DLG_ERR: SdError( -1, "SdAskDestPath2" ); nId = -1; bDone = TRUE; case DLG_CLOSE: SdCloseDlg( hwndDlg, nId, bDone ); default: // check standard handling if (SdIsStdButton( nId ) && SdDoStdButton( nId )) then bDone = TRUE; endif; endswitch; endwhile; EndDialog( szDlg ); ReleaseDialog( szDlg ); SdUnInit( ); // record data produced by this dialog if (MODE=RECORDMODE) then SdMakeName( szAppKey, szDlg, szTitle, nSdAskDestPath2 ); SilentWriteData( szAppKey, "szDir", DATA_STRING, svDir, 0 ); SilentWriteData( szAppKey, "Result", DATA_NUMBER, "", nId ); endif; return nId; end; #endif
以上是我总结的关于InstallShield制作安装包时,在用户选择的目录后面追加一个目录的解决方法,比较简单。欢迎大家批评指教或转帖。
转帖请注明出处 http://blog.csdn.net/icycode/archive/2009/12/01/4916392.aspx
相关文章推荐
- InstallShield生成的安装包 选择安装目录时失去焦点的问题
- Setup Factory 安装程序用户选择路径问题的解决
- installshield2010如何去掉TARGETDIR后面的反斜杠获取安装路径
- 软件安装不上,路径无法选择问题
- SQL Server 2005 更改安装路径目录的问题,
- 将Visual Studio安装项目中将用户选择的安装路径写入注册表的方法
- Inno Setup 已经安装好程序后,再次运行安装包无法选择安装路径的问题。
- INFO:InstallShield制作的多语言安装包中如何获取用户选择的语言
- InstallShield 获得用户选择的安装语言
- Visual Studio安装项目中将用户选择的安装路径写入注册表的方法[转]
- Visual Studio安装项目中将用户选择的安装路径写入注册表的方法
- 解决Web安装程序不能选择安装目录问题(4)
- 解决.NET(WebApplication)安装部署的不能选择安装路径的问题
- 如何真正解决“ UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该...”的问题
- Visual Studio 2017&C#打包应用程序详细教程,重写安装类获取安装路径,附加各种奇葩问题描述
- 解决Web安装程序不能选择安装目录问题(3)
- 使用InstallShield2010_SP1打包,在64位机器安装时文件没有安装到正确的系统目录下的问题
- HOWTO:InstallShield制作的安装包中如何获得用户选择的安装语言
- 解决.NET(WebApplication)安装部署的不能选择安装路径的问题 [转]
- [Windows7] 修改安装程序目录 - 选择默认程序问题(打不开)