Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Stopping a process
Message
De
19/11/2010 03:20:00
 
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Versions des environnements
Visual FoxPro:
VFP 8 SP1
Divers
Thread ID:
01029879
Message ID:
01489722
Vues:
113
>
>How do you get process ID of all VFP processes?

The recipe

- You start by going to microsoft's website and searching for 'enum process'
- You find this : http://msdn.microsoft.com/en-us/library/ms682629(VS.85).aspx
- You then wade through all the bits and pieces and come up with this


Display all processes that can be opened - see ProcessSample()
You can filter on the path of the processes
&& ProcessBits
&& Gregory Adam 2010
*_______________________________________________________________________________
#define true	.T.
#define false	.F.
*_______________________________________________________________________________
#include	"FoxPro.h"
&& #include	"ProcessBits.h"
*_______________________________________________________________________________
*_______________________________________________________________________________

*_______________________________________________________________________________
function ProcessSample()

	local success
	success = true
	
	local processBitsObj, processQueueObj, processObj
	
	do case
	case !m.success
	
	case !ProcessBits_Object(@m.processBitsObj)
		assert false
		success = false
	
	case !m.processBitsObj.GetProcessQueue(@m.processQueueObj)
		assert false
		success = false
	
	otherwise
		do while m.success and m.processQueueObj.Dequeue(@m.processObj)
		
			with m.processObj
				
				? .Id, .Path
			endwith
		enddo
	
	
	endcase
	
	return m.success
endfunc

*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================


*===============================================================================
*===============================================================================
*===============================================================================
#define	LIGHTWEIGHT_CLASS			[_LightWeightClass_]

*===============================================================================
*===============================================================================
*===============================================================================
define class LIGHTWEIGHT_CLASS as Relation

	hidden ChildAlias, ChildOrder, ClassLibrary, ;
						Comment, OneToMany, ;
						Parent, ParentAlias, RelationalExpr, Tag
	
	DataSessionId	= 0
*_______________________________________________________________________________
protected function init()
	
	local success
	success = true
	
	do case
	case !m.success
	
	case !DoDefault()
		assert false
		success = false
	
	case !AddProperty(m.this, 'DataSessionId', set('dataSession'))
		assert false
		success = false
		
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
protected function Destroy()
	
	return DoDefault() 
	
endfunc
*_______________________________________________________________________________
enddefine
*===============================================================================
*===============================================================================
*===============================================================================

*===============================================================================
*===============================================================================
*===============================================================================
#define PROCESSBITS_CLASS	[_ProcessBits_Class_]

*_______________________________________________________________________________
function ProcessBits_Object(obj)
	
	local success
	success = true
	
	obj = null
	
	try
		obj = createObject(PROCESSBITS_CLASS)
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________


*===============================================================================
*===============================================================================
*===============================================================================
define class PROCESSBITS_CLASS as LIGHTWEIGHT_CLASS 

	WindowErrorObj = null
	
*_______________________________________________________________________________
protected function init()
	
	local success
	success = true
	
	local obj
	
	do case
	case !m.success
	
	case !DoDefault()
		assert false
		success = false
	
	case !WindowsError_Object(@m.obj)
		assert false
		success = false
	
	case !m.this.AddProperty('WindowErrorObj', m.obj)
		assert false
		success = false
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
protected function Destroy()
	
	store null to ;
		this.WindowErrorObj 
		
	return DoDefault() 
	
endfunc
*_______________________________________________________________________________
#if false
	queue of processes that can be opened
	
	objects
		-	Id		process id
		-	Path	path
#endif
#if false
	http://msdn.microsoft.com/en-us/library/ms682629(VS.85).aspx
	
#endif

#define MAX_PROCESSES	8192

