怎样在制作的安装程序中,启动另外一个程序的安装(300分)

  • 主题发起人 主题发起人 lichdr
  • 开始时间 开始时间
L

lichdr

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我们做了一个数据库应用程序,要用到SQL SERVER,而目的机上有可能 没有SQL SERVER,我们就得安装SQL SERVER。我现在是手动安装的,有没有办法在制作的安装程序中,在目的机没有安装SQL SERVER的情况下,启动SQL SERVER的安装。
我现在用的是InstallShield。
最近全文检索也用不了,安装程序也没有好好的制作过,不知怎么做,大家帮帮忙,谢了
 
if (LaunchAppAndWait("osql.exe", szCmdLine,WAIT) < 0) then

if (LaunchAppAndWait("SQLSERVER/Setup.exe", szCmdLine,WAIT) < 0) then

MessageBox ("数据库安装失败!您可以在手动完成安装!",SEVERE);
endif;
endif;
 
我是自己写的安装程序,这样做的好处是可以处理很多特殊问题。比如你的问题一句话就行了winexec('sqlserver的setup文件',sw_normal).
另外程序的打包压缩,写注册表,生成ini文件,都可以自己写。
 
需要自己写一个安装程序,目前的安装程序,我还没有发现有这个功能,
 
我觉得你可以采用INNO来做。未必非要用那么复杂的工具。
在 INNO里,自动安装其他程序,你可以参考这个命令:
[Run]
Filename: "{app}/regapp.exe";Parameters:"4+3-6+3*2=7";
Description: "Launch register";
Flags: waituntilidle skipifsilent
Filename: "{app}/setup.exe";
Description: "Launch SQL server";
Flags: waituntilidle
在HELP里,参考RUN命令,有很多参数可以提供选择。
 
调用另一个安装程序
shellExcute()函数
 
你不是想将SQL SERVER 也打包吧!
 
用小颖安装专家,很好用!
 
是呀,找一个安装专家吧。
 
這個問題不是很急,所以幾天來沒去動它。
差不多了。
如果用installfield是不是要完全版才能寫腳本啊。DELPHI光盤帶的那個是不是寫不了腳本。
 
用Inno Setup version 4.0.4-beta
http://www.jrsoftware.org/
可以下载
 
http://www.nethovel.com/resources/InstallShield.chm
本教程主要讲述InstallShield开发环境、InstallScript脚本语言基础、基本安装程序的建立、安装界面的设计以及深入安装程序制作等共五章内容。各章内容并不停留在初学者的水平上,而且在制作安装程序的每个方面,都给出了更高、更深层次的方法,例如安装对话框的定制、使用自己的DLL库、操作注册表、安装界面的汉化、使用多媒体、反安装以及安装程序的调试等。
http://www.nethovel.com/resources/IS.zip
详细解释了InstallShield包含的300多个内部库函数。(中文word文档,198K)
授人以鱼,不如授人以渔,你说呢?嘿
 
to kezhiyong
INNO 我手裡有的。謝謝。
to app2001
下載不了。那個網站都打不開。
 
SERVICE_STOPPED=1;
// Stopped == SQL //==
SERVICE_START_PENDING=2;
// Starting == //==
SERVICE_STOP_PENDING=3;
// Stopping == Check //==
SERVICE_RUNNING=4;
// Running == //==
SERVICE_CONTINUE_PENDING=5;
// Restarting after being paused == ISRun //==
SERVICE_PAUSE_PENDING=6;
// Pausing == -ning //==
SERVICE_PAUSED=7;
//Paused == //==
function SQLSCMGetLocalServiceStateA(lpszSvc: PChar;dwErr:LongWord): Integer;
//==
external 'SQLSCMGetLocalServiceStateA@files:w95scm.dll cdecl';
//==
//需要w95scm.dll动态库
function CheckMSSQLServerISSetup: Boolean;
Var //判断当前计算机是否安装MSSQQLServer
SQLPath,SQLDataRoot,SourcePath:String;
begin
Result:=False;
//得到SQL安装目录
IF RegValueExists(HKLM,'Software/Microsoft/MSSQLServer/Setup','SQLPath') then
RegQueryStringValue(HKLM,'Software/Microsoft/MSSQLServer/Setup','SQLPath',SQLPath)
else
Exit;
Result:=True;
//得到SQL数据存放路径
IF RegValueExists(HKLM,'Software/Microsoft/MSSQLServer/Setup','SQLDataRoot') then
RegQueryStringValue(HKLM,'Software/Microsoft/MSSQLServer/Setup','SQLDataRoot',SQLDataRoot);
//得到SQL安装程序所在目录
IF RegValueExists(HKLM,'Software/Microsoft/MSSQLServer/Setup','SourcePath') then
RegQueryStringValue(HKLM,'Software/Microsoft/MSSQLServer/Setup','SourcePath',SourcePath);
end;

