如何知道在程序中获取MSDE安装完成(100分)

  • 主题发起人 主题发起人 forpromise
  • 开始时间 开始时间
F

forpromise

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有个程序需要发布,一个是MSDE 2000,另外一个是打包程序,没法更改只有setup.exe
现在我要做的事情是:
1.检测机器是否安装了SQL Server或者MSDE 2000 //这步容易做到
2.如果没安装MSDE2000,则安装MSDE 2000, //这步也做到了
3.在安装完MSDE2000后,程序里如何获得MSDE已经安装完成了,然后继续安装软件
如果是SQL SERVER安装的话,我检查下windows目录下的sqlstp.log文件就知道了,但MSDE 2000没有安装的日志文件,
我通过CreateProcess获取安装进程ID,然后在进程列表里总是找不到,如果能找到这个那问题也解决了
用WaitForSingleObject,WinExecAndWait同样没成功...请各位指点迷津.奉上100意思下
 
问题已解决,不知道怎么结帖...MSDE安装调用了子进程,如果只判断查找Setup.exe运行的进程,显然不能达到目的,只要在进程列表里再查找下有没有进程的父进程是运行Setup.exe运行的进程即可,不过仅仅局限于子进程没有再调用子进程的情况.
定义一个私有变量dwProcessID
第一个函数是用来获取运行程序的进程ID,参数oExename为exe文件的路径
第二个函数是通过查找进程的方法来检测安装程序有没有安装完成,
代码如下,有些变量需要自己去定义,单元自己引用
function TForm1.GetProcessID(oExeName:PAnsiChar):Cardinal;
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow:=SW_SHOWNORMAL;
if CreateProcess(nil,oExeName,nil,nil,false,Create_new_console or Normal_priority_class,nil,nil,StartupInfo,ProcessInfo) then
dwProcessID := processinfo.dwProcessId ;
Result:= dwProcessID;
end;

function TForm1.FindProcess: Boolean;
var
hSnapshot: THandle;//用于获得进程列表
lppe: TProcessEntry32;//用于查找进程
Found: Boolean;//用于判断进程遍历是否完成
begin
Result:=False;
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表
lppe.dwSize:=SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小
Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中
while Founddo
begin
if (lppe.th32ProcessID=dwProcessID) or (lppe.th32ParentProcessID=dwProcessID) then
begin
Result:=True;
Exit;
end;
Found := Process32Next(hSnapshot,lppe);//将进程列表的下一个进程信息读入lppe记录中
end;
end;
 
把分我就可以结贴了,分不能收回。
 
100分,2人分。帖子可以收藏。
 
多人接受答案了。
 
后退
顶部