function GetProcessQueue(queueObj)

	local success
	success = true
	
	local s, nbytesIn, nBytesOut
	
	nbytesIn = 4 * MAX_PROCESSES
	s = space(m.nbytesIn)
	nBytesOut = 0
	
	
	do case
	case !m.success
	
	case empty(EnumProcesses(@m.s, m.nbytesIn, @m.nBytesOut))
		assert false
		success = false
		
	case !Queue_Object(@m.queueObj)
		assert false
		success = false
	
	otherwise
		local processObj
		
		for i = 1 to m.nBytesOut step 4
			
			
			do case
			case !m.success
				exit
		
			case !m.this.GetProcess( ;
						@m.processObj, ;
						 ctobin(substr(m.s, m.i, 4), '4rs') ;
					)
				assert false
				success = false
			
			case isnull(m.processObj)
				&& process that could not be opened
				
			case !m.queueObj.Enqueue(m.processObj)
				assert false
				success = false
			
			endcase
		
		endfor
	
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
#define PROCESS_ALL_ACCESS bitor(0x000F0000, 0x00100000,0x0FFF)
#define PROCESS_QUERY_INFORMATION (0x0400)

protected function GetProcess(processObj, pid)

	local success
	success = true
	
	local pHandle, disposableHandleObj
	
	do case
	case !m.success
	

	otherwise
		pHandle = OpenProcess( PROCESS_QUERY_INFORMATION, 0, m.pid)
	
	endcase
	
	do case
	case !m.success
		
	case empty(m.pHandle)
		processObj = null
	
	case !Disposable_CloseHandle_Object(@m.disposableHandleObj, m.pHandle )
		assert false
		success = false
	
	case !Empty_Object(@m.processObj)
		assert false
		success = false
	
	case !AddProperty(m.processObj, 'Id', m.pid)
		assert false
		success = false
		
	case !m.this.GetProcess_AddInfo_Path(m.pHandle, m.processObj)
		assert false
		success = false
		
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
protected function GetProcess_AddInfo_Path(pHandle, processObj)

	local success
	success = true
	
	local s, nBytes, lastError
	s = space(1024)
	nBytes = len(m.s)
	
	do case
	case !m.success
	
	case empty(	;
			QueryFullProcessImageName( ;
						m.pHandle, ;
						0, ;
						@m.s, ;
						@m.nBytes ;
					)  ;
				)
		
		lastError = GetLastError()
		
		
		do case
		case !m.this.WindowErrorObj.Format(@m.s, m.lastError)
			assert false
		
		endcase
		
		asser false
	case !AddProperty(m.processObj, 'Path', left(m.s, m.nBytes))
		assert false
		success = false
	
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
enddefine
*===============================================================================
*===============================================================================
*===============================================================================

*===============================================================================
*===============================================================================
*===============================================================================
#define DISPOSABLE_BASE_CLASS	[_Disposable_Base_Class_]

#define DISPOSABLE_INTEGER_CLASS	[_Disposable_Integer_Class_]

*_______________________________________________________________________________
define class DISPOSABLE_BASE_CLASS as LIGHTWEIGHT_CLASS 
	
	DisposeFunction	= ''
	
	ArgsPattern	= '(%1)'
	
	ItemToDispose	= null

*_______________________________________________________________________________
protected function init(disposeFunction, itemToDispose)
	
	local success
	success = true
	
	do case
	case !m.success
	
	case !DoDefault()
		assert false
		success = false
	
	case !IsChar(m.this.ArgsPattern, true)
		assert false
		success = false
		
	case !IsChar(m.disposeFunction, true)
		assert false
		success = false
	
	case !m.this.AddProperty('DisposeFunction', m.disposeFunction + m.this.ArgsPattern)
		assert false
		success = false
	
	case pcount() < 2
		assert false
		success = false
	
	otherwise
		this.ItemToDispose = m.itemToDispose
		
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
protected function Destroy()
	
	=m.this.Dispose()
	
	return DoDefault() 
	
endfunc
*_______________________________________________________________________________
function Dispose()
	
	
	local success
	success = true
	
	do case
	case !m.success
	
	case isnull(m.this.ItemToDispose)
	
	otherwise
		try
			&&acti screen
			&&?strtran(m.this.DisposeFunction, '%1', transf(m.this.ItemToDispose))
			
			success = !empty(eval(strtran(m.this.DisposeFunction, '%1', transf(m.this.ItemToDispose))))
			assert m.success
			
		catch
			assert false
			success = false
		
		endtry
		
		this.ItemToDispose = null
		
	endcase
	
	return m.success

