正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- /**********************************************************************************
- /* 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;
复制代码
|