1.在操作时,首先引入类库ShutDownRunningApp.rul,其中ShutDownRunningApp.rul代码如下

//////////////////////////////////////////////////////////////////////////////
//
// Description: WindowsNT process control functions.
//
// The process code is adapted fromcode posted by William F.
// Snodgrass to www.installsite.org.The original code header
// is appended below. The array codeis adapted from code posted
// by Rajesh Ramachandran to theinstallshield.is6.installscript
// newsgroup.
//
// Submitted by RichardIwasa (riwasa@email.com).
//
// Usage example:
//
// ifProcessRunning("notepad") then
// MessageBox("Application isrunning.", INFORMATION);
//
// ProcessEnd("notepad");
//
// Delay(2); // Delay to allow process list to refresh
//
// if ProcessRunning("notepad")then
// MessageBox("Application isrunning.", INFORMATION);
// else
// MessageBox("Application is notrunning.", INFORMATION);
// endif;
// else
// MessageBox("Application is notrunning.", INFORMATION);
// endif;
//
// Original code headerappended below:
//
// GetRunningApp();
// ShutDownApp();
//
// These script createdfunctions will look for any running application
// based on the filename, then display an error message within the Setup.
// You can optionally haltthe install or just continue on.
//
// You can use theShutDownApp() function for shutting down that process
// or others as well.This is useful for processes that run in the
// background but haveno Windows associated with them. May not work with
// Services.
//
// This script callsfunctions in PSAPI.DLL that are not supported on
// Windows 95 or 98.
//
// ***Instructions***
// Place these scriptpeices into the Setup.rul file.
//
// Modify the script toinclude the applications you would like to get or
// shutdown.
//
// Submitted by WilliamF. Snodgrass
// Contact info:bsnodgrass@geographix.com
//
// Created by TheronWelch, 3/3/99
// Minor modificationsby Stefan Krueger, 11/03/99
//
// Copyright (c)1999-2000 GeoGraphix, Inc.
//
////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////
// Function prototypes.
///////////////////////////////////////////////// prototype POINTERArrayToPointer(BYREF VARIANT);
prototype NUMBER ProcessEnd(STRING);
prototype BOOL ProcessRunning(STRING); // Kernel functions. prototype NUMBERKernel32.OpenProcess(NUMBER, BOOL, NUMBER);
prototype NUMBERKernel32.TerminateProcess(NUMBER, NUMBER); // Process informationfunctions. prototype NUMBERPSAPI.EnumProcesses(POINTER, NUMBER, BYREF NUMBER);
prototype NUMBERPSAPI.EnumProcessModules(NUMBER, BYREF NUMBER, NUMBER,
BYREF NUMBER);
prototype NUMBERPSAPI.GetModuleFileNameExA(NUMBER, NUMBER, BYREF STRING,
NUMBER); /////////////////////////////////////////////////
// Structures.
///////////////////////////////////////////////// // Structure to mirrorthe C/C++ SAFEARRAY data structure. typedef _SAFEARRAY
begin
SHORT cDims;
SHORT fFeatures;
LONG cbElements;
LONG cLocks;
POINTER pvData;
// rgsaBound omitted
end; // Structure to mirrorthe C/C++ VARIANT data structure. typedef _VARIANT
begin
SHORT vt;
SHORT wReserver1;
SHORT wReserved2;
SHORT wReserved3;
NUMBER nData;
end; /////////////////////////////////////////////////
// Constants.
///////////////////////////////////////////////// #define PSAPI_FILE "psapi.dll" // Windows NT process DLL
#define PROCESSID_LENGTH 4 // 4 bytes (DWORD) for a process ID // Process informationconstants. #definePROCESS_QUERY_INFORMATION 0x400
#definePROCESS_ALL_ACCESS 0x1f0fff
#definePROCESS_VM_READ 0x10 //////////////////////////////////////////////////////////////////////////////
//
// Function: ArrayToPointer
//
// Description: Convertsan InstallShield array into a C array.
//
// When an array is created inInstallScript, a VARIANT variable
// is created which holds anOLEAutomation SAFEARRAY. To pass
// such an array to a DLL functionexpecting a C-style array,
// this function explicitlytypecasts the pointer to the array
// to a _VARIANT pointer so that the_SAFEARRAY pointer can be
// extracted. The pointer to theactual data is then extracted
// from the _SAFEARRAY pointer.
//
// Parameters: structArray - Array variable.
//
// Returns: POINTER - Pointer to array.
//
////////////////////////////////////////////////////////////////////////////// function POINTERArrayToPointer(structArray)
_SAFEARRAY POINTER pstructArray; // _SAFEARRAY array pointer
_VARIANT POINTER pstructVariant; //_VARIANT array pointer
begin
// Typecast the pointer to the array to a_VARIANT pointer. pstructVariant = &structArray; // Extract the _SAFEARRAY pointer from the_VARIANT. pstructArray = pstructVariant->nData; // Return the pointer to the actual datafrom the _SAFEARRAY. return pstructArray->pvData;
end; //////////////////////////////////////////////////////////////////////////////
//
// Function: _Process_End
//
// Description:Terminates running processes for the specified application.
//
// Parameters: szAppName - Name of the application toterminate.
//
// Returns: >= 0 - Number of processes terminated.
// -1 - Failure.
//
////////////////////////////////////////////////////////////////////////////// function NUMBERProcessEnd(szAppName)
NUMBER nvReturn; // Number ofprocesses terminated
NUMBER nvProcessIDs(512); // Array ofprocess IDs
NUMBER nvBytesReturned; // Number ofbytes returned in process ID array
NUMBER nvProcesses; // Number ofprocesses running
NUMBER nvIndex; // Loop index
NUMBER nvProcessHandle; // Handle to aprocess
NUMBER nvModuleHandle; // Handle to aprocess module
NUMBER nvBytesRequired; // Number ofbytes required to store values
POINTER pvProcessIDs; // Pointer to process ID array
STRING svModuleName; // Module name
STRING svFileName; // Modulefilename
begin
// The psapi.dll reads the Windows NTperformance database. The DLL
// is part of the Win32 SDK. if UseDLL(WINSYSDIR ^ PSAPI_FILE) < 0then
// Could not load psapi.dll. MessageBox("ERROR: Could not load[" + WINSYSDIR ^ PSAPI_FILE +
"].", SEVERE); return -1;
endif; // Get the PIDs of all currently runningprocesses. pvProcessIDs =ArrayToPointer(nvProcessIDs); EnumProcesses(pvProcessIDs, 512,nvBytesReturned); // Determine the number of process IDsretrieved. Each process ID
// is PROCESSID_LENGTH bytes. nvProcesses = nvBytesReturned /PROCESSID_LENGTH; // Get the executable associated with eachprocess, and check if
// its filename matches the one passed tothe function. for nvIndex = 1 to nvProcesses
// Get a handle to the process. TheOpenProcess function
// must have full (all) access to beable to terminate
// processes. nvProcessHandle =OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_ALL_ACCESS, 0,nvProcessIDs(nvIndex)); if nvProcessHandle != 0 then
// Get a handle to the first modulein the process, which
// should be the executable. ifEnumProcessModules(nvProcessHandle, nvModuleHandle,
PROCESSID_LENGTH,nvBytesRequired) != 0 then
// Get the path of the module. ifGetModuleFileNameExA(nvProcessHandle, nvModuleHandle,
svModuleName,SizeOf(svModuleName)) != 0 then
// Extract the filename(without an extension) from
// the path. ParsePath(svFileName,svModuleName, FILENAME_ONLY); if StrCompare(svFileName,szAppName) = 0 then
// The process modulematches the application
// name passed to thefunction. ifTerminateProcess(nvProcessHandle, 0) > 0 then
nvReturn++;
endif;
endif;
endif;
endif;
endif;
endfor; if UnUseDLL(PSAPI_FILE) < 0 then
MessageBox("ERROR: Could notunload [" + WINSYSDIR ^ PSAPI_FILE +
"].", SEVERE); return -1;
endif; return nvReturn;
end; //////////////////////////////////////////////////////////////////////////////
//
// Function: _Process_Running
//
// Description:Determines if the specified process is running in memory.
//
// Parameters: szAppName - Name of the application to check.
//
// Returns: TRUE - The process is running.
// FALSE - The process is notrunning.
//
////////////////////////////////////////////////////////////////////////////// function BOOLProcessRunning(szAppName)
BOOL bvRunning; // Process isrunning
NUMBER nvProcessIDs(512); // Array ofprocess IDs
NUMBER nvBytesReturned; // Number ofbytes returned in process ID array
NUMBER nvProcesses; // Number ofprocesses running
NUMBER nvIndex; // Loop index
NUMBER nvProcessHandle; // Handle to aprocess
NUMBER nvModuleHandle; // Handle to aprocess module
NUMBER nvBytesRequired; // Number ofbytes required to store values
POINTER pvProcessIDs; // Pointer to process ID array
STRING svModuleName; // Module name
STRING svFileName; // Modulefilename
begin
// The psapi.dll reads the Windows NTperformance database. The DLL
// is part of the Win32 SDK. if UseDLL(WINSYSDIR ^ PSAPI_FILE) < 0then
// Could not load psapi.dll. MessageBox("ERROR: Could not load[" + WINSYSDIR ^ PSAPI_FILE +
"].", SEVERE); return FALSE;
endif; // Get the PIDs of all currently runningprocesses. pvProcessIDs =ArrayToPointer(nvProcessIDs); EnumProcesses(pvProcessIDs, 512,nvBytesReturned); // Determine the number of process IDsretrieved. Each process ID
// is PROCESSID_LENGTH bytes. nvProcesses = nvBytesReturned /PROCESSID_LENGTH; // Get the executable associated with eachprocess, and check if
// its filename matches the one passed tothe function. for nvIndex = 1 to nvProcesses
// Get a handle to the process. nvProcessHandle =OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ, 0,nvProcessIDs(nvIndex)); if nvProcessHandle != 0 then
// Get a handle to the first modulein the process, which
// should be the executable. ifEnumProcessModules(nvProcessHandle, nvModuleHandle,
PROCESSID_LENGTH,nvBytesRequired) != 0 then
// Get the path of the module. ifGetModuleFileNameExA(nvProcessHandle, nvModuleHandle,
svModuleName,SizeOf(svModuleName)) != 0 then
// Extract the filename(without an extension) from
// the path. ParsePath(svFileName,svModuleName, FILENAME_ONLY); if StrCompare(svFileName,szAppName) = 0 then
// The process modulematches the application
// name passed to thefunction. bvRunning = TRUE; goto ProcessRunningEnd;
endif;
endif;
endif;
endif;
endfor; ProcessRunningEnd: if UnUseDLL(PSAPI_FILE) < 0 then
MessageBox("ERROR: Could notunload [" + WINSYSDIR ^ PSAPI_FILE +
"].", SEVERE); return FALSE;
endif; return bvRunning;
end;

