Página 1 de 1

Gerar um EXE "destravado"

Enviado: 12 Mai 2018 22:02
por Eduardo Pinho
Olá pessoal,

Alguém sabe se tem uma opção no hbmk pra gerar um exe "destravado"?

Eu explico: quando eu usava o summer, os exes podiam ser sobrescritos tranquilamente quando eu alterava o sistema. Já o 5.2 não deixava, tinha que pedir a todos pra fecharem o sistema pra eu poder atualizar. Agora, com Harbour 3.0 é a mesma coisa. É um saco. Era melhor quando eu sobrescrevia e quem quisesse a nova versão era só sair do sistema e entrar de novo.

Não sei porque o exe se mantém aberto na rede. Não entendo muito mas antigamente tinha aquele negócio de overlay que o sistema não carregava inteiro pra memória pra economizar memória. Entao o exe se mantinha aberto pois ficava carregando rotinas aos poucos conforme ia precisando. Mas hoje acho que esse problema não existe mais pois as memórias são bem maiores que os exes, não sei se to falando besteira.

Tentei fechar o exe no SO botando um fclose([sistema.exe]) logo no inicio. E funcionou. Testei e consigo até deletar o exe que o sistema continua aberto e rodando. Mas não sei porque, quando mais de 10 usuarios abriram o sistema, voltamos a estaca zero. O exe trava e não pode ser sobrescrito.

Não é o fim do mundo. Tá tudo funcionando bem. É só um capricho do programador.. Pra facilitar minha vida na hora de corrigir um bug sem o povo me xingar porque tem que fechar o sistema... hehe

Agradeço as dicas...

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 07:54
por asimoes
Sendo uma aplicação harbour que é win32 ou win64 o seu sistema está no processo do windows, você teria que "matar" o seu sistema no processo do windows.

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 08:10
por asimoes
Um exemplo simples:

A função exitprocess(), remove a aplicação do processo do windows.

Isso é somente uma ideia.

Nota: eu faço atualizações do meu sistema, o executável é atualizado "onthefly" rodando nas estações e ainda tenho uma alerta no sistema pedindo para o usuário fechar a aplicação quando há uma atualização. para garantir que o executável o foi encerrado uso a função ExitProcess() na saída.

Esse arquivo derruba.txt enquanto existir na pasta do executável executa a função exitprocess()

Código: Selecionar todos

   Derruba()

FUNCTION Derruba()

   IF File("DERRUBA.TXT")
      ExitProcess()
   ENDIF
   
RETURN Nil

   
#pragma BEGINDUMP

#include "windows.h"
#include "hbapi.h"
#include "hbapiitm.h"

HB_FUNC( EXITPROCESS )
{
   ExitProcess( 0 );
}   

#pragma ENDDUMP

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 08:19
por asimoes
Outra ideia, seria fazer um utilitário tipo system tray pra fazer esse trabalho de "derrubar" a aplicação enquanto ela estiver em manutenção, esse utilitário seria executado em todas as estações de usuário e ficaria "monitorando" eventuais atualizações do sistema

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 10:27
por Jairo Maia
Olá Eduardo,
Eduardo Pinho escreveu:Tentei fechar o exe no SO botando um fclose([sistema.exe]) logo no inicio. E funcionou.
Como você fez isso? Você colocou apenas o comando FClose( "nome_do_executavel.exe" ) ?

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 20:11
por Eduardo Pinho
Sim, Jairo..

Foi exatamente isso que fiz, mas me enganei.. Não funcionou nao... Eu achei que tinha funcionado porque eu tentei renomear o exe em vez de sobrescrever... Mas renomear, eu descobri, que o SO sempre permite mesmo, porque voce renomeia e ele continua aberto.. Mas depois em outro teste eu tentei sobrescrever ou deletar e o SO nao deixou. Assim, descobri que o fclose() nao surtiu efeito nenhum... O bichinho continuou aberto. :-(

Agradeço as dicas do Simoes, vou fazer uma dessas depois... Mas eu ainda acho que deve ter uma maneira de gerar um executavel que se carrega pra memoria e se fecha... Uma opcao do hbmk2 talvez... Nao sou expert em SO mas nao consigo ver uma razao pra manter o arquivo aberto depois que carrega.

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 20:22
por portelainfo
Boa noite!

Pegando esse gancho, eu usava uma função de proteção de string dentro do executável (clipper summer). Com o Harbour não consigo "gravar" dentro do próprio executável:
Assim:
1 - chamo o programa.exe pela primeira vez;
2 - existe uma verificacao de uma string de controle;
- se a string é "original", é chamado a funcão de protecao;
- se não, confere se a variavel da string está correta (alterada pela funcao) - se ok, segue o programa, se não, houve alteração do executável

Já tentei abrir o executável com FOPEN( arquivo, FO_SHARED + FO_DENYNONE) e a função passa como se tivesse exito. Mas, quando torno a executar o programa, é como se fosse a primeira vez (ou seja, não foi feita a alteração do binário).

Existe alguma maneira de grava no próprio executável (e em execução)??

Abraço!

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 20:29
por Eduardo Pinho
Portela,

Pelo mesmo motivo, quando eu usava summer eu sobrescrevia o executavel a vontade para atualizar.. Porque o summer carregava o exe mas nao mantinha ele aberto. A partir do 5.2 eu nao conseguia mais fazer isso. Acredito que, por isso, no summer voce conseguia alterar o arquivo exe e agora nao...

Gerar um EXE "destravado"

Enviado: 13 Mai 2018 20:42
por portelainfo
Eduardo,

Sendo um arquivo Win32, eu sei que pode ser feito a gravação. Pois os programas de depuração (debug) abrem um programa e com ele na memória, alteram instruções e depois, conseguem gravar essas alterações neste arquivo. Então, existe uma forma. Seja com API do Windows ou mesmo no C puro.

Att.

Mauricio Portela

Gerar um EXE "destravado"

Enviado: 14 Mai 2018 02:19
por portelainfo
O código que mencionei:

Código: Selecionar todos

#include "box.ch"
#include "inkey.ch"
#include "fileio.ch"
#include "getexit.ch"

FUNCTION Main()
    SET SCORE OFF
    SET DATE FORMAT TO "dd/mm/yyyy"
    cSistema := "Controle Financeiro"
    cls
    IF .NOT. PROTECT()
        ? "Erro: Sistema corrompido (STR-0001)."
        ? "Contactar o desenvolvedor."
        QUIT
    ENDIF
    @ 22, 00 SAY "FINAL!"
RETURN NIL

FUNCTION PROTECT()
    PRIVA nHandler, cBuffer, lRet, cTexto, p, tamanhoArquivo, cArquivo

    // Digitar com atencao a linha abaixo:
    cCodigo := "EXEEXEEXEEXEWWWWWWWWWWWWYYYYYYYYYYYY"
    
    // Se primeira execucao, protege.
    IF REPLICATE("EXE", 4) $ cCodigo
        CLS
        cArquivo := SPACE(12)
        cTexto  := SPACE(20)
        SETCOLOR("W+/B")
        @ 00,00,03,79 BOX B_SINGLE + SPACE(1)
        @ 01, 02 SAY "Digite o nome do .EXE a ser protegido: " GET cArquivo VALID !EMPTY(cArquivo)
        @ 02, 02 SAY "Digite a String a ser protegida      : " GET cTexto   VALID !EMPTY(cTexto)
        READ
        IF LASTKEY() == K_ESC
            QUIT
        ENDIF
        @ 04,00,06,79 BOX B_SINGLE + SPACE(1)
        @ 05, 02 SAY "Protegendo..."
        cArquivo := ALLTRIM(UPPER(cArquivo))
        IF .NOT. "." $ cArquivo
            cArquivo += ".EXE"
        ENDIF

        // Abre arquivo a nivel de DOS
        nHandler := FOPEN(cArquivo, 64) // era 2
        IF FERROR() # 0
            @ 07,00,09,79 BOX B_SINGLE + SPACE(1)
            @ 08, 02 SAY "Erro na abertura do arquivo " + cArquivo
            QUIT
        ENDIF
        tamanhoArquivo := FSEEK(nHandler, 0, FS_END) // era 2
        FSEEK(nHandler, 0, 0)
        // ***
        cBuffer := SPACE(512)
        cTexto := ALLTRIM(cTexto)
        // --------------
        p := ACHOU(cTexto)
        IF p == 0
            @ 07,00,09,79 BOX B_SINGLE + SPACE(1)
            @ 08, 00 SAY "String nao encontrada em " + cArquivo
            QUIT
        ENDIF
        bytes1 := 0
        FORMULA()
        IF ACHOU(REPL("EXE", 4)) == 0
            RETURN .F.
        ENDIF
        nPosicao := AT("EXE", cBuffer)

        cBuffer1 := SUBSTR(cArquivo + SPACE(12), 1, 12) + STRZERO(bytes1, 12) + STRZERO(p, 12)
        cBuffer := STUFF(cBuffer, nPosicao, 36, cBuffer1)

// -----------------------------------------------------------------------------
        alert("Arquivo:;[" + cArquivo + "];" + ;
              "Sequencia Inicial:;[" + alltrim(cCodigo) + "];" + ;
              "Valor para gravar:;[" + alltrim(cBuffer1) + "]")
// -----------------------------------------------------------------------------

        FSEEK(nHandler, -512, 1)
        FWRITE(nHandler, cBuffer1)
        FCLOSE(nHandler)
        @ 07,00,09,79 BOX B_SINGLE + SPACE(1)
        @ 08, 02 SAY "Arquivo protegido"
     // Se nao eh a primeira execucao, verifica protecao
    ELSE
        cArquivo := ALLTRIM(SUBSTR(cCodigo, 1, 12))
        bytes   := VAL(SUBSTR(cCodigo, 13, 12))
        desloca := VAL(SUBSTR(cCodigo, 25, 12))
// -----------------------------------------------------------------------------
        alert("Arquivo:;[" + cArquivo + "];" + ;
              "Sequencia:;[" + alltrim(cCodigo) + "];" + ;
              "Bytes GRAVADOS:;[" + alltrim(str(bytes)) + "];" + ;
              "Deslocamento:;[" + alltrim(str(desloca)) + "]")
// -----------------------------------------------------------------------------
        IF .NOT. PROTECT1()
            RETURN .F.
        ENDIF
    ENDIF
    // CLS
RETURN .T.

FUNCTION PROTECT1()
    nHandler = FOPEN( cArquivo, 0)
    IF FERROR() # 0
        // CLS
        @ 07,00,09,79 BOX B_SINGLE + SPACE(1)
        @ 08, 02 SAY "Erro no arquivo .EXE"
        QUIT
    ENDIF
    cBuffer := SPACE(512)
    FSEEK(nHandler, desloca)
    FREAD(nHandler, @cBuffer, 512)
    bytes1 := 0
    FORMULA()
    IF bytes1 == bytes
        lRet := .T.
    ELSE
        // CLS
        @ 07,00,09,79 BOX B_SINGLE + SPACE(1)
        @ 08, 02 SAY "Arquivo foi alterado"
        lRet := .F.
    ENDIF
    FCLOSE(nHandler)
RETURN lRet

FUNCTION ACHOU(cTexto)
    PRIVA q
    FSEEK(nHandler, 0, 0)
    FOR q := 0 TO tamanhoArquivo STEP 512
        FREAD(nHandler, @cBuffer, 512)
        IF AT(cTexto, cBuffer) != 0
            RETURN q
        ENDIF
    NEXT
RETURN 0

FUNCTION FORMULA()
    FOR a := 1 TO 512
        bytes1 := bytes1 + ASC(SUBSTR(cBuffer, a, 1)) + a
    NEXT
RETURN .T.
Segue anexo o relato com print.

Att.

Mauricio Portela

Gerar um EXE "destravado"

Enviado: 23 Mai 2018 23:56
por rochinha
Amiguinhos,

PortelaInfo
Voce terá de criar um aplicativo para gravar a informação no .EXE já que o mesmo não pode gravar em si próprio.

O Harbour trabalha muito bem com .DLL agregue sua função de proteção em uma .DLL faça seu aplicativo abrir esta .DLL e acionar a função dentro dela.

Aqui no forum foi explanado como criar .DLL com funções.

Não são de recursos, com imagens ou dialogos, que são resultado de compilação de RCs.

Gerar um EXE "destravado"

Enviado: 24 Mai 2018 09:00
por Eduardo Pinho
Só registrando como informação, como tenho feito ultimamente pra resolver o problema.

Como nao tenho que alterar programa toda hora (graças a Deus), é uma vez ou outra, quando tenho que sobrescrever o executavel devido a alguma alteração, em vez de pedir a todas as estações para fechar o programa, eu faço o seguinte:

Entro no servidor (server 2012) pelo teamviewer e no "Gerenciamento do Computador" eu vou em "arquivos abertos" e clicando com o botao direito no executavel aberto, ele me permite FECHAR o arquivo. Se o programa estiver rodando em varias estacoes, aparece varios e tenho que fechar todos. Depois disso, sobrescrevo o executavel sem problemas, e as estacoes nem "sentem", continuam rodando o programa normalmente.

Pois como eu falei, nao entendo muito mas nao vejo motivo pro executavel permanecer aberto depois de se carregar na estacao. Eu fecho o arquivo .exe no SO e tudo continua normal.

Gerar um EXE "destravado"

Enviado: 16 Jun 2018 18:11
por portelainfo
Opa!

Passando aqui para agradecer!

Obrigado rochinha! Estou trabalhando nessa ideia.

Att.

Mauricio Portela

Gerar um EXE "destravado"

Enviado: 18 Jun 2018 15:41
por paiva_dbdc
OPa

se queres atualziar com o Povo usando

so usar NENAME


ren sfa.exe *.old
ren novo.exe sfa.exe

PAiva