endfunc
*_______________________________________________________________________________
enddefine
*===============================================================================
*===============================================================================
*===============================================================================
*_______________________________________________________________________________
function Disposable_Integer_Object(obj, disposeFunction, itemToDispose )
	
	local success
	success = true
	
	obj = null
	
	try
		obj = createObject( ;
					DISPOSABLE_INTEGER_CLASS, ;
					disposeFunction, ;
					itemToDispose ;
				)
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================
define class DISPOSABLE_INTEGER_CLASS as DISPOSABLE_BASE_CLASS 
	
	

*_______________________________________________________________________________
protected function init(disposeFunction, itemToDispose)
	
	local success
	success = true
	
	do case
	case !m.success
	
	case !IsInteger(m.itemToDispose)
		assert false
		success = false
		
	case !DoDefault(m.disposeFunction, m.itemToDispose)
		assert false
		success = false

	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
*_______________________________________________________________________________
enddefine
*===============================================================================
*===============================================================================
*===============================================================================

function Disposable_CloseHandle_Object(obj, handle)

	return	Disposable_Integer_Object( ;
				@m.obj, ;
				'CloseHandle', ;
				m.handle ;
			)
endfunc
*_______________________________________________________________________________

*===============================================================================
*===============================================================================
*===============================================================================
#define WINDOWS_ERROR_CLASS	[_Windows_Error_Class]


function WindowsError_Object(obj)
	
	local success
	success = true
	
	obj = null
	
	try
		obj = createObject( ;
					WINDOWS_ERROR_CLASS ;
				)
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________
*_______________________________________________________________________________
define class WINDOWS_ERROR_CLASS as LIGHTWEIGHT_CLASS 

*_______________________________________________________________________________
protected function init()
	
	local success
	success = true
	
	do case
	case !m.success

	case !DoDefault()
		assert false
		success = false
	
	otherwise
		declare Integer FormatMessage in win32api ;
					Integer	dwFlags, ;
					string @lpSource, ;
					Integer	dwMessageId, ;
					Integer	dwLanguageId, ;
					string @lpBuffer, ;
					Integer nSize, ;
					Integer 
	

	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
function Format(s, lastError)

	
	
	local n, buf
	buf = space(1024)
	
	#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100
	#define FORMAT_MESSAGE_IGNORE_INSERTS  0x00000200
	#define FORMAT_MESSAGE_FROM_STRING     0x00000400
	#define FORMAT_MESSAGE_FROM_HMODULE    0x00000800
	#define FORMAT_MESSAGE_FROM_SYSTEM     0x00001000
	#define FORMAT_MESSAGE_ARGUMENT_ARRAY  0x00002000
	#define FORMAT_MESSAGE_MAX_WIDTH_MASK  0x000000FF

	n = FormatMessage(	FORMAT_MESSAGE_FROM_SYSTEM, ;
						0, ;
						m.lastError, ;
						0, ;
						@m.buf, ;
						len(m.buf), ;
						0 ;
					  )
	
	
	s  = 'Error ' + transf(m.lastError)
	
	do case
	case !empty(m.n)
		s  = m.s + ' : ' + left(m.buf, m.n)
	endcase
	


	#undefine FORMAT_MESSAGE_ALLOCATE_BUFFER
	#undefine FORMAT_MESSAGE_IGNORE_INSERTS
	#undefine FORMAT_MESSAGE_FROM_STRING
	#undefine FORMAT_MESSAGE_FROM_HMODULE
	#undefine FORMAT_MESSAGE_FROM_SYSTEM
	#undefine FORMAT_MESSAGE_ARGUMENT_ARRAY
	#undefine FORMAT_MESSAGE_MAX_WIDTH_MASK

endfunc
*_______________________________________________________________________________
enddefine

*===============================================================================
*===============================================================================
*===============================================================================

*===============================================================================
*===============================================================================
*===============================================================================
#define COLLECTION_CLASS		[_CollectionClass_]

function Collection_Object(obj)
	
	local success
	success = true
	
	obj = null
	
	try
		obj = createObject(COLLECTION_CLASS)
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________

#if false
	- properties
		- HasKeys		returns TRUE if the items have a key
		
	- methods
		- Clear()	&& clears the collection
		- Empty()	&& return TRUE if the collection is empty
		
		- Add(item [, key])	
			&& overrides base class
			&&	returns TRUE if Successful add
			&&	returns FALSE if any error
		
		- TryGetValue(@value, itemOrKey)
		
		- ContainsKey(key)
		
		
#endif

