Gerar um EXE "destravado"

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Gerar um EXE "destravado"

Mensagem 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...
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Gerar um EXE "destravado"

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Gerar um EXE "destravado"

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Gerar um EXE "destravado"

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Gerar um EXE "destravado"

Mensagem 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" ) ?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Gerar um EXE "destravado"

Mensagem 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.
portelainfo
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 24 Ago 2014 02:23
Localização: Vitoria da Conquista/Bahia

Gerar um EXE "destravado"

Mensagem 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!
Portela Info (Mauricio Portela)
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Gerar um EXE "destravado"

Mensagem 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...
portelainfo
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 24 Ago 2014 02:23
Localização: Vitoria da Conquista/Bahia

Gerar um EXE "destravado"

Mensagem 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
Portela Info (Mauricio Portela)
portelainfo
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 24 Ago 2014 02:23
Localização: Vitoria da Conquista/Bahia

Gerar um EXE "destravado"

Mensagem 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
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Gerar um EXE "destravado"

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Eduardo Pinho
Colaborador
Colaborador
Mensagens: 72
Registrado em: 13 Jun 2014 19:30
Localização: Niteroi

Gerar um EXE "destravado"

Mensagem 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.
portelainfo
Usuário Nível 1
Usuário Nível 1
Mensagens: 10
Registrado em: 24 Ago 2014 02:23
Localização: Vitoria da Conquista/Bahia

Gerar um EXE "destravado"

Mensagem por portelainfo »

Opa!

Passando aqui para agradecer!

Obrigado rochinha! Estou trabalhando nessa ideia.

Att.

Mauricio Portela
Portela Info (Mauricio Portela)
paiva_dbdc
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 12 Nov 2012 09:58
Localização: uberlandia mg

Gerar um EXE "destravado"

Mensagem por paiva_dbdc »

OPa

se queres atualziar com o Povo usando

so usar NENAME


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

PAiva
Responder