procedure CheckMSSQLServer;
var //判断SQLServer 当前运行状态
r,e: LongWORD;
hWnd: Integer;
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
r := SQLSCMGetLocalServiceStateA('MSSQLServer',e);
case r of
SERVICE_STOPPED:
MessageBox(hWnd,'Stoped,没有启动或已停止MSSQLServer服务。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_START_PENDING:
MessageBox(hWnd,'Starting,正在启动MSSQLServer服务。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_STOP_PENDING:
MessageBox(hWnd,'Stopping,正在关闭MSSQLServer服务。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_RUNNING:
MessageBox(hWnd,'Running,MSSQLServer服务已运行。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_CONTINUE_PENDING:
MessageBox(hWnd,'Restarting,正在重新启动MSSQLServer服务。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_PAUSE_PENDING:
MessageBox(hWnd,'Pausing,正在暂停MSSQLServer服务。',TitleCaption, MB_OK or MB_ICONINFORMATION);
SERVICE_PAUSED:
MessageBox(hWnd,'Paused,MSSQLServer服务已暂停。',TitleCaption, MB_OK or MB_ICONINFORMATION);
end;
end;

function StartingSQLServer(hWnd:Integer):Boolean;
var //判断SQLServer 当前运行状态
r,e: LongWORD;
OpenTime: Integer;
SQLPath:String;
ErrorCode: Integer;
begin
Result:=False;
r := SQLSCMGetLocalServiceStateA('MSSQLServer',e);
SQLPath:='';
RegQueryStringValue(HKLM,'Software/Microsoft/MSSQLServer/Setup','SQLPath',SQLPath)
OpenTime:=0;
While ((r<>SERVICE_RUNNING) or (OpenTime<=5))do
begin
case r of
SERVICE_STOPPED:
begin
IF SQLPath='' then
begin
MessageBox(hWnd,'请启动MSSQLServer数据库服务。',TitleCaption,MB_OK or MB_ICONINFORMATION);
Sleep(20000);
End
else
begin
// InstShellExec(SQLPath+'/Binn/scm.exe','-Action 1 -Silent 1',SQLPath,SW_SHOWMINNOACTIVE,ErrorCode);
// ShowText(Hwnd,'正在启动MS SQL Server数据服务.');
// Sleep(5000);
InstExec(SQLPath+'/Binn/scm.exe','-Action 1 -Silent 1',SQLPath,true,true,SW_SHOWMINNOACTIVE,ErrorCode)
// CloseText;
end;
OpenTime:=OpenTime + 1;
end;
SERVICE_START_PENDING:
begin
// ShowText(Hwnd,'正在启动MS SQL Server数据服务.');
Sleep(5000);
OpenTime:=OpenTime + 1;
// CloseText;
end;
SERVICE_STOP_PENDING:
begin
// ShowText(Hwnd,'正在重新启动MS SQL Server数据服务.');
Sleep(5000);
IF SQLPath='' then
begin
MessageBox(hWnd,'请启动MSSQLServer数据库服务。',TitleCaption,MB_OK or MB_ICONINFORMATION);
Sleep(20000);
End
else
begin
// ShowText(Hwnd,'正在启动MS SQL Server数据服务.');
InstExec(SQLPath+'/Binn/scm.exe','-Action 1 -Silent 1',SQLPath,true,true,SW_SHOWMINNOACTIVE,ErrorCode)
// CloseText;
end;
OpenTime:=OpenTime + 1;
// CloseText;
end;
SERVICE_RUNNING:
OpenTime:=10;
SERVICE_CONTINUE_PENDING:
begin
// ShowText(Hwnd,'正在重新启动MS SQL Server数据服务.');
Sleep(5000);
OpenTime:=OpenTime + 1;
// CloseText;
end;
SERVICE_PAUSE_PENDING:
begin
// ShowText(Hwnd,'正在重新启动MS SQL Server数据服务.');
Sleep(5000);
IF SQLPath='' then
begin
MessageBox(hWnd,'请启动MSSQLServer数据库服务。',TitleCaption,MB_OK or MB_ICONINFORMATION);
Sleep(20000);
End
else
begin
/// ShowText(Hwnd,'正在启动MS SQL Server数据服务.');
InstExec(SQLPath+'/Binn/scm.exe','-Action 1 -Silent 1',SQLPath,true,true,SW_SHOWMINNOACTIVE,ErrorCode)
/// CloseText;
end;
OpenTime:=OpenTime + 1;
/// CloseText;
end;
SERVICE_PAUSED:
begin
IF SQLPath='' then
begin
MessageBox(hWnd,'请启动MSSQLServer数据库服务。',TitleCaption,MB_OK or MB_ICONINFORMATION);
Sleep(20000);
End
else
begin
// ShowText(Hwnd,'正在启动MS SQL Server数据服务.');
InstExec(SQLPath+'/Binn/scm.exe','-Action 1 -Silent 1',SQLPath,true,true,SW_SHOWMINNOACTIVE,ErrorCode)
// CloseText;
end;
OpenTime:=OpenTime + 1;
end;
end;
Sleep(5);
r := SQLSCMGetLocalServiceStateA('MSSQLServer',e);
end;
IF OpenTime=10 then
Result:=True else
result:=False;
end;
 
多人接受答案了。
 
后退
顶部