InstallShield 一些事件说明
InstallShield 一些事件说明,和常量代码
大家可以把所有事件都点出来然后单步追踪就行了,我的经验是一般是从OnShowUI第一次显示UI界面开始,很容易就找到大家想处理的事件,另贴几个我发现的事件,这些事件描述不是很准确大家不要当真哦. 在加一些文件注册 服务开启 动作. #include "ifx.h" //这是一个自定义函数 prototype MsgBox(STRING);//声名函数原型 function MsgBox(msg) begin //return MessageBox (msg,SEVERE); return MessageBox (msg,MB_YESNO); end; #include "ifx.h" //--------------------------------------------------------------------------- // OnFirstUIBefore // //--------------------------------------------------------------------------- function OnFirstUIBefore() number nResult, nLevel, nSize, nSetupType; string szTitle, szMsg, szOpt1, szOpt2, szLicenseFile,szKeyRoot; string szName, szCompany, szTargetPath, szDir, szFeatures; BOOL bLicenseAccepted; string szExePath,szCmdPath; NUMERIC szServiceState ; begin nSetupType = COMPLETE; szDir = TARGETDIR; szName = ""; szCompany = ""; bLicenseAccepted = FALSE; // Beginning of UI Sequence Dlg_Start: nResult = 0; Dlg_SdWelcome: szTitle = ""; szMsg = ""; //{{IS_SCRIPT_TAG(Dlg_SdWelcome) nResult = SdWelcome( szTitle, szMsg ); //}}IS_SCRIPT_TAG(Dlg_SdWelcome) if (nResult = BACK) goto Dlg_Start; Dlg_SdLicense2: szTitle = ""; szOpt1 = ""; szOpt2 = ""; //{{IS_SCRIPT_TAG(License_File_Path) szLicenseFile = SUPPORTDIR ^ "License.rtf"; //}}IS_SCRIPT_TAG(License_File_Path) //{{IS_SCRIPT_TAG(Dlg_SdLicense2) nResult = SdLicense2Rtf( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted ); //}}IS_SCRIPT_TAG(Dlg_SdLicense2) if (nResult = BACK) then goto Dlg_SdWelcome; else bLicenseAccepted = TRUE; endif; Dlg_SdRegisterUser: szMsg = ""; szTitle = ""; //{{IS_SCRIPT_TAG(Dlg_SdRegisterUser) nResult = SdRegisterUser( szTitle, szMsg, szName, szCompany ); //}}IS_SCRIPT_TAG(Dlg_SdRegisterUser) if (nResult = BACK) goto Dlg_SdLicense2; Dlg_SetupType2: szTitle = ""; szMsg = ""; nResult = CUSTOM; //{{IS_SCRIPT_TAG(Dlg_SetupType2) nResult = SetupType2( szTitle, szMsg, "", nSetupType, 0 ); //}}IS_SCRIPT_TAG(Dlg_SetupType2) if (nResult = BACK) then goto Dlg_SdRegisterUser; else nSetupType = nResult; if (nSetupType != CUSTOM) then szTargetPath = TARGETDIR; nSize = 0; FeatureCompareSizeRequired( MEDIA, szTargetPath, nSize ); if (nSize != 0) then MessageBox( szSdStr_NotEnoughSpace, WARNING ); goto Dlg_SetupType2; endif; endif; endif; Dlg_SdAskDestPath2: if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SetupType2; szTitle = ""; szMsg = ""; if (nSetupType = CUSTOM) then //{{IS_SCRIPT_TAG(Dlg_SdAskDestPath2) nResult = SdAskDestPath2( szTitle, szMsg, szDir ); //}}IS_SCRIPT_TAG(Dlg_SdAskDestPath2) TARGETDIR = szDir; endif; if (nResult = BACK) goto Dlg_SetupType2; Dlg_SdFeatureTree: if ((nResult = BACK) && (nSetupType != CUSTOM)) goto Dlg_SdAskDestPath2; szTitle = ""; szMsg = ""; szFeatures = ""; nLevel = 2; if (nSetupType = CUSTOM) then //{{IS_SCRIPT_TAG(Dlg_SdFeatureTree) nResult = SdFeatureTree( szTitle, szMsg, TARGETDIR, szFeatures, nLevel ); //}}IS_SCRIPT_TAG(Dlg_SdFeatureTree) if (nResult = BACK) goto Dlg_SdAskDestPath2; endif; Dlg_SQLServer: nResult = OnSQLServerInitialize( nResult ); if( nResult = BACK ) goto Dlg_SdFeatureTree; Dlg_ObjDialogs: nResult = ShowObjWizardPages( nResult ); if (nResult = BACK) goto Dlg_SQLServer; Dlg_SdStartCopy2: szTitle = ""; szMsg = ""; //显示各种路径 MessageBox("TARGETDIR=" + TARGETDIR + "\n" +"SUPPORTDIR=" + SUPPORTDIR + "\n" +"WINSYSDIR=" + WINSYSDIR + "\n" +"DISK1TARGET=" + DISK1TARGET + "\n" +"<FOLDER_APPLICATIONS>=" + FOLDER_APPLICATIONS + "\n" +"<IFX_COMPANY_NAME>=" + IFX_COMPANY_NAME + "\n" +"<IFX_PRODUCT_NAME>=" + IFX_PRODUCT_NAME + "\n" +"szOpt2=" + szOpt2 + "\n" +"szLicenseFile=" + szLicenseFile + "\n" +"szTargetPath=" + szTargetPath + "\n" +"szDir=" + szDir + "\n" +"szFeatures=" + szFeatures + "\n" +"szOpt1=" + szOpt1 + "\n",MB_YESNO); //开始安装其他的程序 szExePath = SUPPORTDIR ^ "test.exe"; //这个是放入缓存文件夹里面执行,执行完后自动删除 //添加缓存文件夹步骤 //1.选择Support Files /Billboards ->Language IndePendent -> INsert File //安装其他程序 //只能判断程序执行没执行 不能判断执行安装成功,需要通过读取注册表来判断 //if LaunchAppAndWait (szExePath, "", WAIT) < 0 then // MessageBox("不能安装该程序,本次安装失败!",SEVERE); // abort; //endif; //执行Bat文件 //szExePath = SUPPORTDIR ^ "test.bat"; //if LaunchAppAndWait (szExePath, "", WAIT) < 0 then // MessageBox("bat程序执行失败",SEVERE); // abort; //endif; //注意了 执行这些.exe .bat 文件一定要放到SUPPORTDIR 文件夹去,直接D:\test.bat不能直接执行成的 //当然下面的cmd.exe 系统命令除外,我估计是他内至支持的(估计的!) //执行CMd命令 /c 注意这个/ 不是\记住 // szExePath = WINSYSDIR^ "cmd.exe"; // if LaunchAppAndWait (szExePath, "/c del c:\\01.txt", WAIT) < 0 then // MessageBox("CMD执行失败",SEVERE); // abort; //endif; //关于注册 在我们使用InstallShield导入文件时,可以设置selt-register 他就会自动注册与卸载了. //执行RegSvr32注册组件命令 //szExePath = "/s C:\\Example\\原始文件\\jmail.dll"; //注意/s 参数要放在参数命令里 // if LaunchAppAndWait (WINSYSDIR ^ "Regsvr32", szExePath , WAIT) < 0 then // MessageBox("注册组件执行失败",SEVERE); // abort; //endif; //取消注册 //szExePath = "/s /u C:\\Example\\原始文件\\jmail.dll"; // /u 卸载 // if LaunchAppAndWait (WINSYSDIR ^ "Regsvr32", szExePath , WAIT) < 0 then // MessageBox("取消注册组件执行失败",SEVERE); // abort; //endif; //关闭服务 //szExePath = WINSYSDIR^ "NET"; //if LaunchAppAndWait (szExePath, "STOP MSSQLSERVER", WAIT) < 0 then // MessageBox("关闭服务失败",SEVERE); // abort; // endif; //开启服务 //szExePath = WINSYSDIR^ "NET"; //if LaunchAppAndWait (szExePath, "START MSSQLSERVER", WAIT) < 0 then // MessageBox("开启服务失败",SEVERE); // abort; //endif; //判断服务是否开启 szServiceState = SERVICE_STOP_PENDING; //这里主要是定义数据类型,这个很重要 否则出错. if ServiceGetServiceState("MSSQLSERVER", szServiceState)< ISERR_SUCCESS then MessageBox("MSSQLSERVER服务关闭",SEVERE); else MessageBox("MSSQLSERVER服务开启",SEVERE); endif; // ServiceAddService 添加服务 ServiceRemoveService 删除服务 //ServiceExistsService 判断服务是否存在 ServiceGetServiceState 检查服务是否启动 //if MessageBox("是否关闭服务!",MB_YESNO) = IDYES then // ServiceStopService("MSSQLSERVER"); //endif; //if MessageBox("是否开启服务!",MB_YESNO) = IDYES then // ServiceStartService("MSSQLSERVER",""); //endif; if MessageBox("是否退出本次安装!",MB_YESNO) = IDYES then abort; endif; //{{IS_SCRIPT_TAG(Dlg_SdStartCopy2) nResult = SdStartCopy2( szTitle, szMsg ); //}}IS_SCRIPT_TAG(Dlg_SdStartCopy2) if (nResult = BACK) goto Dlg_ObjDialogs; //这里开始写注册表 RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); //设置注册表函数默认值 //szKeyRoot = "SOFTWARE\\ISsample" ; //需创建多个子项时要一个一个创建否则卸载不了 //RegDBCreateKeyEx (szKeyRoot , "" ); //了用""代替类 //设置键值 size = -1 InstallShield自动设置大小 //RegDBSetKeyValueEx(szKeyRoot,"config_string",REGDB_STRING,"Hello",-1); //RegDBSetKeyValueEx(szKeyRoot,"config_numer",REGDB_NUMBER,"1",-1); //在本身创建的目录下写注册表 szKeyRoot = "SOFTWARE"^IFX_COMPANY_NAME^IFX_PRODUCT_NAME ; RegDBSetKeyValueEx(szKeyRoot,"Path",REGDB_STRING,TARGETDIR,-1); RegDBSetKeyValueEx(szKeyRoot,"config",REGDB_NUMBER,"1",-1); // Added in 11.0 - Set appropriate StatusEx static text. SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) ); return 0; end; //--------------------------------------------------------------------------- // OnMaintUIBefore // 卸载向导页 //--------------------------------------------------------------------------- function OnMaintUIBefore() number nResult, nType, nMediaFlags; string szTitle, szMsg, szIgnore; string szKeyRoot,szPath ,szConfigStr; int szConfig; NUMBER nType1,nType2,nvSize; //提取注册表时,一定要把他转换成这种数据类型,否则出错 begin //显示注册表值 nType1 = REGDB_STRING; nType2 = REGDB_NUMBER; nvSize = -1; RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE); szKeyRoot = "SOFTWARE"^IFX_COMPANY_NAME^IFX_PRODUCT_NAME; //RegDBSetKeyValueEx (szKeyRoot, "Path", nType1, "Hello",nvSize);//看能否取到值 RegDBGetKeyValueEx (szKeyRoot, "Path", nType1, szPath,nvSize); //RegDBGetKeyValueEx (szKeyRoot, "config",nType2, szConfig,nvSize); MessageBox("路径:" + szKeyRoot + "注册表值:"+ szPath ,MB_YESNO); // nType defaults to MODIFY. nType = MODIFY; //可修改这个默认值 //Initialize SQL OnSQLServerInitializeMaint(); // Beginning of UI Sequence Dlg_Start: // Added in Version 9.5 - Support for REMOVEONLY option. if( !REMOVEONLY ) then // In standard mode show maintenance dialog Disable( BACKBUTTON ); nType = SdWelcomeMaint( szTitle, szMsg, nType ); Enable( BACKBUTTON ); nResult = NEXT; else // Hide the initial progress dialog as otherwise the user can // click on it, and hide the MessageBox. Disable( DIALOGCACHE ); // In RemoveOnly mode, set to remove. nType = REMOVEALL; endif; // Show Uninstall Confirmation Dialog if ( nType = REMOVEALL ) then //删除事件 nResult = MessageBox( SdLoadString( IFX_MAINTUI_MSG ), MB_YESNO ); if (nResult != IDYES ) then if( REMOVEONLY ) then // In REMOVEONLY mode, abort the setup. abort; else // In non-REMOVEONLY mode, redisplay the previous dialog. goto Dlg_Start; endif; endif; endif; Dlg_SdFeatureTree: if ( nType = MODIFY ) then szTitle = ""; szMsg = SdLoadString( SD_STR_COMPONENT_MAINT_MSG ); nResult = SdFeatureTree( szTitle, szMsg, TARGETDIR, "", -1 ); if ( nResult = BACK ) goto Dlg_Start; endif; Dlg_ObjDialogs: nResult = ShowObjWizardPages( nResult ); if ( ( nResult = BACK ) && ( nType != MODIFY ) ) goto Dlg_Start; if ( ( nResult = BACK ) && ( nType = MODIFY ) ) goto Dlg_SdFeatureTree; switch(nType) case REMOVEALL: //卸载调用 (有卸载有做的动作都可以放到这里来) // Ensure that all previously installed features are removed // for media that supports updating. MediaGetData( MEDIA, MEDIA_FIELD_MEDIA_FLAGS, nMediaFlags, szIgnore ); if( nMediaFlags & MEDIA_FLAG_UPDATEMODE_SUPPORTED ) then FeatureRemoveAllInMediaAndLog(); else FeatureRemoveAllInMedia(); endif; // Added in 11.0 - Set appropriate StatusEx static text. SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REMOVEALL ) ); case REPAIR: //修复 // Changed for DevStudio 9, Disk1 files are now always updated when installed // so when running from ADDREMOVE we need to prevent these files from being // updated since this will result in files being updated that are locked by the setup. // Updating these files when running from ADDREMOVE should not be needed since updates // are not run directly from Add/Remove. if( ADDREMOVE ) then // Reinstall all previously installed features, except // disk1 features. FeatureUpdate( "" ); else // Reinstall all previously installed features. FeatureReinstall(); endif; // Added in 11.0 - Set appropriate StatusEx static text. SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_REPAIR ) ); case MODIFY: //修改事件 // Added in 11.0 - Set appropriate StatusEx static text. SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_MAINTUI_MODIFY ) ); endswitch; end; //--------------------------------------------------------------------------- // OnFirstUIAfter // 安装完成后,点完成前发生的事件 // //--------------------------------------------------------------------------- function OnFirstUIAfter() STRING szTitle, szMsg1, szMsg2, szOpt1, szOpt2; NUMBER bvOpt1, bvOpt2; NUMBER bShowUpdateServiceDlg; begin //MessageBox("开始了OnFirStUIAfter!",MB_YESNO ) ; ShowObjWizardPages(NEXT); szTitle = ""; szMsg1 = ""; szMsg2 = ""; szOpt1 = ""; szOpt2 = ""; bvOpt1 = FALSE; bvOpt2 = FALSE; // Set this to true if you have the update service enabled, and if you want to check for updates. // Note: the ISUS Starter Edition does not support checking for updates programatically. So, // only set this to true if you have at least the ISUS Professional Edition. bShowUpdateServiceDlg = FALSE; //{{IS_SCRIPT_TAG(Dlg_SdDinishEx) if ( BATCH_INSTALL ) then SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 ); else // If the update service is enabled, show finish dialog that includes // update check option. if( bShowUpdateServiceDlg && ( ENABLED_ISERVICES & SERVICE_ISUPDATE ) ) then if( SdFinishUpdateEx( szTitle, szMsg1, szMsg2, szOpt1, szOpt2, TRUE ) ) then // Don't check for updates in silent mode. if( MODE != SILENTMODE ) then UpdateServiceCheckForUpdates( "", FALSE ); endif; endif; else SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bvOpt1 , bvOpt2 ); endif; endif; //}}IS_SCRIPT_TAG(Dlg_SdDinishEx) end; //--------------------------------------------------------------------------- // OnAbort //取消按钮退出,最后点完成发生事件 //--------------------------------------------------------------------------- function OnAbort() begin //MessageBox("发生OnAbort事件!", MB_YESNO ) ; end; //--------------------------------------------------------------------------- // OnUpdateUIAfter // // Update Mode UI Sequence - After Move Data // // The OnUpdateUIAfter event called by OnShowUI after the file transfer // of the setup when the setup is running in update mode. By default // this event displays UI that informs the end user that the maintenance setup // has been completed successfully. // // Note: This event will not be called automatically in a // program...endprogram style setup. //--------------------------------------------------------------------------- function OnUpdateUIAfter() string szTitle, szMsg1, szMsg2, szOpt1, szOpt2; BOOL bOpt1, bOpt2; begin MessageBox("OnUninstall", MB_YESNO ) ; ShowObjWizardPages(NEXT); szTitle = SdLoadString(IDS_IFX_SDFINISH_UPDATE_TITLE); szMsg1 = SdLoadString(IDS_IFX_SDFINISH_UPDATE_MSG1); szMsg2 = ""; szOpt1 = ""; szOpt2 = ""; bOpt1 = FALSE; bOpt2 = FALSE; if ( BATCH_INSTALL ) then SdFinishReboot ( szTitle , szMsg1 , SYS_BOOTMACHINE , szMsg2 , 0 ); else SdFinish ( szTitle , szMsg1 , szMsg2 , szOpt1 , szOpt2 , bOpt1 , bOpt2 ); endif; end; //--------------------------------------------------------------------------- // OnShowUI //在第一次弹出向导页发生 //--------------------------------------------------------------------------- function OnShowUI() BOOL bMaintenanceMode, bUpdateMode; string szIgnore, szTitle; begin //MessageBox("OnShowUI", MB_YESNO ) ; // Enable dialog caching Enable( DIALOGCACHE ); // Determine what events to show. bUpdateMode = FALSE; bMaintenanceMode = FALSE; // Remove this to disabled update mode. if( UPDATEMODE ) then bUpdateMode = TRUE; endif; // Remove this to disable maintenance mode. if ( MAINTENANCE ) then bMaintenanceMode = TRUE; endif; // Show appropriate UI // TODO: Enable if you want to enable background etc. //if ( LoadStringFromStringTable( "TITLE_MAIN", szTitle ) < ISERR_SUCCESS ) then // Load the title string. // szTitle = IFX_SETUP_TITLE; //endif; //SetTitle( szTitle, 24, WHITE ); //Enable( FULLWINDOWMODE ); //Enable( BACKGROUND ); //SetColor( BACKGROUND, RGB( 0, 128, 128 ) ); if( bUpdateMode ) then OnUpdateUIBefore(); else if ( bMaintenanceMode ) then OnMaintUIBefore(); else OnFirstUIBefore(); endif; endif; // Move Data OnMoveData(); if( bUpdateMode ) then OnUpdateUIAfter(); else if ( bMaintenanceMode ) then OnMaintUIAfter(); else OnFirstUIAfter(); endif; endif; // Disable dialog caching Disable(DIALOGCACHE); end; //下面介绍一些长用常量: BATCH_INSTALL 指示当传输文件采用LOCKEDFILE或SHAREDFILE时是否锁定文件 CMDLINE Setup.exe传递的命令行参数 COMMONFILES Common files全路径如“c:\program file\common files” ERRORFILENAME FOLDER_DESKTOP Windows 95 或Windows NT 4.0桌面folder的路径 FOLDER_PROGRAMS Windows 95 或Windows NT 4.0 开始菜单中 开始\程序 的folder FOLDER_STARTMENU Windows 95 或Windows NT 4.0 开始菜单中 开始 的folder FOLDER_STARTUP Windows 95 or Windows NT 4.0 开始菜单中 启动 的folder INFOFILENAME InstallShield创建的备份文件全文件名 ISRES _isres.dll全文件名 ISUSER _isuser.dll全文件名 ISVERSION 版本 MEDIA 当前Media库名 MODE 指示程序运行于normal还是silent模式 PROGRAMFILES Windows 95 or Windows NT 4.0 “Program files” folder SELECTED_LANGUAGE 安装选择的语言号 SRCDIR 安装源目录的全路径 SRCDISK 安装源目录的盘符 SUPPORTDIR 临时文件路径 TARGETDIR 安装目的目录的全路径 TARGETDISK 安装目的目录的盘符 UNINST unInstallShield程序用的反安装文件全文件名 WINDIR Windows的全路径(c:\windows) WINDISK Windows位于的盘符 WINSYSDIR Windows\system的全路径(c:\windows\system32) WINSYSDISK Windows\system位于的盘符 FOLDER_LOCAL_APPDATA //用户系统目录 DISK1TARGET // 安装文件所在路径 FOLDER_APPLICATIONS IFX_COMPANY_NAME //发布者名 IFX_PRODUCT_NAME //程序名 IFX_PRODUCT_VERSION //版本号 (你也可以在帮助文件中搜索 IFX 就会显示出保存输入值的常量) |
InstallShield 一些事件说明的更多相关文章
- InstallShield脚本事件
脚本事件主要有三大类:Before Move Data(安装数据前).Move Data(安装数据过程中).After Move Data(安装数据后). OnBegin:在初始化后,被调用 OnFi ...
- InstallShield中打包ArcEnineRuntime
InstallShield中打包ArcEnineRuntime 最近研究了一阵应用程序的打包,几天下来也算颇有收获.普通的.net程序打包相对简单一点,不过ArcEngine的应用程序还涉及到Engi ...
- IS打包
1. 目的 让用户可以通过运行一个安装程序,安装程序到系统中正常运行. 2. 注意 当我们用项目向导生成的新项目时,InstallShield只为我们生成两个事件,分别是OnFirstUIBefore ...
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- NEWS - InstallShield 2014正式发布
InstallShield又迎来了新的版本InstallShield 2014,开发版本号Ver 21.0,相关产品信息已经可以从厂商Flexera Software(富莱睿)官方网站获得. 对于中国 ...
- InstallShield自定义安装界面
原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...
- InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布
原文:InstallShield集成安装MSDE2000最小版本(一) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...
- installshield学习笔记
看预定义常量的值:SprintfBox(INFORMATION,"","%d",变量值); 自定义常量:#define MAXCOUNT 1000;#d ...
- InstallShield 2015 Premier的Basic MSI Project如何在卸载时删除残留的文件 (转)
转载:http://blog.csdn.net/zztoll/article/details/54018615#comments 先说下缘由,我在用InstallShield 2015 Premier ...
随机推荐
- 九度OJ 1534 数组中第K小的数字 -- 二分查找
题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...
- 在Mac OS X中搭建STM32开发环境(1)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 本文方法必须好用!绝不坑爹!看了N多英文资料才搞明白的,适用于STM32F4DISCOVERY评估板,带 ...
- <UNIX环境高级编程>文件共享及fork函数
UNIX系统支持在不同进程间共享打开文件.内核使用3种数据结构表示打开文件,它们之间的关系决定了文件共享方面一个进程对另一个进程可能产生的影响. 内核维持了3个表,即进程表,文件表和v节点表.具体如下 ...
- 排序算法THREE:归并排序MergeSort
/** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...
- lispbox 安装运行.sh的时候出现 lispbox.sh: 2: lispbox.sh: Bad substitution
安装lispbox时使用tar命令将压缩文件解压之后cd进入之后在运行.sh文件时出现了如下情况. $ sh lispbox.sh lispbox.: lispbox.sh: Bad substitu ...
- mysql create database 指定utf-8编码
CREATE DATABASE IF NOT EXISTS thinkphp DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
- Control character in cookie value, consider BASE64 encoding your value , java操作cookie遇到中文会报错的解决方案
项目当中用到cookie保存中文,但是会报如下错误: Control character in cookie value, consider BASE64 encoding your value 大概 ...
- apache+tomcat 负载均衡
说明:本篇不面向无开发基础的人员,所以不会有软件下载,jdk安装等步骤.比较久远的东西了...... 1.系统环境 win7-64.jdk 2.软件列表: apache_2.2.24-x64-no-s ...
- 自适应网页设计(Responsive Web Design)(转)
随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...
- HTML中的转义字符
HTML常用符号: 显示一个空格 < 小于 < <> 大于 > >& &符号 & &" 双引号 " &qu ...