【问题标题】:How can I use installscript to detect Excel.exe running?如何使用 installscript 检测 Excel.exe 正在运行?
【发布时间】:2015-06-25 19:33:20
【问题描述】:

我一直在尝试在我的 installshield 安装程序中检测 excel 进程。 我有一个在 appsearch 之后运行的自定义操作,如果它找到该进程并向用户显示警告,则会弹出一个窗口。

我尝试使用我在 installsite.org 上找到的一些旧示例并使用 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;

请注意,无论应用程序是打开还是关闭,似乎都只会触发 else 块。

我尝试了几种不同的变体,主要是用不同的大小写、扩展名和版本替换“excel”。似乎没有任何东西检测到窗口。我使用了 Spy++,它报告说该窗口以当前打开的笔记本的名称命名,这使事情变得复杂,因为我无法知道用户可以打开什么。

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

【问题讨论】:

    标签: excel installshield custom-action installscript installshield-2012


    【解决方案1】:

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

    这是我的脚本:

    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
    

    【讨论】:

    • 如果打开了重要文件怎么办? , 让用户选择关闭其文件
    【解决方案2】:

    显然试图通过查找关联窗口来确定进程是否正在运行有其陷阱。

    我的建议是检测 Excel.exe 的进程是否正在运行。它将涉及枚举系统上的进程。相应地修改您的代码。使用 C++ 更容易做到这一点,但有许多可用的示例向您展示如何实现我刚才所说的。

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

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

    【讨论】:

      【解决方案3】:

      我们也可以编写一个 InstallScript 代码来实现这一点。请参考以下代码:

      function CheckRunningProcessAndTerminate(hMSI)
      // To Do:  Declare local variables.
      OBJECT wmi,objProc;
      STRING szProcessName;
      
      begin
      // To Do:  Write script that will be executed when MyFunction is called.
      szProcessName = "Excel.exe";
      
      set wmi = CoGetObject("winmgmts://./root/cimv2", "");
      set objProc = wmi.ExecQuery("Select * from Win32_Process where Name = '" + szProcessName + "'");
      
      if (objProc.count > 0) then
          MessageBox("Process is running.", INFORMATION);
          //kill proces
          TerminateProcesses(szProcessName); 
          //objProc.Terminate(); //I tried this, but it didn't worked.
      else
          MessageBox("Process is not running.", INFORMATION);
      endif;
      
       end;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多