2.然后Setup.rul 代码如下:

//===========================================================================
//
// File Name: Setup.rul
//
// Description: Blank setup main script file
//
// Comments: Blank setup is an empty setup project. If you want to
// create a new project via. step-by step instructions use the
// Project Assistant.
//
//=========================================================================== // Included header files----------------------------------------------------
#include"ifx.h"
#include"ShutDownRunningApp.rul"
// Note: In order tohave your InstallScript function executed as a custom
// action by the WindowsInstaller, it must be prototyped as an
// entry-point function. // The keyword exportidentifies MyFunction() as an entry-point function.
// The argument itaccepts must be a handle to the Installer database. /* export prototypeMyFunction(HWND); */ function OnFirstUIBefore()
NUMBER nResult,nSetupType;
STRING szTitle, szMsg;
begin if ProcessRunning("SOMME") then
MessageBox("Application isrunning.", INFORMATION); ProcessEnd("SOMME"); Delay(2); // Delay to allow process list to refresh if ProcessRunning("SOMME")then
MessageBox("Application isrunning.", INFORMATION);
else
MessageBox("Application is notrunning.", INFORMATION);
endif;
else
MessageBox("Application is notrunning.", INFORMATION);
endif; abort; // TO DO: if you want to enable background,window title, and caption bar title
// SetTitle( @TITLE_MAIN, 24, WHITE );
// SetTitle( @TITLE_CAPTIONBAR, 0,BACKGROUNDCAPTION );
// Enable( FULLWINDOWMODE );
// Enable( BACKGROUND );
// SetColor(BACKGROUND,RGB (0, 128,128)); TARGETDIR = PROGRAMFILES ^@COMPANY_NAME^@PRODUCT_NAME; Dlg_Start:
// beginning of dialogs label Dlg_ObjDialogs:
nResult = ShowObjWizardPages(nResult);
if (nResult = BACK) goto Dlg_Start; // setup default status
SetStatusWindow(0, "");
Enable(STATUSEX);
StatusUpdate(ON, 100); return 0;
end; //////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: OnFirstUIAfter
//
// EVENT: FirstUIAfter event is sent after file transfer, when installation
// is run for the first time ongiven machine. In this event handler
// installation usually displays UIthat will inform end user that
// installation has been completedsuccessfully.
//
///////////////////////////////////////////////////////////////////////////////
functionOnFirstUIAfter()
begin
Disable(STATUSEX); ShowObjWizardPages(NEXT);
end; ///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: OnMaintUIAfter
//
// EVENT: MaintUIAfter event is sent after file transfer, when end user runs
// installation that has alreadybeen installed on the machine. Usually
// this happens through Add/RemovePrograms applet.
// In the handler installationusually displays UI that will inform
// end user thatmaintenance/uninstallation has been completed successfully.
//
///////////////////////////////////////////////////////////////////////////////
functionOnMaintUIAfter()
begin
Disable(STATUSEX); ShowObjWizardPages(NEXT);
end; ///////////////////////////////////////////////////////////////////////////////
//
// FUNCTION: OnMoving
//
// EVENT: Moving event is sent when file transfer is started as a result of
// ComponentTransferData call,before any file transfer operations
// are performed.
//
///////////////////////////////////////////////////////////////////////////////
function OnMoving()
STRING szAppPath;
begin
// Set LOGO Compliance Application Path
// TO DO : if your application .exe is in asubfolder of TARGETDIR then add subfolder
szAppPath = TARGETDIR;
RegDBSetItem(REGDB_APPPATH, szAppPath);
RegDBSetItem(REGDB_APPPATH_DEFAULT,szAppPath ^ @PRODUCT_KEY);
end; //---------------------------------------------------------------------------
// OnBegin
//
// The OnBegin event iscalled directly by the framework after the setup
// initializes.
//---------------------------------------------------------------------------
function OnBegin()
begin Disable (BACKBUTTON);
if(!MAINTENANCE)then
SdLicense2 ("License ", "Yes","False",SUPPORTDIR^"2.txt", FALSE);
endif; end;

