|  | 
				     Download latest version
				here 
				  Version 1.31 - 
					28 November 2011 Requires 
				StringTheory 1.52 or later 
                        Added: New classes and 
						example application for named pipe handling. Simplifies 
						the creation of named pipes and transfer between a 
						server and a client for both Clarion applications and 
						application written in other languages which use pipes. PipeCore class: Provides the core 
						reading and writing to and from pipes. Typically not 
						used directly - the PipeServer and PipeClient inherit 
						from this class.
							Properties:
							Methods:
								Read Procedure (long hPipe, 
								*string binData, long binLen, *long bytesRead), 
								long, proc, virtualWrite Procedure (long hPipe, 
								*string binData, long binLen, *long bytesWritten), 
								long, proc, virtualPeekPipe Procedure (long 
								hPipe, *string binData, long binLen, *long 
								bytesRead, <*long bytesAvailable>, <*long 
								bytesMessage>), long, virtual
PipeServer Class: A Multi-threaded 
						pipe server class. Allows the handling of any number of 
						pipe clients (for each client an OS thread is created 
						and destroyed when no longer needed).
						
							Properties:
								_running bool ! Set while the server is 
								active._threadID ulong ! ID of the listen thread_hpipe long  ! Handle to the current 
								pipeMethods:
								Run Procedure (), virtual ! 
								Start the listening thread to wait for new 
								client connectionsStop Procedure (), virtual
								CreatePipe Procedure 
								(<string pipeName>), long, proc, virtualConnectPipe Procedure (long 
								hPipe), long, virtualDisconnectPipe Procedure 
								(long hPipe), long, virtualTakeRequest Procedure 
								(*string request, long requestBytes, *string 
								reply, *long replyBytes), virtual
 PipeClient class:
							Properties
								hPipe long  ! Handle to the current 
								pipeMethods:
								OpenPipe Procedure (<string 
								pipeName>, long timeOut = 0), long, virtualClosePipe Procedure (), 
								virtualWrite Procedure (*string 
								writeData, *long dataLen), long, proc, virtualRead Procedure (*string 
								readData, *long dataLen), long, proc, virtualSetPipeState Procedure 
								(long dwMode = jo:PIPE_READMODE_MESSAGE), long, 
								proc, virtualWaitForPipe Procedure (long 
								timeOut), long, virtual
Added: a Pipes 
						example which has a pipe server and pipe client app 
						demonstrating the usage of the new Pipe classes.   Version 1.30 - 
					09 September 2011 
                        Changed: Moved all equates and types to the OddJobEq.inc fileAdded: JobObject.BindToCPU - Binds 
						the process to a single CPU (can be called at any point 
						after process creation and applies to all threads and 
						child processes)Added: ProcessAffinity example. Demonstrates the new 
						process affinity methods such as BindToCPU,
						SetProcessAffinity, 
						GetProcessAffinity etc.Added: JobObject.GetSystemInformation() 
						method to retrieve system informationAdded: joSYSTEM_INFO type for retrieving system 
						informationAdded: JobObject.CountProcessors() 
						method to return the number of processors for the 
						current systemAdded: JobObject.SetProcessAffinity() 
						method to allow the process to be limited to a specific 
						subset of the processors available on the systemAdded: JobObject.GetProcessAffinity() 
						method to allow the current processor mask to be 
						retrieved along with the system mask (which show which 
						processors are available and can be used in setting the 
						process affinity mask).  Version 1.29 - 29 June 2011
                        New: Added the following 
						methods:
							HandleFromPID Procedure(ulong 
							PID), unsigned, virtualReturns the Process Handle when passed the Process 
							ID (PID)
GetProcessPath Procedure(*joProcessQType 
							processQ), string, virtualReturns the full path for the EXE identified by the 
							current Process record in the passed queue. Note 
							that the path returned uses the Windows NT Device 
							name format, not the DOS style drive paths. Use the
							GetDrives method to map between 
							device names and paths.
DeviceNameForDrive 
							Procedure(string sDrive), string, virtualReturns the full device name when passed the drive 
							identifier (for example 'C:'  or 'D:')
GetDrives Procedure(*joDrivesQType 
							drivesQ), bool, proc, virtualPopulates a queue with a list of all drives and 
							their full NT Device Names.
New: Extended the 
						example application to demonstrate the new methods - 
						populate a list of all drives and their NT device names; 
						get the full path of a process based on the process ID 
						of the selected item in the processes list etc.  Version 1.28 - 9 April 2011
                        New: Added a 
						KillProcess method. This kills one or more 
						instances of a process when passed the process name (or 
						optionally a substring of the name).New: KillProcess 
						example application. Demonstrates creating a small 
						command line application using a hand coded project. 
						This application kills all matching processes when 
						passed a process name and can also optionally kill just 
						the first instance found, or all processes where the 
						name matches a substring passed.
  Version 1.27 - 
					13 December 2010
                        New: Replaced the RunAsUser 
						method. This method can be used from a service to run an 
						application as the currently logged in user and bypasses 
						UAC on system that have it enabled.Example:
 Job.RunAsUser('C:\Windows\Notepad.exe', 
						'')
 
Note: RunAsUser requires the 
						ability to duplicate the token used by the WinLogon 
						process associated with the current user. This is 
						generally only available to services running in the 
						LocalSystem account.Fix: The GetUserToken, 
						GetSessions and related methods have been 
						modified to allow zero session IDs (which are valid).Improvement: The Init 
						method can be called multiple times without causing any 
						undesirable behaviour.Improvement: The object is 
						initialised on creation, and the calling Init explicitly 
						is only required to create an actual Job (all non Job 
						functionality can be used without calling Init 
						manually).Improvement: Kill 
						is called on destruction to clean up, and no longer 
						needs to be called manually.Improvement: Calling Kill 
						multiple times no longer results in undesirable 
						behaviour.Improvement: Calling 
						LoadLibs multiple times now only loads 
						libraries that have no already been loaded and will not 
						cause any undesirable behaviour.Fix: The Userenv.dll library was 
						not being loaded correctly and the handle ended up 
						pointing at the wrong library.Fix: The 
						CreateEnvironmentBlock and 
						DestroyEnvironmentBlock functions causing a GPF 
						as a result of an incorrect library handle.New: The ErrorTrap 
						method now allows the method name to be passed as an 
						optional parameterNew: LogonUser 
						method returns a token for the specific user using the 
						passed user name and password to authenticate.New: CloseHandle 
						method. Closes the passed handle if it is valid.New: DuplicateToken 
						method duplicates the passed token, and can convert 
						handles to impersonation tokens into a primary token 
						handles.New: RunAsUser 
						example  Version 1.26 - 
					16 September 2010
                        Fix: joOpenProcess() was calling the wrong API as 
						the result of a typographical error.  Version 1.26 - 
					16 September 2010
                        Updated the installer to ensure 
						that the RED file is correctly updated to include .c and 
						.h files for the MD5 functionality.StringTheory is now provided as 
						seperate install, so please ensure that you download the 
						current StringTheory install when updating OddJob.Fixed a potential GPF in the 
						CreateProcess method where a pointer was assigned 
						without the &= operator.Template fix for Clarion 7 (was no sheet and tab on 
						extension).Template tweak - assert for installing StringTheory.Template 01.tpw - includes version 1.66 of the 
						01.tpw  Version 1.25 - 15 June 2010
                        StringTheory Class
							Fixed Between() method including the left hand 
							delimiter in the returned string.Additional handling of boundary cases in the 
							Replace() method.  Version 1.24 - 01 June 2010
                        StringTheory Class
							Fixed a bug in the Replace method, when the 
							string being replaced is the end of the text being 
							searched.  Version 1.23 - 01 June 2010
                        StringTheory Class
							Added bounds checking and corrected unhandled 
							boundary cases for the following methods:
								Replace (handles 
								replacement from the start and end of the 
								string, where the resultant string is empty, 
								where the resultant string is a single character 
								etc.)PathOnly (handles the case 
								where the path contains only a forward or back 
								slash)Split (handles if a "line" 
								is blank)ToBlob (handles the string 
								being assigned to the blob being empty, or being 
								a single character)Verified that Between and Before are both safe. 
				  
				Version 1.22 - 
				26 May 2010
					Added optional clip parameter to 
					StringTheory Append method.Updated docs for the StringTheory 
					SetValue method   Version 1.21 - 17 May 2010
                        Added handling to SetValue for 
						passing zero length strings (the StringTheory value is 
						disposed of and the Length methods will return zero).Added GetSessions method that fills 
						a queue with all sessions.Added FindActiveSession method.Added an optional accessToken
						process to the RunAsUser method 
						to allow the method to run a process as any user, not 
						just the current one.Added an optional dontStore
						parameter to the RunAsUser 
						method, which allows the process information to not be 
						stored. This is set to True (1) by default to maintain 
						the same behaviour as previous version that did not 
						support this functionality.RunAsUser now creates the 
						processes, associates it with the current job (if the
						breakAwayFromJob parameter 
						is not set to True, and the 
						.dontAssociateProcesses property is not set to 
						True), and stores the created process information in to 
						.processes queue (if the dontStore parameter is not set 
						to False (0)).Added a GetToken method to retrieve 
						the Access Token associated with the passed session.Added a RunAsUser example that demonstrates running 
						processes with a variety of credentials.Added APIs for token manipulation (runtime loaded):
							joAccessCheck(), joAdjustTokenGroups(), 
							joAdjustTokenPrivileges(), joGetTokenInformation(), 
							joSetThreadToken(), joSetTokenInformation()  Version 1.20 - 17 May 2010
                        Fixed a potential memory leak when Calling 
						CreateProcess and reading data from a process.
						
						Reduced memory usage when calling a processes that the 
						StdOut will be read from.
						
						Fixed the length of the string created when using Base64 
						encoding to ensure that the encoded string is always 
						padded onto a 4 byte boundary.
						
						Added the base64NoWrap 
						property, which when set will not add line wrapping to 
						the Base64 encoded string.
						
						Fixed errors in the Base64 encoding.
						
						Improved efficiency when assigning new values to the 
						string that have the same length as the string stored
						
						Add a new csBlowfish class to provide support for the 
						Blowfish cipher.
						
						Added Blowfish encryption and decryption support to 
						StringTheory, via the following methods:
						  
							InitBlowfish
							KillBlowfishEncryptDecryptEncryptStringDecryptStringSetKeyNote: Future releases will support CBC (Cipher 
						Block Chaining) to allow data of arbitrary length to be 
						encrypted. The current version requires that that the 
						data encrypted has a length that is a multiple of 8 (in 
						bytes). Documented base properties and methods available to 
						all classes, including:
						
						
						 Base 
						Methods 
					
						| Debug | Conditionally output to the 
						Windows debug output depending on whether the .debug 
						property is set to true or not. |  
						| DebugOutput | Unconditionally output a string 
						to the Windows debug output. |  
						| ErrorTrap | Callback method used to trap errors. |  
						| FormatMessage | Converts an API error code into the associated error 
						message. |  
						| ToCstring | Creates a new cstring from the passed string. |  
						| FreeCstring | Safely frees a cstring reference variable. |  
						| Ulong64ToReal | Converts an unsigned 64 bit integer to a Real |  
						| GetReg | Returns the value of the specified registry key. |  
						| PutReg | Sets the value of the specified registry key. |  
				 Base 
				Properties 
					
						| displayErrors | Sets whether or not the class displays errors using 
						the Message function. |  
						| logErrors | Sets whether or not errors are sent to the Windows 
						Debug Output |  
						| errorCode | The last error code |  
						| errorMessage | The last error message |  
						| debug | Determines whether or not debug output is produced |  
						| debugPrefix | The prefix used for debug output | New GetRegand
						PutReg 
						methods (see above).Documented new methods and properties.New main example app demonstrates a far wider 
						variety of ways in which to start and interact with 
						processes.  Version 1.10 - 06 April 2010
                      New StringTheory methods:
						Before - returns the portion of the 
						string that occurs before the specified string 
						seperator.After - returns the portion of the 
						string that occurs after the specified string seperator.Between  - returns the portion 
						of the string that occurs between the two specified 
						string seperators.Base64Encode/Base64Decode
						- Base64 encode and decode either a passed 
						string, or the value stored by the StringTheory object.MD5 - Create an MD5 hash of the 
						string.New string delimiter processing methods:
							Split - splits the string into 
							sub strings, which are stored in the .lines 
							property. Optionally allows the "line" start and end 
							delimeters to be specified.Join - joins the all the lines 
							(after the string has been slit using Split, and 
							optionally wraps each line in the specified 
							delimiters).Slice - returns a string containing 
						the data between the specified start and end characters 
						(a "slice"). 
							Crop - Crops the stored value 
							using the pass start and end parameters.Sub - returns a sub-string of 
							the specified length, starting at the specified 
							character.Fixed the ClipLen method infinitely loop as it was 
						calling itself rather than calling ClipLength().Fixed the Base64Encode method adding extra spaces in 
						the encoded string.Added: FromBlob method, stores the 
						contents of the passed BLOB in the StringTheory object.Added ToBlob method, saves the 
						contents of the string into the passed BLOB.  Version 1.03 - 20 October 2009
                      Added: Additional optional parameter to the 
						CreateProcess methods to allow the initial window mode 
						to be specified. This allows the process to be started 
						as shown, hidden, minimised, maximised etc. without 
						having to call the more advanced CreateProcess method 
						that supported this.  Version 1.02 - 20 October 2009
                      Fixed: CreateProcess causing a GPF when used to start 
						a process that was hidden and did not require any IO (no 
						StringTheory object was passed).Added: Additional logging to CreateProcess for 
						simpler debugging.Fixed: CreateProcess could potentially call the 
						AddProcess method twice, resulting in it failing the 
						second time. This would not affect the application's 
						behaviour, but would display an eroneous error in the 
						debug log if logging was enabled and being captured. 
				  Version 1.01 - 12 October 2009
                      StringTheory Class
						Fixed: the PathOnly method, which 
						was returning a blank string.Optimised: the Replace method in the 
						case where both strings are a single characterFixed: Replace to allow an empty 
						replacement string to be specified (which removes the 
						searched for string)Fixed: FileNameFromPath method.Renamed: the ProcessQType to joProcessQType to ensure 
						that it does not conflict with other tools using the 
						same type.Added: GetProcessMemoryInfo method 
						to get the memory usage information for any process on 
						the system.Fixed: Missing Editor folder in the Demo example, 
						causing the HTML editor to not function correctly. Version 1.00 - 11 August 2009 |  |