Clipper On Line • Ver Tópico - Gerar um EXE "destravado"

Gerar um EXE "destravado"

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

Moderador: Moderadores

 

Gerar um EXE "destravado"

Mensagempor Eduardo Pinho » 12 Mai 2018 22:02

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...
Eduardo Pinho
Colaborador

Colaborador
 
Mensagens: 71
Data de registro: 13 Jun 2014 19:30
Cidade/Estado: Niteroi
Curtiu: 2 vezes
Mens.Curtidas: 5 vezes

Gerar um EXE "destravado"

Mensagempor asimoes » 13 Mai 2018 07:54

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Gerar um EXE "destravado"

Mensagempor asimoes » 13 Mai 2018 08:10

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()

   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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Gerar um EXE "destravado"

Mensagempor asimoes » 13 Mai 2018 08:19

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Gerar um EXE "destravado"

Mensagempor Jairo Maia » 13 Mai 2018 10:27

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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Gerar um EXE "destravado"

Mensagempor Eduardo Pinho » 13 Mai 2018 20:11

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.
Eduardo Pinho
Colaborador

Colaborador
 
Mensagens: 71
Data de registro: 13 Jun 2014 19:30
Cidade/Estado: Niteroi
Curtiu: 2 vezes
Mens.Curtidas: 5 vezes

Gerar um EXE "destravado"

Mensagempor portelainfo » 13 Mai 2018 20:22

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)
portelainfo
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 10
Data de registro: 24 Ago 2014 02:23
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Gerar um EXE "destravado"

Mensagempor Eduardo Pinho » 13 Mai 2018 20:29

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...
Eduardo Pinho
Colaborador

Colaborador
 
Mensagens: 71
Data de registro: 13 Jun 2014 19:30
Cidade/Estado: Niteroi
Curtiu: 2 vezes
Mens.Curtidas: 5 vezes

Gerar um EXE "destravado"

Mensagempor portelainfo » 13 Mai 2018 20:42

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
Data de registro: 24 Ago 2014 02:23
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Gerar um EXE "destravado"

Mensagempor portelainfo » 14 Mai 2018 02:19

O código que mencionei:
#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
portelainfo
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 10
Data de registro: 24 Ago 2014 02:23
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Gerar um EXE "destravado"

Mensagempor rochinha » 23 Mai 2018 23:56

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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Gerar um EXE "destravado"

Mensagempor Eduardo Pinho » 24 Mai 2018 09:00

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.
Eduardo Pinho
Colaborador

Colaborador
 
Mensagens: 71
Data de registro: 13 Jun 2014 19:30
Cidade/Estado: Niteroi
Curtiu: 2 vezes
Mens.Curtidas: 5 vezes

Gerar um EXE "destravado"

Mensagempor portelainfo » 16 Jun 2018 18:11

Opa!

Passando aqui para agradecer!

Obrigado rochinha! Estou trabalhando nessa ideia.

Att.

Mauricio Portela
Portela Info (Mauricio Portela)
portelainfo
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 10
Data de registro: 24 Ago 2014 02:23
Cidade/Estado: Vitoria da Conquista/Bahia
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Gerar um EXE "destravado"

Mensagempor paiva_dbdc » 18 Jun 2018 15:41

OPa

se queres atualziar com o Povo usando

so usar NENAME

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

PAiva
paiva_dbdc
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 342
Data de registro: 12 Nov 2012 08:58
Cidade/Estado: uberlandia mg
Curtiu: 0 vez
Mens.Curtidas: 6 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google Adsense [Bot] e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro