我怎样才能使用installscript来检测Excel.exe的运行?

我一直在尝试检测我的installshield安装程序中的excel进程。 我有一个自定义的动作,运行后,search和popup一个窗口,如果它发现进程,并显示警告给用户。

我曾尝试使用在installsite.org上find的一些旧例子,并使用findWindow()调用。 似乎在进程列表中找不到excel.exe。

这是我在使用findwindow时使用的代码片段

export prototype MyTestFunction(HWND); function MyTestFunction(hMSI) HWND nHwnd; begin nHwnd = FindWindow("EXCEL", ""); if (nHwnd != 0) then MessageBox("found excel", WARNING); SendMessage(nHwnd, WM_CLOSE, 0, 0); else MessageBox("cant find excel", WARNING); endif; end; 

请注意,无论应用程序正在打开还是closures,只有else块才会触发。

我已经尝试了几种不同的变体,主要是用不同的大小写,扩展名和版本replace“excel”。 似乎什么都没有发现窗户。 我用Spy ++,它报告说,窗口是以当前打开的笔记本的名字命名的,这使得事情变得复杂,因为我无法知道用户可以打开什么。

我接受这里的build议。 此解决scheme的唯一要求是它必须能够从Installshield中以自定义操作或部分安装条件运行。

你可以使用一个VBScript自定义操作。 您可以在UISequence或ExecuteSequence(或两者)开头运行此CA如果您希望它作为安装条件的一部分。 如果要停止安装过程,请在vbscript函数中添加代码,并将“自定义操作”的“返回处理”选项configuration为“同步(检查退出代码)”。

这是我的脚本:

 Public Function StopProcess Dim objWMIService, objProcess, colProcess Dim strComputer, executableFileName Const IDABORT = 3 strComputer = "." executableFileName = "excel.exe" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & executableFileName & "'") For Each objProcess in colProcess objProcess.Terminate() ' OR StopProcess = IDABORT Exit for Next End function 

显然,通过查找关联窗口来确定一个进程是否正在运行有其缺陷。

我的build议是检测Excel.exe的进程是否正在运行。 这将涉及列举系统上的进程。 相应地修改你的代码。 它更容易使用C ++来完成,但是有很多例子可以告诉你如何实现我刚才所说的。

https://community.flexerasoftware.com/archive/index.php?t-162141.html

https://community.flexerasoftware.com/archive/index.php?t-188807.html

采取