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: bsnodgrass@geographix.com
/* 
/* 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;

时间: 2024-11-01 21:56:44

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

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

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

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

在vs中,大量添加窗体或者控件后,发现无法由系统IDE自动生成代码,如自动添加按钮响应函数等,rc管理器界面双击按钮添加函数,会出现 提示框 "无法执行添加/移除操作,因为代码元素**是只读的".开始认为可能是对应的.cpp和.h被加了只读属性,后来发现是工程的ncb文件引起的. 解决方案:关闭vs,删除工程对应的.ncb文件,重启vs就好了. 问题原因:NCB是no compile brower的缩写,文件中存放了供ClassView.WizardBar和Component Gall

JavaScript对IE操作的经典代码

 本篇文章主要是对JavaScript对IE操作的经典代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 这段时间一直在用ajax技术做东东,所以也就有更多机会对JavaScript知识进行学习.之前在网上搜集了一些关于JavaScript对IE操作的代码(具体在哪里cope的记不清了,所以出处就不加了),感觉在开发过程中很有用,当然只适用于IE,FF会有问题的.现在贴出来分享.  代码如下: 1.将彻底屏蔽鼠标右键 oncontextmenu="window.event.return

JavaScript禁止页面操作的示例代码

 本篇文章是对JavaScript禁止页面操作的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 单的JS禁止页面右键菜单--避免网站信息被盗用  代码如下: <script type="text/javascript">   function block(oEvent){    if(window.event)     oEvent=window.event;    if(oEvent.button==2)     alert("鼠标右键不可用&

vb-Vb中如何编码撤销功能,也就是返回上一步的操作!求代码

问题描述 Vb中如何编码撤销功能,也就是返回上一步的操作!求代码 5C Vb中如何编码撤销功能,也就是返回上一步的操作!求代码!求解答! 解决方案 直接往你的文本框发送 wm_undo 消息Declare Function SendMessage Lib ""user32"" Alias ""SendMessageA"" (ByVal hwnd As Long _ByVal wMsg As Long ByVal wParam

java如何获取本地操作系统进程列表_java

  package com.wa.xwolf.sblog.util; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.Charset; public class ProcessUtil { public static void main(String[] args) throws Exceptio

qt5-QT无法执行从别的电脑拷来的代码,版本相同,内附错误信息

问题描述 QT无法执行从别的电脑拷来的代码,版本相同,内附错误信息 Could not create directory ""C:UsersAdministratorDocumentsQtbuild-starplayer-Desktop_Qt_5_4_2_MinGW_32bit-Debug""Error while building/deploying project starplayer (kit: Desktop Qt 5.4.2 MinGW 32bit) Wh

Linux下入队列和出队列操作的C代码示例

概述 最近有在校的学生朋友在问我,数据结构中的队列在实际的软件开发项目中有什么样的用处. 大家都知道,队列的特点是先入先出,即数据是按照入队列的顺序出队列的.在实际的软件开发项目中,当一个中间模块需要接收和发送大量的消息时,队列就可以大展身手了.我们可以将接收到的数据存储在一个全局队列中,然后在另外的程序流程中将数据从同一个全局队列中取出来,经过一定的处理之后将消息发送到另外的模块.这样做可以降低程序的性能瓶颈. 本文用实际的C代码示例了简单的数据入队列和出队列的方法,大家可据此了解队列的实际用

opengl-文件操作,我将文件操作部分的代码放在,myDisplay函数内部就没有问题了。。这是为什么

问题描述 文件操作,我将文件操作部分的代码放在,myDisplay函数内部就没有问题了..这是为什么 F:WORKopengl test tempdashBoard.cpp(8) : error C2501: 'fp' : missing storage-class or type specifiers F:WORKopengl test tempdashBoard.cpp(8) : error C2040: 'fp' : 'int' differs in levels of indirecti