Jump to content
Fivewin Brasil

Reiniciar um programa após o fechamento


kapiaba

Recommended Posts


/*
Se podra iniciar un programa por si solo despues de cerrarlo


http://forums.fivetechsupport.com/viewtopic.php?f=6&t=31886&sid=f1b9f18aa8cf2bb3b68c6fcde1bb697a
*/

#include "FiveWin.ch"

static oWnd, lFinBackup := .T.

//----------------------------------------------------------------//

function Main()

local oBar

DEFINE WINDOW oWnd TITLE "Fecha Aplicativo"

DEFINE BUTTONBAR oBar _3D OF oWnd

DEFINE BUTTON OF oBar ACTION( oWnd:End(), CLOSE_EXE() )

SET MESSAGE OF oWnd TO "Fecha Aplicativo" NOINSET CLOCK DATE KEYBOARD

ACTIVATE WINDOW oWnd

oWnd:End()

return nil

FUNCTION CLOSE_EXE()

LOCAL cFileName := "FECHAAPP.EXE"

IF lFinBackup

oWnd:End()

#ifdef __XHARBOUR__ // Usando xHarbour

WinExec(CurDrive()+":\"+CURDIR()+"\"+AllTrim(cFileName(HB_ARGV(0))))

#else // usando Harbour

WinExec(hb_CurDrive()+":\"+CURDIR()+"\"+AllTrim(cFileName(HB_ARGV(0))))

#endif

RELEASE All

Hb_GCAll( .T. )

CLEAR MEMORY

PostQuitMessage( 0 )

__QUIT()

Endif

RETURN NL


Link to comment
Share on other sites


CmdRun({"taskkill /f /im programa.exe", DirExe()+"programa.exe"})

****************************************************************************

function CmdRun(xLinhaComando, bEval, lExibe)

****************************************************************************

*

* Rodar uma linha de comando no prompt do DOS

* Parametros: xLinhaComando

* Retorno: Nenhum

*

* Autor: Samir

* 06/12/2011 - 09:33:25

*

****************************************************************************

local cFileBat := "", cTextoBat := "", i := 0, lResult := .F.

Default lExibe := .F.

//-- Verifica se é uma única linha

If ValType(xLinhaComando) = "C"

cTextoBat := xLinhaComando

//-- Verifica se são múltiplas linhas

elseIf ValType(xLinhaComando) = "A"

For i := 1 to Len(xLinhaComando)

if !Empty(cTextoBat)

cTextoBat += CRLF

end

cTextoBat += xLinhaComando

end

//-- Tratamento para parâmetro inválido

else

MsgInfo("Parâmetro inválido","CMDRUN")

Return lResult

end

//-- Gerar o nome do arquivo bat a ser executado

cFileBat := DirExe() + "CMDRUN_"+DToS(Date())+"_"+StrTran(Now(),":") + ".BAT"

//-- Roda um loop para apagar o arquivo

i := 0

While File(cFileBat)

SysRefresh()

If fErase(cFileBat) != 0

SysWait(1)

//-- 3 tentativas "silenciosas"

If i < 3

i++

loop

end

//-- Mensagem de erro

If MsgYesNo("Erro " + UT( fError() ) + " ao apagar o arquivo: " + CRLF +;

cFileBat + CRLF + "Tentar novamente")

loop

else

exit

end

else

exit

end

end

//-- Se o arquivo não existe

If !File(cFileBat)

//-- Tenta criar o arquivo bat

If CreateTxt(cFileBat,cTextoBat)

//-- Verifica se criou

i := 0

While !File(cFileBat)

SysRefresh()

SysWait(1)

//-- 3 tentativas "silenciosas"

If i < 3

i++

loop

end

If MsgYesNo("Arquivo ainda não foi criado " + CRLF + "Deseja aguardar")

loop

else

exit

end

end

//-- Verifica se o arquivo foi criado com sucesso

If File(cFileBat)

lResult := .T.

//-- Executa o BAT

If lExibe

WaitRun(cFileBat,1)

else

WaitRun(cFileBat,0)

end

//-- Caso tenha sido passada uma validação, executa

If ValType(bEval) = "B"

lResult := Eval(bEval)

end

end

//-- Apaga o arquivo BAT para não deixar resíduos

i := 0

While File(cFileBat)

SysRefresh()

If fErase(cFileBat) != 0

SysWait(1)

//-- 3 tentativas "silenciosas"

If i < 3

i++

loop

end

If MsgYesNo("Erro " + UT( fError() ) + " ao apagar o arquivo: " + CRLF +;

cFileBat + CRLF + "Tentar novamente")

loop

else

exit

end

else

exit

end//If fErase(cFileBat) != 0

end//While File(cFileBat)

end//If CreateTxt(cFileBat,cTextoBat)

end//If !File(cFileBat)

Return lResult

/*------------------------------------------------------------------------*/

****************************************************************************

Function DirExe()

****************************************************************************

*

* Pegar o caminho aonde se encontra o executavel

* Parametros:

* Retorno: cDir

*

* Autor: Samir

* 18/5/2009 - 09:55:56

*

****************************************************************************

local cDir := cFilePath( GETMODULEFILENAME( GETINSTANCE() ) )

If Right(cDir,1) != "\"

cDir += "\"

end

Return cDir

/*------------------------------------------------------------------------*/

****************************************************************************

function UT(cStr)

****************************************************************************

*

* Remover os espaços excedentes e forçar caixa alta

* Parametros: cStr

* Retorno: cStrFormatado

*

* Autor: Samir

* 7/4/2009 - 09:55:35

*

****************************************************************************

local cStrFormatado := ""

If ValType(cStr) = "N"

cStrFormatado := Str(cStr)

elseif ValType(cStr) = "C"

cStrFormatado := cStr

elseif ValType(cStr) = "U"

cStrFormatado := ""

elseif ValType(cStr) = "A"

cStrFormatado := "Matriz"

else

cStrFormatado := ""

end

cStrFormatado := AllTrim(Upper(cStrFormatado))

Return cStrFormatado

/*------------------------------------------------------------------------*/
Link to comment
Share on other sites

Amiguinhos,

Interessante o assunto, mas eu fui além pensando em sanar um problema em nossos sistemas.

Caso o sistema caia, quebre, por erro de falta de variável, falta de campo ou tabela corrompida.

No meu exemplo, quando o aplicativo entra ele aciona o agendamento de tarefa e deixa o mesmo em alerta. Caso o usuário saia do sistema pelas vias normais o agendamento é encerrado, mas caso a saida do sistema foi por outro motivo, o agendamento se prepara para subir novamente o sistema.

Quase parecido com os serviços do Windows, que quando encerrados brutalmente voltam a funcionar sem intervenção do usuário.

Usem com moderação.

////////////////////////////////////////////////////////////////////////////
//
//         Autor: Jose Carlos da Rocha                                                                                              
//          Data: 03/02/2016
//         Email: irochinha@hotmail.com.br
//     Linguagem: xBase / Fivewin
//   Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour
//
////////////////////////////////////////////////////////////////////////////

#include "fivewin.ch"

function main()

   local oWnd
   local oBtn1, oBtn2, oBtn3
   
   cTaskName := StrTran( upper(cFileName(GetModuleFileName(GetInstance()))), ".EXE", "" )
   cCMDRun   := GetModuleFileName(GetInstance())

   // Previne multiplas instancias
   SOSFile   := cTaskName+".sos"
   if file(SOSFile)
      fErase(SOSFile) // Tenta eliminar o arquivo de controle
      if fError() <> 0
         //if ! MsgYesNo( "O sistema ja se encontra aberto.Veja o icone ao lado do relogio", "Multiplas instancias" )
            quit
         //endif
      endif
   endif
   SOSHandle := fCreate(SOSFile) // Cria o arquivo de controle
   SOSHandle := fOpen(SOSFile,1) // Abre travando o arquivo de controle
   
   SET _3DLOOK ON
   
   // Cria a tarefa AntiStealth
   EXETaskCreate( ;
                  cTaskName, ; // Nome da tarefa usando o nome do aplicativo ativo
                  GetModuleFileName(GetInstance()) ; // Caminho completo do aplicativo
                  )
   
   DEFINE WINDOW oWnd TITLE "Test Schedule Task" // FROM 0, 0 TO 400, 300
          DEFINE BUTTONBAR oWBar _3D SIZE 33, 33 OF oWnd
          DEFINE BUTTON oBtn1 OF oWBar ;
                 TOOLTIP "Forca a Saida" ;
                 ACTION oWnd:End()
          DEFINE BUTTON oBtn2 OF oWBar ;
                 TOOLTIP "Saida Normal" ; // Se o usuario saiu normalmente, apenas desabilita a tarefa
                 ACTION ( EXETaskDisable( cTaskName ), oWnd:End() )
          DEFINE BUTTON oBtn3 OF oWBar ;
                 TOOLTIP "Saida Normal" ; // Exclui definitivamente a tarefa agendada
                 ACTION EXETaskDelete( cTaskName ) GROUP
          SET MESSAGE OF oWnd TO "Testando Schedule Tasks" NOINSET
   ACTIVATE WINDOW oWnd ;
         ON INIT ( ;
            EXETaskEnable( cTaskName ) ; // Habilita a tarefa e caso o aplicativo quebre, ela sera executada
            )
   return nil

////////////////////////////////////////////////////////////////////////////
//
//    Propositos: Permitir a manutencao dos agendamento de tarefas                                                                  
//
////////////////////////////////////////////////////////////////////////////
function EXETaskCreate( cTaskName, cCMDRun )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/create /tn "+cTaskName+" /TR "+cCMDRun+" /sc MINUTE", "c:\windows\system32", 0)
   return nil
   
function EXETaskDelete( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/delete /f /tn "+cTaskName, "c:\windows\system32", 0)
   return nil

function EXETaskEnable( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/change /enable /tn "+cTaskName, "c:\windows\system32", 0)
   return nil

function EXETaskDisable( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/change /disable /tn "+cTaskName, "c:\windows\system32", 0)
   return nil

function EXETaskEnd( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/end /tn "+cTaskName, "c:\windows\system32", 0)
   return nil

function EXETaskRun( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/run /tn "+cTaskName, "c:\windows\system32", 0)
   return nil

function EXETaskQuery( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/query /fo csv /tn "+cTaskName+" > "+cTaskName+".csv", "c:\windows\system32", 0)
   return nil
   

Link to comment
Share on other sites

Amiguinhos,

Explicando,

O aplicativo entra, abre o agendador de tarefas e coloca a si mesmo como tarefa.

Quando o usuario sai normalmente esta tarefa é encerrada, podendo ser até excluída.

Quando o aplicativo sai da memória, por erro, ou qualquer coisa fora do normal, ele não desabilitou o agendamento, que está ativo e pendente, desta forma o mesmo voltará a ser executado em um minuto.

Entendeu?

Se quiser posso programá-lo para derrubar seu firewall, ka, ka, ka.

Link to comment
Share on other sites

  • 2 weeks later...

Testei a dica do WinExec(CurDrive()+":\"+CURDIR()+"\"+AllTrim(cFileName(HB_ARGV(0)))), acima, mas não funcionou. Vou continuar usando esta:

      cAtuInf := "@ECHO OFF"+CRLF+;
                 "COLOR F1"+CRLF+;
                 "TASKKILL /IM "+cFileName(HB_ARGV(0))+" /F"+CRLF+;
                 "START "+cFileName(HB_ARGV(0))+CRLF+;
                 "EXIT"
      if file(".\Executa.bat") ; ferase(".\Executa.bat") ; endif
      arq2 := fcreate(".\Executa.bat")
      fwrite(arq2, cAtuInf)
      fclose(arq2)
      WAITRUN( GetEnv( 'ComSpec' )+' /C START .\Executa.bat"', 0 )
      SYSWAIT(3)
      PostQuitMessage( 0 )
      QUIT
Link to comment
Share on other sites

Se entendi, o que não se quer é que o mesmo aplicativo seja aberto mais de uma vez. Ou seja, o programa X já esta aberto e o usuário tenta abri-lo novamente. Se for isto, eu resolvi assim:

If IsExeRunning("X")
MsgInfo("O programa X já está ativo nesta máquina","Nome do programa - Informo")
Return Nil
Endif
Link to comment
Share on other sites

Amiguinhos,

Marca,

Não só no Windows Server, mas em qualquer Windows o problema com o controle de execução está ligado ao UAC. Eu publiquei aqui os esquemas necessários para subir o nivel de usuário e evitar esta pergunta chata.

O fato de usar o ShellExecute com nivel de supervisor( RUNAS ) já evita que o comando não tenha efeito. Verifique se o schtask.exe existe em seu Windows ou troque o nome para o executável de mesma tarefa em seu sistema operacional.

Para usar as funções de gerenciamento de tarefas eu fiz assim:

Em primeiro lugar peguei o nome do executável, para usar como o nome da tarefa:
          cTaskName := StrTran( upper(cFileName(GetModuleFileName(GetInstance()))), ".EXE", "" )
Para evitar que enquanto o aplicativo chamado pela tarefa seja aberto novamente devemos prepará-lo para permitir abertura somente uma vez:
   Set Multiple off
 
   DEFINE WINDOW oWnd FROM ...
   ...
Ou:
   SOSFile   := cPath + alltrim(str(nSerialHD("C:"))) + ".sos"
   if file(SOSFile)
      fErase(SOSFile) // Tenta eliminar o arquivo de controle
      if fError() <> 0
         if ! MsgYesNo( "O sistema ja se encontra aberto.Veja o icone ao lado do relogio", "Multiplas instancias" )
            quit
         endif
      endif
   endif
   SOSHandle := fCreate(SOSFile) // Cria o arquivo de controle
   SOSHandle := fOpen(SOSFile,1) // Abre travando o arquivo de controle
 
   DEFINE WINDOW oWnd FROM ...
   ...
Depois de verificarmos que o aplicativo não se abrirá novamente preparamos o uso das funções:
   DEFINE WINDOW oWnd FROM ...
   ...
   ACTIVATE WINDOW oWnd MAXIMIZED ;
         VALID ( EXETaskDelete( cTaskName ), ... ) ;
         ON INIT ( EXETaskCreate( cTaskName, GetModuleFileName(GetInstance()) ),... ;
   return .t.
Explicando:
O VALID ao sair excluirá a tarefa, pois como o saida foi satisfatória o aplicativo não mais será executado.
O ON INIT fará a criação da tarefa, já deixando-a habilitada para se executada. Caso o aplicativo caia por erro, bug ou qualquer outro método que não seja a saida normal, a tarefa se encarregará de colocar no ar o aplicativo novamente.
Funções:
function EXETaskCreate( cTaskName, cCMDRun )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/create /tn "+cTaskName+" /TR "+cCMDRun+" /sc MINUTE", "c:\windows\system32", 0)
   return nil
   
function EXETaskDelete( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/delete /f /tn "+cTaskName, "c:\windows\system32", 0)
   return nil
 
function EXETaskEnable( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/change /enable /tn "+cTaskName, "c:\windows\system32", 0)
   return nil
 
function EXETaskDisable( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/change /disable /tn "+cTaskName, "c:\windows\system32", 0)
   return nil
 
function EXETaskEnd( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/end /tn "+cTaskName, "c:\windows\system32", 0)
   return nil
 
function EXETaskRun( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/run /tn "+cTaskName, "c:\windows\system32", 0)
   return nil
 
function EXETaskQuery( cTaskName )
   // Jose Carlos da Rocha - 02/02/2016
   ShellExecute( GetActiveWindow(), "RUNAS", "SCHTASKS.exe", "/query /fo csv /tn "+cTaskName+" > "+cTaskName+".csv", "c:\windows\system32", 0)
   return nil
E nem foi preciso alterar a funcção ShellExecute.
Link to comment
Share on other sites

Bom dia Rochinha.

O meu esta exatamente assim

Como falei acima no meu Windows 7 Ultimate funcionou perfeitamente sendo q. no meu servidor 2003 ou 2008 ele se quer cria o serviço a nao ser que eu coloque os seguintes parametros /ru usuario /rp senha sendo que ai ele pede a tal tela de executar como

Percebi tbem que do primeiro exemplo para este vc mudou duas situações

Incluiu no valid da Window o delete no valid e trocou no ON INIT o ExeTaskEnable() pelo ExeTaskCreat()

Qual das duas deve ficar a de criação ou a de habilitar ?

Respondendo sua pergunta a respeito do Schtasks.exe ele existe no system32 do windows server

Link to comment
Share on other sites

Bom dia a todos

Além do problema que relatei acima sobre o Windows server 2003 estou me deparando ainda com outra situaçao

Qdo o servidor hiberna ou fica ocioso a tarefa esta parando de ser executada.

Encontrei estas duas situações abaixo. Alguém esta utilizando esta rotina ?

Para agendar uma tarefa executada quando o sistema está ocioso
Sintaxe


schtasks /create /tn <TaskName>/TR <TaskRun>/sc onidle /i {1-999} [/sd <StartDate>] [/it] [/ru {[<Domain> \] <User>[/rp <Password>] | System}] [/s <Computer>[/u [<Domain> \] <User>[/p <Password>]]]

Comentários
"Quando ocioso" agenda tipo agenda uma tarefa é executada sempre que não há nenhuma atividade do usuário durante o tempo especificado pelo parâmetro /i ."Quando ocioso" agenda tipo, o parâmetro /sc onidle e o parâmetro /i são necessários. /Sd /Sd (data de início) é opcional e o padrão é a data atual.
Exemplos
Para agendar uma tarefa executada sempre que o computador está ocioso
O comando a seguir agenda o programa Meu_apl para ser executado sempre que o computador está ocioso. Ele usa o parâmetro necessário /i para especificar que o computador deve permanecer ocioso por dez minutos antes do início da tarefa.


schtasks /create /tn "Meu apl" /tr c:\apps\meu_apl.exe /sc onidle /i 10

Link to comment
Share on other sites

Sendo mais suscinto:

function FECHAR
ComandosBAT := "@ECHO OFF"+CRLF+;
'echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs'+CRLF+;
'echo WScript.Quit (WshShell.Popup( "Aguarde enquanto o sistema encerra a seção anterior" ,'+alltrim(str(mTEMPOESPERA,10))+' ,"DOWNLOAD", 48)) >> %tmp%\tmp.vbs'+CRLF+;
"cscript /nologo %tmp%\tmp.vbs"+CRLF+;
"if %ERRORLEVEL% EQU 1 (timeout /t "+alltrim(str(mTEMPOESPERA,10))+" >nul)"+CRLF+;
"del %tmp%\tmp.vbs"+CRLF+;
"start executavel.exe"+CRLF+;
"exit"
MeuMemoWrite( "atualiza.bat", ComandosBAT )
winexec("atualiza.bat",0)
quit
return
function MeuMemoWrite(xMRARQ,xMRTXT)
FC_NORMAL := 0
nOutfileMR := FCREATE(xMRARQ, FC_NORMAL)
cBUFFERMR=xMRTXT
cLENBUF:=LEN(cBUFFERMR)
FWRITE(nOutfileMR, cBUFFERMR, cLENBUF)
FCLOSE(nOutfileMR)
return
Link to comment
Share on other sites

Amiguinhos,

Marca

Ociosidade e Hibernação são dois momentos diferentes.

Na Hibernação há uma parada quase que todas das atividades do computador e muitas vezes são retornadas pelo movimento WakeUp causados pelo mouse ou teclado. Lógico que isto deve ser configurado no SETUP do computador. Se não forem programados a Hibernação só retorna ao estado anterior quando o botão POWER for pressionado.

Já na ociosidade que é a falta de movimentação pelo usuário, ou seja, sem movimentos de mouse ou eventos de teclado partes do computador vão parando. Lógico que isto deve ser configurado no Sistema Operacional, pela gerencia de energia. Se o hd foi programado para desligar após um período de inatividade, a tarefa que será executada e necessitará de acesso ao disco deverá também recuscitá-lo.

O seu comando está correto, mas necessita de outros ajustes extras. Ao encontrar esta relação você terá exito na sua execução.

Link to comment
Share on other sites

Ola Rochinha
Ambas as situações estão configuradas pra não deixar parar o servidor já q. o mesmo não é utilizado diretamente por nenhum usuário.

A situação q. vc mencionou no skype a respeito do gpedit.msc Controladores de eventos eu fiz e tbem não deu resultado.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...