Installshield 在安装或者卸载过程中,判断某一程序是否正在运行的更多相关文章

  1. Office2007在安装、卸载过程中出错的解决办法

    Micorsoft office professional plus 2007在安装过程中出错,错误1706 如果在安装OFFICE 2007的 时候,遇到“Microsoft Office 2007 ...

  2. oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序

    15511477451 原文 oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序? 环境:win7 64位系统.oracle11g数据库 问题描述:在win7 64位系统 ...

  3. (转)CloudStack 安装及使用过程中常见问题汇总

    CloudStack 安装及使用过程中常见问题汇总             在做工程项目中对CloudStack 安装及使用过程中常见的几个问题及如何解决做一个总结.   1.Windows XP虚拟 ...

  4. centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题。

    centos7安装Python3的过程中会和Python2.7版本冲突导致yum版本比对应,致使yum不能使用的问题. 原因:yum调用Python,启动程/usr/bin/yum就是一个python ...

  5. (最新)VS2015安装以及卸载过程——踩坑实录

    前言 Visual Studio (简称VS)是微软公司旗下最重要的软件集成开发工具产品.是目前最流行的 Windows 平台应用程序开发环境,也是无数人学习编程的入门软件之一.Visual Stud ...

  6. 安装CouchbaseClient的过程中提示 Error 1935.An error occurred during the installation of assembly;Error:-1603 fatal error during installation

    安装过程中提示报错   点击确定后 安装程序会接着回滚,又提示报错如下       Error 1935的解决方法是下载一个微软的补丁. http://support.microsoft.com/de ...

  7. Oracle 安装安全补丁过程中出现的问题

    为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...

  8. 安装python caffe过程中遇到的一些问题以及对应的解决方案

    关于系统环境: Ubuntu 16.04 LTS cuda 8.0 cudnn 6.5 Anaconda3 编译pycaffe之前需要配置文件Makefile.config ## Refer to h ...

  9. 我在MySQL免安装版使用过程中遇到的问题记录

    我的MySQL版本为:mysql-5.7.16-winx64 安装时间为:2016年5月10号 由于是免安装版,下载好压缩文件之后解压到特定目录下,再打开命令行运行几行命令即可. 在一次操作中,发现无 ...

