&& 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 *_______________________________________________________________________________ *=============================================================================== *=============================================================================== *===============================================================================