使用InstallScript 2014项目安装MyApp.exe。最近制造业的人们试图升级到更新的开发版本,但没有关闭现有的MyApp实例。由于应用程序使用的各种dll被锁定并正在使用,因此导致许多权限被拒绝错误。
我希望InstallScript可执行文件可以执行所有Windows人员都熟悉的“阶段和重启”操作。它没有这样做,我在InstallShield项目编辑器中看不到任何明显让我强迫这种行为的东西。
我还期望InstallScript允许我以某种方式检测到我的应用程序已经在运行 - 如果我能够这样做,我可以显示一个对话框,让用户有机会关闭应用程序并继续。唯一的解决方案是InstallSite.org List and Shutdown Running Processes.(请注意,这是另一个S/O question无法回答。)
这不能正确检测所有正在运行的任务,包括我自己的任务。
在我花了几天时间尝试修复InstallScript的一个明显缺失的功能之前,我想我会问是否有更好的方法。
答案 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;