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

时间:2016-05-23 20:56:54

标签: installscript

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

我希望InstallScript可执行文件可以执行所有Windows人员都熟悉的“阶段和重启”操作。它没有这样做,我在InstallShield项目编辑器中看不到任何明显让我强迫这种行为的东西。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

.class::-webkit-scrollbar

然后你叫它

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