LPARAMETER nProcessToKill, nThreadToKill IF TYPE('nProcessToKill') # 'N' nProcessToKill = This.inProcessHandle ENDIF IF TYPE('nThreadToKill') # 'N' nThreadToKill = This.inThreadID ENDIF DECLARE INTEGER PostThreadMessage IN USER32 ; INTEGER idThread, ; INTEGER nMsg, ; INTEGER wParam, ; INTEGER lParam DECLARE Sleep IN WIN32API INTEGER #DEFINE WM_CLOSE 0x10 =PostThread(nThreadToKill,WM_CLOSE,0,0) =Sleep(3000) && 3 second delay IF this.CheckProcessExitCode(nProcessToKill) # 259 RETURN .T. ENDIF =Sleep(3000) && 3 second delay IF this.CheckProcessExitCode(nProcessToKill) # 259 RETURN .T. ENDIF * Still running, so blow it away DECLARE SHORT TerminateProcess IN WIN32API AS KillProc ; INTEGER hProcess, ; INTEGER uExitCode LOCAL nResult IF ! ISNULL(nProcessToKill) nResult = KillProc(nProcessToKill,0) this.icErrorMessage = IIF(nResult = 0, 'TerminateProcess() could not kill process handle requested','') ELSE this.icErrorMessage = 'NULL handle passed to KillProc()' nResult = 0 ENDIF RETURN (nResult = 1)>