define class COLLECTION_CLASS as Collection

	DataSessionId		= 0

	HasKeys				= false && access method
*_______________________________________________________________________________
protected function init()
	
	local success
	success = true
	
	do case
	case !m.success
	
	case !DoDefault()
		assert false
		success = false
	
	case !AddProperty(m.this, 'DataSessionId', set('dataSession'))
		assert false
		success = false
		
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
protected function Destroy()
	
	=m.this.Clear()
	return DoDefault() 

	
endfunc
*_______________________________________________________________________________
function HasKeys_Access()

	return !( empty(m.this.Count) or empty(m.this.getKey(1)) )
endfunc

*_______________________________________________________________________________
function Clear()

	 =m.this.Remove(-1)
endfunc
*_______________________________________________________________________________
function Empty()

    return empty(m.this.Count)

endfunc
*_______________________________________________________________________________
function add(sValue, sKey)
	
	NODEFAULT
	
	local success
	success = true
	
	do case
	case pcount() = 1
		
		try
			if( !DoDefault(m.sValue) )
				assert false
				success = false
				
			endif
		catch
		
			assert false
			success = false
		
		endtry
		
	otherwise
		try
			if( !DoDefault(m.sValue, m.sKey) )
				assert false
				success = false
			endif
			
		catch
			assert false
			success = false
		
		endtry
			
	endcase
	
	return m.success 
	
endfunc
*_______________________________________________________________________________
function ContainsKey(key)

	local success
	success = true
	
	do case
	case !m.success
	
	case !IsChar(m.Key)
		assert false
		success = false
	
	otherwise
		success = !empty(m.this.GetKey(m.key))

	endcase
	
	return m.success
	
endfunc
*_______________________________________________________________________________
function TryGetValue(sValue, itemOrKey)

	local success
	success = true
	
	
	try
		sValue = m.this.Item(m.itemOrKey)
	
	catch
	
		success = false
	
	endtry
	
	return m.success
	
endfunc
*_______________________________________________________________________________
enddefine

*===============================================================================
*===============================================================================
*===============================================================================
#define STACK_CLASS		[_Stack_Class_]
*_______________________________________________________________________________
function Stack_Object(obj)
	

	local success
	success = true
	
	obj = null
	
	try
		obj = createObject( ;
					STACK_CLASS ;
				)
	
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================
define class STACK_CLASS as COLLECTION_CLASS

*_______________________________________________________________________________
function Push(v)
    =m.this.Add(m.v)
endfunc
*_______________________________________________________________________________
function Pop(v)

    if( empty(m.this.Count) )
        return false
    endif
    v = m.this.Item(m.this.Count)
    =m.this.Remove(m.this.Count)

endfunc
*_______________________________________________________________________________
function Peek(v)

    if( empty(m.this.Count) )
        return false
    endif
    v = m.this.Item(m.this.Count)

endfunc
*_______________________________________________________________________________

enddefine
*===============================================================================
*===============================================================================
*===============================================================================

#define QUEUE_CLASS		[_Queue_Class_]

function Queue_Object(obj)
	
	local success
	success = true
	
	obj = null
	
	try
		obj = createObject( ;
					QUEUE_CLASS ;
				)
	
	
	catch
		assert false
		success = false
	
	endtry
	
	return m.success

endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================
define class QUEUE_CLASS as COLLECTION_CLASS

*_______________________________________________________________________________
function EnQueue(v)

    =m.this.Add(m.v)
    
endfunc
*_______________________________________________________________________________
function DeQueue(v)

    if( empty(m.this.Count) )
        return false
    endif
    v = m.this.Item(1)
    =m.this.Remove(1)

endfunc
*_______________________________________________________________________________
function Peek(v)

    if( empty(m.this.Count) )
        return false
    endif
    v = m.this.Item(1)

endfunc
*_______________________________________________________________________________
enddefine
*===============================================================================
*===============================================================================
*===============================================================================

&& common functions
*_______________________________________________________________________________
function Empty_Object(obj)
	obj = createObject('Empty')

endfunc
*_______________________________________________________________________________
function IsChar(s, needFilled)
	
	return	inlist(vartype(m.s), T_CHARACTER, T_MEMO) ;
		and	( !m.needFilled or !empty(nvl(m.s, '')) )
		
