Gerar um EXE "destravado"
Moderador: Moderadores
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Gerar um EXE "destravado"
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...
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"
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)
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)
Gerar um EXE "destravado"
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()
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)
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)
Gerar um EXE "destravado"
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)
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)
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Gerar um EXE "destravado"
Olá Eduardo,
Como você fez isso? Você colocou apenas o comando FClose( "nome_do_executavel.exe" ) ?Eduardo Pinho escreveu:Tentei fechar o exe no SO botando um fclose([sistema.exe]) logo no inicio. E funcionou.
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)
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

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Gerar um EXE "destravado"
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.
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

- Mensagens: 10
- Registrado em: 24 Ago 2014 02:23
- Localização: Vitoria da Conquista/Bahia
Gerar um EXE "destravado"
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!
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

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Gerar um EXE "destravado"
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...
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

- Mensagens: 10
- Registrado em: 24 Ago 2014 02:23
- Localização: Vitoria da Conquista/Bahia
Gerar um EXE "destravado"
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
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

- Mensagens: 10
- Registrado em: 24 Ago 2014 02:23
- Localização: Vitoria da Conquista/Bahia
Gerar um EXE "destravado"
O código que mencionei:
Segue anexo o relato com print.
Att.
Mauricio Portela
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.
Att.
Mauricio Portela
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Gerar um EXE "destravado"
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.
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
-
Eduardo Pinho
- Colaborador

- Mensagens: 72
- Registrado em: 13 Jun 2014 19:30
- Localização: Niteroi
Gerar um EXE "destravado"
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.
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

- Mensagens: 10
- Registrado em: 24 Ago 2014 02:23
- Localização: Vitoria da Conquista/Bahia
Gerar um EXE "destravado"
Opa!
Passando aqui para agradecer!
Obrigado rochinha! Estou trabalhando nessa ideia.
Att.
Mauricio Portela
Passando aqui para agradecer!
Obrigado rochinha! Estou trabalhando nessa ideia.
Att.
Mauricio Portela
Portela Info (Mauricio Portela)
-
paiva_dbdc
- Usuário Nível 3

- Mensagens: 342
- Registrado em: 12 Nov 2012 09:58
- Localização: uberlandia mg
Gerar um EXE "destravado"
OPa
se queres atualziar com o Povo usando
so usar NENAME
ren sfa.exe *.old
ren novo.exe sfa.exe
PAiva
se queres atualziar com o Povo usando
so usar NENAME
ren sfa.exe *.old
ren novo.exe sfa.exe
PAiva