随机推荐

  1. HDU 1243 反恐训练营 (动态规划求最长公共子序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. AngularJS之forEach

    angular.forEach 描述:     循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator( ...

  3. [Angular Form] ngModel and ngModelChange

    When using Radio button for Tamplate driven form, we want to change to the value change and preform ...

  4. Yii学习笔记之四(表单验证 api 翻译)

    1.表单验证 对于用户输入的全部数据,你不能信任,必须加以验证. 全部框架如此.对于yii 能够使用函数  yii\base\Model::validate()  进行验证 他会返回boolean值的 ...

  5. lower_case_table_names(大小写敏感)

    1 简介    在MySQL中,数据库对应数据目录中的目录.数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎).因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小 ...

  6. Procedural graphics architectures and techniques

    BACKGROUND The evolution of graphics rendering technology has led to the development of procedural t ...

  7. 【序列操作V】平衡树(无旋treap)

    题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...

  8. 关于生命周期里执行setState

    React里生命周期的哪些方法里可以执行setState,这对于很多使用React很长时间的开发都是个迷惑的问题. 先看一下完整的生命周期. 再看两篇文章 React componentDidUpda ...

  9. 【13.91%】【codeforces 593D】Happy Tree Party

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  10. PAT 1041-1050 题解

    浏览全部代码:请戳 本文谨代表个人思路,欢迎讨论;) 1041. Be Unique (20) 题意 给出 N (<=105)个数(数值范围为 [1, 104]),找到其中不重复的第一个数字.比 ...