前言:由于项目需要,而Installshield中的界面没有我们想要的,就需要定制一套了,也在网上看了很多资料,现在项目做的差不多了,总结一下
网上有很多Installshield高手的文章,都可以参考一下,先推荐一篇: InstallShield自定义安装界面, 是Kevin.Wan写的,主要是替换InstallShield界面的一些图片。
当然还要感谢群友的帮助,还有单车兄总结的文档,非常实用。
1. 在自定义对话框的时候,无意中看到了InstallShield的一些示例以及文件,可以参看InstallShield界面中的Tools-->InstallScript-->Stand Dialog Sampler,里面有很多内嵌的对话框,可以参看然后选择自己需要的,近似于需求的对话框。比如我们项目中需要做的是类似于AskOptions(NONEXCLUSIVE)的对话框,里面需要把上面的描述字符串都替换掉,而且需要添加新的一段话,后面会详细描述。
2. 还有些示例工程也可以参照学习, 具体是在安装目录下的InstallShield\xxxx\Samples,里面有InstallScript, Sample Data, WindowsInstaller目录,我们的工程类型主要是InstallScript MSI Project,所以主要参考InstallScript目录下面的示例。主要是看Serial Number Validation Sample Project.ism这个工程,它自定义了SdCustomRegisterUserEx这个对话框,可以作参考。
3. 在InstallShield的安装目录下面,InstallShield\xxxx\Script\Isrt\src,里面有很多源代码也可以参考,参照步骤1里InstallShield里面的标准对话框,可以查看相应的源码。
4. 现在来看Serial Number Validation Sample Project.ism项目中的自定义对话框,是在脚本Custom_Password.rul中,主要函数代码如下:
#define SD_DLG_CUSTOM_REGISTERUSEREX "SdCustomRegisterUserEx" #define SD_NDLG_CUSTOM_REGISTERUSEREX 22002 #define SD_EDIT_CUSTOM_NAME 301 #define SD_EDIT_CUSTOM_COMPANY 302 #define SD_EDIT_CUSTOM_SERIAL_1 101 #define SD_EDIT_CUSTOM_SERIAL_2 102 #define SD_EDIT_CUSTOM_SERIAL_3 103 #define N_REQ_LENGTH_OF_SERIAL_1 6 #define N_REQ_LENGTH_OF_SERIAL_2 4
function SdCustomRegisterUserEx ( szTitle, szMsg, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ) STRING szDlg, szTemp; BOOL bDone; NUMBER nId, nMessage, nTemp, nSdDialog, nSdCustomRegisterUserEx; HWND hwndDlg, hwndControl; begin szDlg = SD_DLG_CUSTOM_REGISTERUSEREX; nSdDialog = SD_NDLG_CUSTOM_REGISTERUSEREX; // read data produced by this dialog if user runs setup in silent mode (Setup.exe -s) if (MODE = SILENTMODE) then SdMakeName( szAppKey, szDlg, szTitle, nSdCustomRegisterUserEx ); SilentReadData( szAppKey, "Result", DATA_NUMBER, szTemp, nId ); if ((nId != BACK) && (nId != CANCEL)) then SilentReadData( szAppKey, "szName", DATA_STRING, svName, nTemp ); SilentReadData( szAppKey, "szCompany", DATA_STRING, svCompany, nTemp ); SilentReadData( szAppKey, "szSerial_1", DATA_STRING, svSerial_1, nTemp ); SilentReadData( szAppKey, "szSerial_2", DATA_STRING, svSerial_2, nTemp ); SilentReadData( szAppKey, "szSerial_3", DATA_STRING, svSerial_3, nTemp ); endif; return nId; endif; // ensure general initialization is complete if (!bSdInit) then SdInit( ); endif; if (EzDefineDialog( szDlg, "", "", SD_NDLG_CUSTOM_REGISTERUSEREX ) = 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: if( szMsg != "" ) then SdSetStatic( szDlg, SD_STA_MSG, szMsg ); endif; if( ( svName = "" ) && ( svCompany = "" ) ) then SdGetUserCompanyInfo( svName, svCompany ); SdRemoveEndSpace( svName ); SdRemoveEndSpace( svCompany ); endif; CtrlSetText( szDlg, SD_EDIT_CUSTOM_NAME, svName ); CtrlSetText( szDlg, SD_EDIT_CUSTOM_COMPANY, svCompany ); CtrlSetText( szDlg, SD_EDIT_CUSTOM_SERIAL_1, svSerial_1 ); CtrlSetText( szDlg, SD_EDIT_CUSTOM_SERIAL_2, svSerial_2 ); CtrlSetText( szDlg, SD_EDIT_CUSTOM_SERIAL_3, svSerial_3 ); hwndDlg = CmdGetHwndDlg( szDlg ); SdGeneralInit( szDlg, hwndDlg, STYLE_BOLD, szSdProduct ); if(szTitle != "") then SetWindowText(hwndDlg, szTitle); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); case SD_EDIT_CUSTOM_NAME: nMessage = CtrlGetSubCommand( szDlg ); if( nMessage = EDITBOX_CHANGE ) then CtrlGetText( szDlg, SD_EDIT_CUSTOM_NAME, svName ); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); case SD_EDIT_CUSTOM_COMPANY: nMessage = CtrlGetSubCommand( szDlg ); if( nMessage = EDITBOX_CHANGE ) then CtrlGetText( szDlg, SD_EDIT_CUSTOM_COMPANY, svCompany ); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); case SD_EDIT_CUSTOM_SERIAL_1: nMessage = CtrlGetSubCommand( szDlg ); if( nMessage = EDITBOX_CHANGE ) then CtrlGetText( szDlg, SD_EDIT_CUSTOM_SERIAL_1, svSerial_1 ); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); //////////////////////////////////////////////////// // Two quick Windows API calls to automatically // advance the user's cursor to the next edit field // when the maximum number of characters is entered. //////////////////////////////////////////////////// if (StrLength (svSerial_1) = N_REQ_LENGTH_OF_SERIAL_1) then hwndControl = GetDlgItem (hwndDlg, SD_EDIT_CUSTOM_SERIAL_2); SetFocus (hwndControl); endif; case SD_EDIT_CUSTOM_SERIAL_2: nMessage = CtrlGetSubCommand( szDlg ); if( nMessage = EDITBOX_CHANGE ) then CtrlGetText( szDlg, SD_EDIT_CUSTOM_SERIAL_2, svSerial_2 ); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); if (StrLength (svSerial_2) = N_REQ_LENGTH_OF_SERIAL_2) then hwndControl = GetDlgItem (hwndDlg, SD_EDIT_CUSTOM_SERIAL_3); SetFocus (hwndControl); endif; case SD_EDIT_CUSTOM_SERIAL_3: nMessage = CtrlGetSubCommand( szDlg ); if( nMessage = EDITBOX_CHANGE ) then CtrlGetText( szDlg, SD_EDIT_CUSTOM_SERIAL_3, svSerial_3 ); endif; SdCustomRegExEnableButton( hwndDlg, NEXT, svName, svCompany, svSerial_1, svSerial_2, svSerial_3 ); case NEXT: nId = NEXT; bDone = TRUE; case BACK: nId = BACK; bDone = TRUE; case DLG_ERR: SdError( -1, "SdCustomRegisterUserEx" ); 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 user runs Setup.exe -r SdMakeName( szAppKey, szDlg, szTitle, nSdCustomRegisterUserEx ); SilentWriteData( szAppKey, "szName", DATA_STRING, svName, 0 ); SilentWriteData( szAppKey, "szCompany", DATA_STRING, svCompany, 0 ); SilentWriteData( szAppKey, "szSerial_1", DATA_STRING, svSerial_1, 0 ); SilentWriteData( szAppKey, "szSerial_2", DATA_STRING, svSerial_2, 0 ); SilentWriteData( szAppKey, "szSerial_3", DATA_STRING, svSerial_3, 0 ); SilentWriteData( szAppKey, "Result", DATA_NUMBER, "", nId ); return nId; end;