InstallScript 在升级期间检测到应用程序?

InstallScript detect app during upgrade?

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

我希望 InstallScript 可执行文件能够做 "stage and reboot" 所有 Windows 人都熟悉的事情。它没有这样做,而且我在 InstallShield 项目编辑器中看不到任何明显让我强制执行该行为的内容。

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

这没有正确检测到所有 运行 任务,包括我自己的任务。

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

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

// 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;