您的位置:首页 > 其它

用InstallShield打包 在用户选择的安装目录后面追加路径的问题

2009-12-01 18:56 896 查看
     InstallShild选择安装目录主要涉及到SdAskDestPath 和SdAskDestPath2函数。

 

     这两个函数功能貌似差不多,当点击窗口上的“浏览”按钮时,又调用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