【问题标题】:InstallScript detect app during upgrade?InstallScript 在升级期间检测应用程序?
【发布时间】:2016-05-23 20:56:53
【问题描述】:

MyApp.exe 是使用 InstallScript 2014 项目安装的。制造业人员最近尝试升级到更新的开发版本,但没有关闭现有的 MyApp 实例。这导致许多权限被拒绝错误,因为应用程序使用的各种 dll 被锁定并正在使用中。

我希望 InstallScript 可执行文件能够执行所有 Windows 人员都熟悉的通常的“暂存并重新启动”操作。它没有这样做,而且我在 InstallShield 项目编辑器中看不到任何明显让我强制执行该行为的内容。

我还希望 InstallScript 允许我以某种方式检测到我的应用程序已经在运行 - 如果我能做到这一点,我可以显示一个对话框,让用户有机会关闭应用程序并继续。唯一的解决方案是InstallSite.org List and Shutdown Running Processes.(请注意,另一个S/O question 没有回答。)

这并不能正确检测所有正在运行的任务,包括我自己的。

在我花了几天时间尝试修复 InstallScript 似乎明显缺失的功能之前,我想我会问是否有更好的方法。

【问题讨论】:

    标签: installscript


    【解决方案1】:

    这就是我想出的。希望这可以帮助。

    // defines/protos for finding a process
    #define TH32CS_SNAPPROCESS  0x00000002
    
    // in Kernel32.dll
    prototype NUMBER    Kernel32.CreateToolhelp32Snapshot(NUMBER , NUMBER);
    prototype BOOL      Kernel32.Process32First(HWND , POINTER );
    prototype BOOL      Kernel32.Process32Next(HWND , POINTER );
    
    // from minwindef.h, windows api
    typedef PROCESSENTRY32
    begin
        number dwSize;
        number cntUsage;
        number th32ProcessID;          // this process
        number th32DefaultHeapID;
        number th32ModuleID;           // associated exe
        number cntThreads;
        number th32ParentProcessID;    // this process's parent process
        number pcPriClassBase;        // Base priority of process's threads
        number dwFlags;
        STRING szExeFile[MAX_PATH];     // Path
    end;
    
    // ========================================================================================
    // list all of the running processes, see if Flex is running
    // based on https://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx
    // ========================================================================================
    function BOOL IsProcessRunning(sProcessName)
        HWND hProcessSnap;
        PROCESSENTRY32 pe;
        POINTER ppe;
        NUMBER ret;
    
    begin
        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    
        pe.dwSize = SizeOf(pe); 
        ppe = &pe;
    
        ret = Process32First(hProcessSnap, ppe);
    
        if (ret == 0) then
          //printError(TEXT("Process32First")); // show cause of failure
          CloseHandle(hProcessSnap);          // clean the snapshot object
          return(FALSE);
        endif;
    
        repeat      
            if (StrCompare(sProcessName, pe.szExeFile) == 0) then
                CloseHandle(hProcessSnap);          // clean the snapshot object
                return(TRUE);
            endif;
            ret = Process32Next(hProcessSnap, ppe);
        until (ret == 0);
    
       return(FALSE);
    end;
    

    然后调用它

    if (IsProcessRunning("WORD.EXE")) then
        blah blah
    endif;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 2011-05-12
      • 2012-06-20
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多