endfunc
*_______________________________________________________________________________
function IsLogical(s)
	
	return inlist(vartype(m.s), T_LOGICAL)

endfunc
*_______________________________________________________________________________
function IsInteger(x)
	
	return inlist(vartype(m.x), T_NUMERIC) and empty(mod(m.x, 1))
endfunc
*_______________________________________________________________________________
function IsPositiveInteger(x)
	return inlist(vartype(m.x), T_NUMERIC) and empty(mod(m.x, 1)) and (m.x >= 1)
endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================

&& api calls
#define BOOL		integer
#define DWORD		long
#define T_HANDLE	long
#define	PDWORD		DWORD @
#define	LPTSTR		string @
*_______________________________________________________________________________
function EnumProcesses(pProcessIds, cb, pBytesReturned)


	local success
	success = true
	
	local declared
	declared = false
	
	local returnValue 

	local exceptionObj
	local dllArray[2], dllName 
	dllArray[1] = [Kernel32.dll]
	dllArray[2] = [Psapi.dll]
	
	&& assert false
	
	for each dllName in dllArray
	
		try
			declare BOOL	EnumProcesses in (m.dllName) ;
	 			string @pProcessIds, ;
	 			DWORD cb, ;
				DWORD @pBytesReturned

			returnValue  = EnumProcesses(@m.pProcessIds, m.cb, @m.pBytesReturned)
			
			declared = true
			
		catch to exceptionObj when m.exceptionObj.ErrorNo == 1754
			
		
		catch
			assert false
	
			
		endtry
		
		do case
		case m.declared
			exit
		endcase
		
	endfor
	
	do case
	case !m.declared
		asser false
	
	endcase
	
	
	return m.returnValue

endfunc
*_______________________________________________________________________________
function OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)

	local returnValue 

	
	try
		declare T_HANDLE	OpenProcess in Kernel32.dll ;
 			DWORD dwDesiredAccess, ;
 			BOOL bInheritHandle, ;
			DWORD dwProcessId


		returnValue  = OpenProcess( ;
						m.dwDesiredAccess, ;
						m.bInheritHandle, ;
						m.dwProcessId ;
					)
		
	catch
		assert false
		ReturnValue = 0
	
	endtry
	
	return m.ReturnValue

endfunc
*_______________________________________________________________________________
function CloseHandle(handle)

	local returnValue 

	
	try
		declare BOOL	CloseHandle in Kernel32.dll ;
 			T_HANDLE handle

		returnValue  = CloseHandle(m.handle)
		
	catch
		assert false
		ReturnValue = 0
	
	endtry
	
	return m.ReturnValue

endfunc
*_______________________________________________________________________________
function QueryFullProcessImageName
	lparameters	hProcess, ;
				dwFlags, ;
				lpExeName, ;
				lpdwSize
				
	local success
	success = true
	
	local declared
	declared = false
	
	local returnValue 

	local exceptionObj
	local dllArray[2], dllName 
	dllArray[1] = [Kernel32.dll]
	dllArray[2] = [Psapi.dll]
	
	&& assert false
	
	for each dllName in dllArray
	
		try
			declare BOOL	QueryFullProcessImageName in Kernel32.dll ;
 			T_HANDLE hProcess, ;
 			DWORD dwFlags, ;
 			LPTSTR lpExeName, ;
 			PDWORD lpdwSize


		returnValue  = QueryFullProcessImageName( ;
							m.hProcess, ;
							m.dwFlags, ;
							@m.lpExeName, ;
							@m.lpdwSize ;
							)
			
			declared = true
			
		catch to exceptionObj when m.exceptionObj.ErrorNo == 1754
			
		
		catch
			assert false
	
			
		endtry
		
		do case
		case m.declared
			exit
		endcase
		
	endfor
	
	do case
	case !m.declared
		asser false
	
	endcase
	
	
	return m.returnValue

endfunc
*_______________________________________________________________________________
function GetLastError()
	
	local returnValue 
	
	try 
		declare integer GetLastError IN Win32API
		returnValue = GetLastError()
		
	catch
		assert false
		returnValue = -1
	
	endtry
	
	return m.returnValue

endfunc
*_______________________________________________________________________________
*===============================================================================
*===============================================================================
*===============================================================================
Gregory
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform