1、一个安装包的要求:新作接口程序要安装到原有程序的目录下,但是要求原有a.exe不能直接覆盖,而是要求将a改为a1,将新的exe安装到原有安装目录下。
1)但改名时如果原有程序是运行的则不能更名成功,必须先让原有程序关闭——正确做法是查找原有程序的唯一标志窗口句柄之类的,然后通过api函数关闭他或者通知用户关闭。但由于原有程序nG,重新安装困难,就采用了个偷懒的办法,上来就直接提醒用户问他是否已关闭程序,没有的话让他自己去关,非常鄙视下自己的偷懒行为,但暂时通过这个方法了解一个函数的用法,至于正确的方法,自己先挖个坑以后来填。
szTitle = "确定是否已退出应用程序";
SetDialogTitle (DLG_ASK_YESNO,szTitle1);
if (AskYesNo("你已经退出U8的应用程序了么?否则不能正常安装", YES) = YES)
then goto Dlg_SdWelcome;
else MessageBox ("请退出U8后重新执行安装程序", INFORMATION);
abort;
注:SetDialogTitle (nDialogId, szTitle),DLG_ASK_YESNO是AskYesNo的nDialogId,abort为直接退出系统。
2)查找原有程序的安装目录,确保新程序找到原安装路径(次日解决……)只要奋战总会有结果,虽说是照猫画虎的事,出来的东西也比较粗糙,但总归是问题在一点一点地解决
RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);
nvType1 = REGDB_STRING;
szStrName1 = "SOFTWARE\\Ufsoft\\WF\\V8.610\\Install\\CurrentInstPath";
if (RegDBKeyExist (szStrName1)=1)
then RegDBGetKeyValueEx (szStrName1, "", nvType1, svStrValue, nvSize);
// MessageBox (svStrValue, INFORMATION);
TARGETDIR = svStrValue; //svStrValue是获得的路径
else MessageBox ("请确认您的机器上安装了某某应用平台", INFORMATION);
endif;
路径是找到了,貌似我也把该找到的路径赋给 TARGETDIR这个默认的安装路径了,那么应该可以了吧?but!脚本没有执行,连我的打印信息都没有显示,并且路径没有改变。
one:将该段脚本放到最前端,防止被其他的脚本跳转后忽略。
two:找到Dlg_SdAskDestPath2:
nResult = SdAskDestPath2( szTitle, szMsg, TARGETDIR );用TARGETDIR代替函数的svDir(显示在安装界面为回显值)
TARGETDIR = svStrValue; //事实证明这里需要重新设置一下,如果还用原来的svDir,安装路径还是不会安装到你从注册表里取到的值。
3)将原来的a.exe改名为olda.exe,把新的a.exe拷贝到安装目录下,谁知道用什么函数请告诉我昂,please!希望下午能解决。
if (Is(FILE_EXISTS, TARGETDIR^"a.exe") = 1)
then RenameFile (TARGETDIR^"a.exe", TARGETDIR^"aold.exe");
endif;
问题时放在哪里的问题,要保证是安装前的exe,而不是我后拷进去的那个,在脚本里翻了翻Dlg_SdStartCopy2:应该是正式拷贝之前的窗口,就放在这个窗口里面,试了下居然中了,只是看起来乱糟糟的。前辈告诉我写个函数,在firstuibefore调用 或者写在onbegin里 ,这个回头试下。
4)关于.net组件的注册,开发人员说不能用直接的regsvr32这种注册形式,他把注册的命令写到一个批处理文件中,说是直接运行批处理就可以,但实际上批处理的内容如下:
cd c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
regasm /codebase /tlb:C:\WINDOWS\system32\UFCOMSQL\EnDecryptoUtil.tlb C:\WINDOWS\system32\UFCOMSQL\EnDecryptoUtil.dll 其中c:\WINDOWS\system32 根据操作系统安装的路径不同也不相同,如操作系统是装在f盘的,那么相应的批处理里的c就要变为f,这样看起至少应该把它写为WINDIR这种东西,但是批处理文件是否会认这种变量呢?最初的想法是获得当前操作系统的盘符,把该盘符赋给一个变量,然后通过动态写批处理文件来实现。掂量了掂量,觉得自己做起来应该很困难,而且也不懂.net。每到这时候我就会想,莫非守护我的天使睡着了么,为什么非要出些花样来考验我,莫非大成在那遥远的将来?!好在有个前辈如是说:
阿土伯 15:34:52
一般来说bat里的路径都是同级,也就是不写路径,只有文件名
阿土伯 15:35:29
然后,你要将bat、以及注册程序、被注册文件安装到同一目录下
阿土伯 15:35:52
然后在copy file结束后调用bat注册文件
找到regasm.exe这个程序,并google了这个东西的用法,还确认了这个程序是可以单独拿出来用的,那么我就把这个文件和被注册文件一起拷贝到指定的安装目录下,问题就解决了。
5)开发人员又说,这个程序将来会面向三类是用人群,需要做下判断,让每种类型的人只安装自己的程序并且每部分都有自己独立的数据脚本,这怎么判断难道要到数据库里去比较什么东西?我一听就害怕,就马上建议说,不如打三个包算了,要判断自己判断去!……能这样说,能这样做吗?
do you want to customize your installation? —>Yes 这是一个是否选择部分安装的功能,而我这里并不想让客户选择完全安装还是部分安装(对话框sdsetuptype2),我只是想让他选择安装,那么我就需要把该对话框去掉,只保留sdFeatureTree,注意调整对话框之间的跳转关系就好了。
建立 A,B,C三个F,给每个F建立相应的数据库脚本,安装文件的对应关系。但运行起来发现三个F都被默认了选了钩,这显然不是我要的,我只希望默认一个或什么都不默认,让用户自己选。
FeatureSelectItem (MEDIA, "B", FALSE);
FeatureSelectItem (MEDIA, "C", FALSE);
貌似搞定,等测试完后会汇报结果的,敬请期待……