原文: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版本适用