Install Shield Script小结(调用api,com,bat)
老大让我在先前打包程序基础上,把现在项目打包了(web项目)。基本要求是这样子的,用项目包括所需的控件,建虚拟目录。在用户可对sqlSERVER 对行配置,也可安装包内sqlEXPRESS(如果用户配置后无法连接且判断机器内未安装sqlSERVER即安装包内sqlEXPRESS),捣鼓了一星期,把学到的共享下。语法主要看下那个教程就可以,函数直接F1
基本资料:
InstallshieldX安装制作杂记.rar
installshieldjc.rar
再就是InstallShield和帮助,推荐它的官方论坛http://community.installshield.com/
1.用InstallShield Script调用WINAPI方法
如取得机器的登陆用户名。MSDN
GetUserName
The GetUserName function retrieves the name of the user associated with the current thread.
Use the GetUserNameEx function to retrieve the user name in a specified format. Additional @R_446_4045@ion is provided by the interface.
BOOL GetUserName(.......
LPTSTR lpBuffer,
LPDWORD nSize
);
DLL | Requires Advapi32.dll. |
---|---|
Unicode | Implemented as GetUserNameW (Unicode) and GetUserNameA (ANSI). Note that Unicode support on Windows Me/98/95 requires Microsoft Layer for Unicode. |
参照 installshieldjc.rar里的对应于Winapi里的函数类型声明,于api函数签名对应,如下声明使用:
prototype BOOL Advapi32.GetUserNameA(BYREF STRING, BYREF NUMBER );
function OnBegin()
STRING strlogonUser;
NUMBER numlogonUser
begin
//
numlogonUser = 255 ;
GetUserNameA(strlogonUser, numlogonUser);
MessageBox(strlogonUser,@R_446_4045@ION);
end;
function OnBegin()
STRING strlogonUser;
NUMBER numlogonUser
begin
//
numlogonUser = 255 ;
GetUserNameA(strlogonUser, numlogonUser);
MessageBox(strlogonUser,@R_446_4045@ION);
end;
2.用InstallShield Script调用其他Com
例1:使用DOM
prototype WriteConfig(
STRING
);
WriteConfig(info)
fileName;
OBJECT configDoc, child1,child2;
begin
set configDoc CoCreateObject( " MSXML.DOMDocument );
fileName INSTALLDIR ^ oceswebs//Web.config ;
MessageBox(fileName,@R_446_4045@ION);
if configDoc.Load(fileName) then
child1 configDoc.selectSingleNode( //configuration/appSettings/add[@key='CONNECTIONSTRINGFORPROVINCE']/@value );
child2 //configuration/connectionStrings/add[@name='CONNECTIONSTRINGFORPROVINCE']/@connectionString );
child1.text info;
child2.text info;
MessageBox(child.text,@R_446_4045@ION);
else
MessageBox( 未找到Web.Config配置文件 ,@R_446_4045@ION) ;
endif;
configDoc.save(fileName);
nothing ;
end ;
用
set
configDoc
=
CoCreateObject(
"
MSXML.DOMDocument
);创建对象后,即可轻松通过XPATH操作XML了WriteConfig(info)
fileName;
OBJECT configDoc, child1,child2;
begin
set configDoc CoCreateObject( " MSXML.DOMDocument );
fileName INSTALLDIR ^ oceswebs//Web.config ;
MessageBox(fileName,@R_446_4045@ION);
if configDoc.Load(fileName) then
child1 configDoc.selectSingleNode( //configuration/appSettings/add[@key='CONNECTIONSTRINGFORPROVINCE']/@value );
child2 //configuration/connectionStrings/add[@name='CONNECTIONSTRINGFORPROVINCE']/@connectionString );
child1.text info;
child2.text info;
MessageBox(child.text,@R_446_4045@ION);
else
MessageBox( 未找到Web.Config配置文件 ,@R_446_4045@ION) ;
endif;
configDoc.save(fileName);
nothing ;
end ;
例2:使用ADO:
//
测试数据库连接方法
参数:SERVERNAME,服务器名 dbnAME,数据库名 DBUSER 用户名 PWD, 登陆密码 ATHMODE 登陆模式 0为sql登陆模式,1为WINDOWS验证登陆模式 返回值 -1,无法连接不上sql server 返回值 0 连接上sql server 但无此数据库 返回值 1 连接上sql server 并存在此数据库 #ifndef CONNDB
#define CONNDB 1
prototype ConnDB(STRING,STRING,NUMBER);
function NUMBER ConnDB(SERVERNAME,dbnAME,DBUSER,PWD,ATHMODE)
OBJECT oADOcnn, oADOrs;
STRING svCnn, svsql;
NUMBER nvReturn, nvSize, nvFileHandle;
STRING svResult, szPath, szFileName, svBuffer, szTmp;
STRING gssqlServer, gssqlUID, gssqlPass, gssqldbname;
BOOL gbWindowsLogin;
begin
gssqlServer = "192.168.75.80"; gssqldbname="solotemp"; gssqlUID = "sa"; gssqlPass = "iflyecl"; gssqlServer = SERVERNAME;
gssqldbname dbnAME;
gssqlUID DBUSER;
gssqlPass PWD;
gbWindowsLogin ATHMODE;
if (gbWindowsLogin TRUE) then
svCnn " Provider=sqlOLEDB.1;Integrated Security=sspI;Persist Security Info=False;User ID= ;
svCnn svCnn + gssqlUID ;Initial Catalog=master;Data Source= gssqlServer;
else
svCnn Provider=sqlOLEDB.1;Password= gssqlPass ;Persist Security Info=True;User ID= gssqlServer;
endif;
login to the master database
try
set oADOcnn CreateObject( ADODB.Connection );
catch
MessageBox ( Error : Err.Description , WARNING);
nvReturn - ;
return nvReturn;
endcatch;
oADOcnn.ConnectionTimeout 32 ;
oADOcnn.CommandTimeout 8 ;
oADOcnn.CursorLocation 3 ; adUseClient
oADOcnn.Open(svCnn);
MessageBox ( ;
nvReturn;
endcatch;
oADOcnn.CommandTimeout adUseClient adOpenDynamic =2 , adOpenForwardOnly =0 adLockReadOnly =1, adLockOptimistic =3
svsql Select * from sysdatabases where [name] = N' gssqldbname ' MessageBox(svsql,@R_446_4045@ION); set oADOrs oADOcnn.Execute(svsql);
( ! oADOrs.BOF) then
MessageBox( Database exists ;
MessageBox( Does NOT exists,GO on to Creat it 4045@ION);
nvReturn 0 ;
endif;
set oADOrs NULL;
oADOcnn.Close();
set oADOcnn NULL;
nvReturn;
end;
3.调用批处理bat:参数:SERVERNAME,服务器名 dbnAME,数据库名 DBUSER 用户名 PWD, 登陆密码 ATHMODE 登陆模式 0为sql登陆模式,1为WINDOWS验证登陆模式 返回值 -1,无法连接不上sql server 返回值 0 连接上sql server 但无此数据库 返回值 1 连接上sql server 并存在此数据库 #ifndef CONNDB
#define CONNDB 1
prototype ConnDB(STRING,STRING,NUMBER);
function NUMBER ConnDB(SERVERNAME,dbnAME,DBUSER,PWD,ATHMODE)
OBJECT oADOcnn, oADOrs;
STRING svCnn, svsql;
NUMBER nvReturn, nvSize, nvFileHandle;
STRING svResult, szPath, szFileName, svBuffer, szTmp;
STRING gssqlServer, gssqlUID, gssqlPass, gssqldbname;
BOOL gbWindowsLogin;
begin
gssqlServer = "192.168.75.80"; gssqldbname="solotemp"; gssqlUID = "sa"; gssqlPass = "iflyecl"; gssqlServer = SERVERNAME;
gssqldbname dbnAME;
gssqlUID DBUSER;
gssqlPass PWD;
gbWindowsLogin ATHMODE;
if (gbWindowsLogin TRUE) then
svCnn " Provider=sqlOLEDB.1;Integrated Security=sspI;Persist Security Info=False;User ID= ;
svCnn svCnn + gssqlUID ;Initial Catalog=master;Data Source= gssqlServer;
else
svCnn Provider=sqlOLEDB.1;Password= gssqlPass ;Persist Security Info=True;User ID= gssqlServer;
endif;
login to the master database
try
set oADOcnn CreateObject( ADODB.Connection );
catch
MessageBox ( Error : Err.Description , WARNING);
nvReturn - ;
return nvReturn;
endcatch;
oADOcnn.ConnectionTimeout 32 ;
oADOcnn.CommandTimeout 8 ;
oADOcnn.CursorLocation 3 ; adUseClient
oADOcnn.Open(svCnn);
MessageBox ( ;
nvReturn;
endcatch;
oADOcnn.CommandTimeout adUseClient adOpenDynamic =2 , adOpenForwardOnly =0 adLockReadOnly =1, adLockOptimistic =3
svsql Select * from sysdatabases where [name] = N' gssqldbname ' MessageBox(svsql,@R_446_4045@ION); set oADOrs oADOcnn.Execute(svsql);
( ! oADOrs.BOF) then
MessageBox( Database exists ;
MessageBox( Does NOT exists,GO on to Creat it 4045@ION);
nvReturn 0 ;
endif;
set oADOrs NULL;
oADOcnn.Close();
set oADOcnn NULL;
nvReturn;
end;
sMsg
Excute Configure file and sql
SdShowMsg (sMsg, TRUE);
result result LaunchAppAndWait(INSTALLDIR ^ Component//config.bat "" | LAAW_OPTION_HIDDEN);
sCmdLine sServerName / + sUserName+ / + sPWD+ ;
result Component//setup2.bat LAAW_OPTION_HIDDEN);
SdShowMsg (sMsg, FALSE);
调用bat很简单,想提醒下如果把参数传入bat的话。我被搞的很郁闷。注意引号,免得传错,还是用例子说明吧:SdShowMsg (sMsg, TRUE);
result result LaunchAppAndWait(INSTALLDIR ^ Component//config.bat "" | LAAW_OPTION_HIDDEN);
sCmdLine sServerName / + sUserName+ / + sPWD+ ;
result Component//setup2.bat LAAW_OPTION_HIDDEN);
SdShowMsg (sMsg, FALSE);
setup2.bat的内容如下:
我要把 server name,username,password传入,即 sServerName+" /""+ sUserName+/+ sPWD+ ; 传入,关于 LaunchAppAndWait提醒一点,开始以为它和 LaunchApp一样,只要找到bat,或exe文件,运行即返回值即返回0,安装程序就控制不了它了,当我用它来启动一个服务时,结果服务启动失败,返回了-1。我到处MessageBox也找到这个原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。