Installshield停止操作系统进程的代码--IS5版本适用

原文:Installshield停止操作系统进程的代码--IS5版本适用

出处:http://www.installsite.org/pages/en/isp_ext.htm
这个地址上有不少好东西,有空要好好研究下
里面的“List and Shut Down Running Applications”就是演示了Installshield如何停止操作系统进程

Code
/**********************************************************************************
/* GetRunningApp();
/* ShutDownApp();
/* 
/* These script created functions will look for any running application based on
/* the file name, then display an error message within the Setup. You can optionally
/* halt the install or just continue on.
/* 
/* You can use the ShutDownApp() function for shutting down that process or others
/* as well. This is useful for processes that run in the background but have no Windows
/* associated with them. May not work with Services.
/* 
/* This script calls functions in PSAPI.DLL that are not supported on Windows 95 or 98.
/* 
/* ***Instructions***
/* Place these script peices into the Setup.rul file.
/* 
/* Modify the script to include the applications you would like to get or shutdown.
/* 
/* Submitted by William F. Snodgrass
/* Contact info: [email protected]
/* 
/* Created by Theron Welch, 3/3/99
/* Minor modifications by Stefan Krueger, 11/03/99
/* 
/* Copyright (c) 1999-2000 GeoGraphix, Inc. 
**********************************************************************************/

//////////////////// installation declarations ///////////////////

// ----- DLL function prototypes -----

// your DLL function prototypes
    
// Custom function for shutting down MyApp process
prototype ShutDownApp();

// Custom function for shutting down any running application
prototype GetRunningApp( BYREF STRING );

///////////////////////////////////////////////////////////////////////////////////
// Dll function calls needed

// Kernel functions
prototype LONG Kernel32.OpenProcess( LONG, BOOL, LONG ); // 1ST Param = 2035711 for PROCESS_ALL_ACCESS (It pays to know hex!!), 2nd = Doesn‘t matter, 3rd = Process ID
prototype BOOL Kernel32.TerminateProcess( LONG, INT );   // 1st Param = Process ID, 2nd = Doesn‘t matter - "0"

// Process info functions
prototype LONG Psapi.EnumProcesses( POINTER, LONG, BYREF LONG );  // 1st Param = By ref, Process ID, 2nd = number of bytes in param 1 = "4", 3rd = cb needed - might as well be "4"
prototype LONG Psapi.GetModuleFileNameExA( LONG, LONG, POINTER, LONG );// 1st Param = ProcessID, 2nd= Module ID, 3rd = pointer to a string, 4th = length of string
prototype LONG Psapi.EnumProcessModules( LONG, BYREF LONG, LONG, BYREF LONG ); // 1st Param = Process Handle, 2nd = Module Handle, 3rd = bytes passed ("4"), 4th = bytes needed ("4")
///////////////////////////////////////////////////////////////////////////////////

// your global variables
STRING    svApp

program

if ( 1 == GetRunningApp ( svApp ) ) then
        MessageBox ( "The installation has detected that " + svApp + " is running. " +
                 "Please close " + svApp + " then restart the installation process.", SEVERE );
        abort;
   endif;
   
   if ( 0 == ShutDownProjectManager() ) goto end_install; // This statement is within the Program block and jumps to the
                                   "end_install:" switch if the function fails. -WFS
                                   
endprogram

///////////////////////////////////////////////////////////////////////////////////
//
// Function: GetRunningApp
//
// Purpose: This function returns "1" if an app is running.  Otherwise "0".
//    If "1" is returned, the "appName" parameter will contain the name of the 
//    application running.
//
// Theron Welch 3/3/99
//
///////////////////////////////////////////////////////////////////////////////////
function GetRunningApp( appName )
    HWND hWnd;
    LONG ProcessIDs[ 512 ];                // An array that‘s hopefully big enough to hold all process IDs
    LONG cbNeeded;
    LONG cb;
    LONG numItems;
    LONG ProcessHandle;
    LONG ModuleHandle;
    LONG Count;
    LONG Ret;
    LONG Ret2;
    POINTER pArray;                    // This pointer will point at the array of process IDs
    STRING ModuleName[ 128 ];
    STRING FileName[ 64 ];
    POINTER pModuleName;
begin

UseDLL ( WINSYSDIR ^ "Psapi.dll" );    // Load the helper dll - PsApi.dll
    
    cbNeeded = 96;
    cb = 8;
    
    pArray = &ProcessIDs;                // Point at the array
    
    while ( cb <= cbNeeded )
        cb = cb * 2;
        EnumProcesses ( pArray, cb, cbNeeded ); // Get the currently running process IDs
    endwhile;
    numItems = cbNeeded / 4;            // Calculate number of process IDs - 4 is the size in bytes of a Process ID (DWORD)
        
    for Count = 1 to numItems            // For each process id

