//TH-Header //***************************************************************************************** // Copyright (c) 2001 Michael Kurz // All rights reserved. // If you want to use this source in your applications conatct: // // $FileName : cRunProgramNotify.pkg // $ProjectName : Shared Classes // $Author : Michael Kurz // $Created : 29.05.2001 11:52 // // Contents: // Starting a Program, and getting a CallBack message when a process is finished. //***************************************************************************************** //TH-RevisionStart // 31.05.2001 10:47 RunProgramDirect added. Mk SERVER //TH-RevisionEnd Use VdfBase.pkg Define WM_PROCESSFINISHED FOR (WM_USER+100) Define WM_PROCESSHANDLE FOR (WM_USER+200) Define WM_THREADID FOR (WM_USER+201) Define RUN_NOWAIT FOR False Define RUN_WAIT FOR True external_function RunProgramNotify "RunProgramNotify" RunProgramNotify.DLL Pointer lpFile Pointer lpParameters Pointer lpDir Integer iShow Handle hwnd Integer iMessage Integer iID Integer iNotifyCode Returns Integer external_function RunProgramDirect "RunProgramDirect" RunProgramNotify.DLL Pointer lpFile Pointer plParameters Pointer lpDir Integer iShow Integer iWait Returns Integer // Starts a program directly. Procedure RunProgramDirect Global String sProgram String sParas Integer iShow Integer iWait Pointer pProgram pParas Append sProgram (Character(0)) GetAddress Of sProgram to pProgram Append sParas (Character(0)) GetAddress Of sParas to pParas Procedure_Return (RunProgramDirect(pProgram,pParas,0,iShow,iWait)) End_Procedure Class cRunProgramNotify is a DFControl Register_Procedure onProcessFinished Register_Procedure onProcessHandle Register_Procedure OnThreadID //Insert your Properties here. Procedure Construct_Object Forward Send Construct_Object Set Focus_Mode to nonfocusable Set external_class_name "cRunRunProgramNotify" to "STATIC" Set external_message WM_PROCESSFINISHED to msg_onProcessFinished Set External_message WM_PROCESSHANDLE to msg_onProcessHandle Set External_message WM_THREADID to msg_onThreadId Property Integer piProcessRunCount 0 Object oRunningProcessesCallbacks is an Array // Messages End_Object Object oRunningProcessesHandleCallbacks is an Array // Callback, when the handle is received End_Object Object oRunningProcessesDest is an Array // Dest.Objects End_Object Object oRunningProcessesHandle is an Array // ProcessHandles End_Object Object oRunningProcessesThreadIds is an Array // Thread ID's End_Object End_Procedure // Reset Procedure Reset Send Delete_Data to (oRunningProcessesCallbacks(self)) Send Delete_Data to (oRunningProcessesDest(self)) Send Delete_Data to (oRunningProcessesHandle(self)) Send Delete_data to (oRunningProcessesThreadIds(self)) End_Procedure // Runs a program. Function RunProgramEx String sProgram String sParas Integer iShow Integer iCallBack Integer iDest Integer iHandleCallBack Returns Integer Integer iCount iVal iRet Pointer pProgram pParas Set piProcessRunCount to (piProcessRunCount(self)+1) Get Item_Count Of (oRunningProcessesCallbacks(self)) to iCount Set value Of (oRunningProcessesCallbacks(self)) Item iCount to iCallBack Set value Of (oRunningProcessesDest (self)) Item iCount to iDest If NUM_Arguments Ge 6 ; Set value Of (oRunningProcessesHandleCallbacks(self)) Item iCount to iHandleCallBack Move (trim(sProgram)) to sProgram Append sProgram (Character(0)) GetAddress Of sProgram to pProgram Move (trim(sParas)) to sParas Append sParas (Character(0)) GetAddress Of sParas to pParas Move (RunProgramNotify(pProgram,pParas,0,iShow,Window_Handle(self),WM_PROCESSFINISHED,iCount,0)) to iRet End_Function // Is received when the process is created, perhapes I can need the handle. Procedure onProcessHandle Integer wParam Integer lParam Handle hProcess Integer iItem iMsg iDest iID Move wParam to iItem // ItemNr Move lParam to hProcess // Prozesshandle Set value Of (oRunningProcessesHandle(self)) Item iItem to hProcess Get value Of (oRunningProcessesThreadIds(self)) Item iItem to iID Get value Of (oRunningProcessesHandleCallbacks(self)) Item iItem to iMsg Get value Of (oRunningProcessesDest (self)) Item iItem to iDest If iMsg Begin If iDest Send iMsg to iDest hProcess iID Else Send iMsg hProcess iID End End_Procedure // Is received when the process is created, store the ThreadID Procedure onThreadID Integer wParam Integer lParam Integer iItem iMsg iDest iID Move wParam to iItem // ItemNr Move lParam to iID // Thread ID Set value Of (oRunningProcessesThreadIds(self)) Item iItem to iID End_Procedure // Is sent when the started process is finished. Procedure onProcessFinished Integer wParam Integer lParam Integer iItem iMsg iDest Set piProcessRunCount to (piProcessRunCount(self)-1) Move wParam to iItem Get value Of (oRunningProcessesCallbacks(self)) Item iItem to iMsg Get value Of (oRunningProcessesDest (self)) Item iItem to iDest If iMsg Begin If iDest Send iMsg to iDest Else Send iMsg End If (piProcessRunCount(self)) Le 0 Send Reset End_Procedure End_Class