ProcessHandle = OpenProcess ( 2035711, 1, ProcessIDs[ Count ] ); // Get a handle to the process
        if ( 0 != ProcessHandle ) then
            
            Ret = EnumProcessModules ( ProcessHandle, ModuleHandle, 4, cb ); // Get the module handle - first one is EXE, the one I care about!
            if ( 0 != Ret ) then

pModuleName = &ModuleName;    // Point at the array
                Ret = GetModuleFileNameExA ( ProcessHandle, ModuleHandle, pModuleName, 128 ); // Get the exe name
                if ( 0 != Ret ) then
                
                    ParsePath ( FileName, ModuleName, FILENAME_ONLY ); // Convert the full path to a filename

//////////////////////////////Outlook/////////////////////////////////////////
                    // Copy the next 5 lines and customize for each app
                    Ret = StrCompare ( FileName, "Outlook" );
                    if ( 0 == Ret  ) then    // If there‘s a match
                        FileName = "Microsoft Outlook"; // Change to a name that makes sense
                        appName = FileName;        // Copy the filename to the passed in parameter (by ref)
                        return 1;            // Return "Found"
                    endif;
                    ///////////////////////////////////////////////////////////////////////////////

//////////////////////////////Navwnt/////////////////////////////////////////
                    Ret = StrCompare ( FileName, "Navwnt" );
                    if ( 0 == Ret  ) then    // If there‘s a match
                        FileName = "Norton Anti-Virus"; // Change to a name that makes sense
                        appName = FileName;        // Copy the filename to the passed in parameter (by ref)
                        return 1;            // Return "Found"
                    endif;
                    ///////////////////////////////////////////////////////////////////////////////
                endif;
            endif;
        endif;
    endfor;    
    return 0;    // "Well, uh, apparently, no application is running"
end;

///////////////////////////////////////////////////////////////////////////////////
//
// Function: ShutDownApp
//
// Purpose: This function attempts to shut down the app you decide on.  It returns
//        "1" if successful or if app is not running.
//        Otherwise "0" if it could not be shut down.  Install should terminate
//        if "0" is returned.
//
// Theron Welch 3/3/99
//
///////////////////////////////////////////////////////////////////////////////////

function ShutDownApp()
    HWND hWnd;
    LONG ProcessIDs[ 512 ];                // An array that‘s hopefully big enough to hold all process IDs
    LONG cbNeeded;
    LONG cb;
    LONG numItems;
    LONG ProcessHandle;
    LONG ModuleHandle;
    LONG Count;
    LONG Ret;
    LONG Ret2;
    POINTER pArray;                    // This pointer will point at the array of process IDs
    STRING ModuleName[ 128 ];
    STRING FileName[ 64 ];
    POINTER pModuleName;
begin

UseDLL ( WINSYSDIR ^ "Psapi.dll" );        // Load the helper dll - PsApi.dll
    
    cbNeeded = 96;
    cb = 8;
    
    pArray = &ProcessIDs;                // Point at the array
    
    while ( cb <= cbNeeded )
        cb = cb * 2;
        EnumProcesses ( pArray, cb, cbNeeded ); // Get the currently running process IDs
    endwhile;
    numItems = cbNeeded / 4;            // Calculate number of process IDs - 4 is the size in bytes of a Process ID (DWORD)
        
    for Count = 1 to numItems            // For each process id

ProcessHandle = OpenProcess ( 2035711, 1, ProcessIDs[ Count ] ); // Get a handle to the process
        if ( 0 != ProcessHandle ) then
            
            Ret = EnumProcessModules ( ProcessHandle, ModuleHandle, 4, cb ); // Get the module handle - first one is EXE, the one I care about!
            if ( 0 != Ret ) then

pModuleName = &ModuleName;    // Point at the array
                Ret = GetModuleFileNameExA ( ProcessHandle, ModuleHandle, pModuleName, 128 ); // Get the exe name
                if ( 0 != Ret ) then
                
                    ParsePath ( FileName, ModuleName, FILENAME );     // Convert the full path to a filename
                    // MessageBox( FileName, INFORMATION );
                    Ret = StrCompare ( FileName, "MYAPP~1.EXE" );    // Compare filenames (used for short file names. -WFS)
                    Ret2 = StrCompare ( FileName, "MYAPP.exe" );    // Compare filenames
                    if ( 0 == Ret || 0 == Ret2 ) then            // If it‘s the filename I‘m looking for
                        Ret = TerminateProcess( ProcessHandle, 0 );    // Terminate the process
                        if ( 0 == Ret ) then
                            goto Error;
                        endif;
                        goto Quit;
                endif;
                
                endif;
                
            endif;
                
        endif;

endfor;    
    
    Quit:
    
    UnUseDLL ( "Psapi.dll" );    // Unload the helper dll - PsApi.dll                    
    return 1;    // Happy
    
    Error:
    
    UnUseDLL ( "Psapi.dll" );    // Unload the helper dll - PsApi.dll                    
    return 0;    // Sad

end;

Installshield停止操作系统进程的代码--IS5版本适用

时间: 2024-10-11 11:54:26

Installshield停止操作系统进程的代码--IS5版本适用的相关文章

Installshield停止操作系统进程的代码 --IS6及以上版本适用

原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code //////////////////////////////////////////////////////////////////////////////////                                                                            //  IIIIIII SSSSSS               

AD帐户操作C#示例代码(一)——导入用户信息

最近写了一个AD帐户导入的小工具(为啥写作“帐”户呢?),跟大家分享下相关代码,欢迎各位高手指教! 首先,我准备一个这样的Excel文件作为导入模版,并添加了一些测试数据. 然后,我打开Visual Studio 2012,新建一个Windows窗体应用程序.在主窗体界面,我放了一些Label.TextBox.Button控件,还有一个ProgressBar. 开始写代码.首先写从Excel里读取数据的方法. private static async Task<DataTable> GetTa

(转)几个常用的操作系统进程调度算法

几个常用的操作系统进程调度算法 转自:http://blog.csdn.net/wanghao109/article/details/13004507 一.先来先服务和短作业(进程)优先调度算法 1.先来先服务调度算法 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源.创建进程,然后放入就绪队列.在进程调度中采用FCFS算法时,

C#开发中使用Npoi操作excel实例代码

C#开发中使用Npoi操作excel实例代码 出处:西西整理 作者:西西 日期:2012/11/16 9:35:50 [大 中 小] 评论: 0 | 我要发表看法 Npoi 是什么? 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.Npoi 下载地址:http://npoi.codeplex.com/releases/view/38113 3.Npoi 学习系列教程推荐:http://www.cnblogs.com

jquery操作单选钮代码示例

jquery操作单选钮代码示例:radio单选按钮是最重要的表单元素之一,下面介绍一下常用的几个jquery对radio单选按钮操作.一.取消选中: $(".theclass").each(function(){ if($(this).attr('checked')) { $(this).attr('checked',false); } }); 以上代码可以将class属性值为theclass的被选中单选按钮取消选中.二.获取被选中的单选按钮的值: var val=$('.thecla

ios多线程操作(七)—— GCD延迟操作与一次性代码

使用GCD函数可以进行延时操作,该函数为 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ }); 现在我们来分解一下参数 dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)) : NSEC_PER_SEC在头文

30 个 php 操作 redis 常用方法代码例子

这篇文章主要介绍了 30 个 php 操作 redis 常用方法代码例子 , 本文其实不止 30 个方法 , 可以操作 string 类型. list 类型和 set 类型的数据 , 需要的朋友可以参考下redis 的操作很多的,以前看到一个比较全的博客,但是现在找不到了.查个东西搜半天,下面整理一下php 处理 redis 的例子,个人觉得常用一些例子.下面的例子都是基于 php-redis 这个扩展的.1 , connect描述:实例连接到一个 Redis.参数: host: string

获取当前的版本代码和版本名称

我们在清单文件中都会写上版本名和版本号,版本名是给用户和商店看的,一般是几点几,比如1.2版本,版本号是给程序看的,可以来设置数据库更新或者是更改缓存. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kale.mycmcc" android:versionCode="5" android:versionName="

无法执行添加/移除操作,因为代码元素 是只读的

刚刚学习用MFC编写嵌入式软件,各种问题接踵而来啊,在资源选项卡里面新建一个dialog后拖进去一个button按钮,想要添加这个空间的时间相应却怎么也不成功.会出现 提示框 “无法执行添加/移除操作,因为代码元素**是只读的”.根据提示去查看对应的.cpp和.h文件,发现并没有只读属性,没办法,求助于网络,发现这个问题还是挺普遍的,参考这篇文章后,保存现有工程后,在目录里面删掉.ncb文件后重新打开解决方案,问题解决. 另外还碰到一个情况,就是在属性栏点击“控件事件”后列表为空,不应该啊,比对