WAPI v1.05 - Funções da API do Windows

Fórum sobre ferramentas de apoio à programação (Clipper/[x]Harbour)

Moderador: Moderadores

Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Isso mesmo

Mensagem por Pablo César »

Maligno escreveu:Acho que era sobre essa questão que você estava ancioso para obter uma resposta, não é?
AHAMMM !!
Maligno escreveu:Vou fazer alguns testes, antes de dizer qualquer coisa. Depois volto ao assunto. :)
BELEZA !!!

GOD BLESS YOU, MALIGNO !!! :)Pos (agora vou dormir mais tranquilo... hihihi)
Editado pela última vez por Pablo César em 11 Mar 2007 23:10, em um total de 1 vez.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

LONG-FILES-NAMES

Mensagem por Pablo César »

Só para complementar informação sobre o LONG-FILES-NAMES (Nomes longos dos arquivos).

Umas das dificuldades com o nome comprido do diretório, é mudar de diretorio (muitos não sabem), mas no DOS para mudar basta colocar o nome longo entre aspas, porém ~eu não conseguí utilizar dessa forma com o DIRCHANGE() da CT.LIB.

Um clip-abraço :)Pos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Conforme comentado em outra thread,...

Já até terminei de desenvolver a função URL2FILE no WAPI. Funciona perfeitamente, apesar do meu firewall não gostar muito. Eu até disse que ia liberar de imediato, mas não gostei de uma coisa. Há duas funções: a de download e a de teste de conexão. Esta última, quando desconectado da Internet, demora tempo demais pra retornar. É um exagero. Então resolvi segurar o WAPI mais um pouco pra poder encontrar uma maneira de acompanhar de perto o progresso da conexão. Posso dizer que encontrei uma maneira mas ainda está em teste. Como só posso mexer nisso à noite, vai demorar um pouco mais. Não vai ser fácil monitorar o progresso de um download de forma a poder montar uma barra de progresso. Mas será possível estipular um "timeOut". Isso já vai melhorar a performance da função.

Aliás, uma outra coisa que é bastante chata é o falso positivo no teste de conexão. Como o teste ocorre pelo download de um arquivo pequeno e o U2F usa um moniker do IE, no segundo download o arquivo vem do cachè e não da Internet. Mas isso também está pra ser resolvido. Espero. :)

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

MALIGNO, não seria conveniente separar estas novas funções de comunicação em uma outra biblioteca ou aplicativo, por assim dizer ?.

Nessa nova função ou aplicativo de verificar somente se está conectado a INTERNET. O maior problema e o tempo de retorno (mesmo com TIMEOUT definido) parece ser um problema até do próprio PING que é o mais simples para esta questão que também demora quando está DESCONECTADO.

Talvez eu fale uma besteira, mas me deixe opinar no escuro:

Seria possível, talvez em linguagem de baixo nível (e sei que você manja) verificar se o modem está com a porta aberta ?. Acho que deve funcionar para modems de dial-up mas não entanto não sei como seria em modems DSL.

Sei lá às vezes correm idéia tão malucas... mas que sem querer podem levar a algo.

Boa sorte colega, mas pense em criar outro aplicativo para comunicações.

Um clip-abraço
:)Pos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pablo César escreveu:MALIGNO, não seria conveniente separar estas novas funções de comunicação em uma outra biblioteca ou aplicativo, por assim dizer ?.
Que diferença faria?
Nessa nova função ou aplicativo de verificar somente se está conectado a INTERNET. O maior problema e o tempo de retorno (mesmo com TIMEOUT definido) parece ser um problema até do próprio PING que é o mais simples para esta questão que também demora quando está DESCONECTADO.
Mas se você definir um TIMEOUT acabou o problema da espera prolongada, não é? :)
Seria possível, talvez em linguagem de baixo nível (e sei que você manja) verificar se o modem está com a porta aberta ?. Acho que deve funcionar para modems de dial-up mas não entanto não sei como seria em modems DSL.
Tem uma API do Windows chamada RAS (Remote Access Service) através do qual posso não só saber qual conexão está ativa como até mesmo forçar uma desconexão. Isso vale para qualquer tipo de modem. Eu até poderia usá-la porque já fiz um programa há alguns meses pra testar. Mas ainda prefiro usar o U2F, até porque eu quero usá-lo para download. Afinal de contas, o download pode falhar. Se o servidor estiver down e não houver um timeOut definido pra isso também, o problema da demora continuará. Portanto, são aplicações diferentes que têm o mesmo problema. Portanto, não convém separar as soluções.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Conforme eu havia comentado há alguns dias, estava desenvolvendo um recurso que fosse uma alternativa menos limitada ao utilitário U2F. Depois de pesquisar e procurar pelas melhores alternativas, conclui o trabalho e incorporei o novo recurso ao WAPI, que já está disponível para download.

Eis uma relação atualizada dos switches que fazer parte do WAPI. O que está em asterísco é o novo recurso. Por meio dele pode-se fazer exatamente o que o U2F fazia: baixar arquivos pela Internet. Mas há duas vantagens: como eu troquei a API do ActiveX por outra melhor, pude desenvolver um código mais controlado, o que me permitiu desligar o cachê, que sempre foi uma coisa problemática no U2F. A segunda vantagem é que agora pode-se definir um TimeOut para forçar um retorno após certo tempo sem tráfego.

Código: Selecionar todos

  -DELETEREGISTRY:<fullKeyPath>;<entryName>;<resultFile>
  -FLASH:<times>[;<handle>]
  -GETAPPSINFO:<resultFile>
  -GETCLIPBOARD:<resultFile>
  -GETDEFPRINTER:<resultFile>
  -GETHDINFO:<resultFile>
  -GETMYHANDLE:<resultFile>
  -GETPRINTERS:<resultFile>
  -GETWINDOWSINFO:<resultFile>
  -HIBERNATE
  -PLAYWAVE:<source>
  -POWEROFF
  -PRINT:<printerName>;<inputFile>;<reportTitle>;<resultFile>
  -READREGISTRY:<fullKeyPath>;<entryName>;<resultFile>
  -REBOOT
  -SETAPPTITLE:<title>
  -SETBUTTONX:<on|off|del>
  -SETCLIPBOARD:<valueType>;<value>;<resultFile>
  -SETSTARTBUTTON:<hide|show|disable|enable>
  -SETTASKBUTTON:<hide|show>[;<handle>]
  -SUSPEND
* -URL2FILE:<URL>;<fileName>;<timeOut>;<resultFile>
  -WRITEREGISTRY:<fullKeyPath>;<entryName>;<valueType>;<value>;<resultFile>
Também foram adicionadas à biblioteca WAPI duas funções pra abstrair o acesso ao novo recurso: DLoadFile() e IsInternet().

Há alguns dias estava discutindo com alguns colegas algumas idéias a respeito de atualização de programa via Internet. O elo que faltava era justamente uma função que pudesse fazer teste de conexão e download com um pouco mais de controle do que a U2F proporcionava. Agora já é possível.

Claro que, uma vez que há um meio de baixar arquivos, é bem possível também interagir com servidor por meio de alguns scripts. Quem tem site, naturalmente tem acesso a isso. Uma utilidade para o novo recurso é justamente a proteção de um software, seja para validar uma licença ou mesmo renová-la, principalmente para quem aluga software. Eu próprio fiz um teste simples para obter a data do server para comparar com a data do sistema e saber se houve alguma alteração indevida. O script PHP abaixo me retorna um texto com a data e hora no formato DDMMYYYY;hh:mm:ss.

Código: Selecionar todos

<?php echo(date("Ymd;His")); ?>
O programa XBase abaixo recupera e mostra essa data e hora, caso seja detectada uma conexão.

Código: Selecionar todos

clear
set date british
set century off
*
if IsInternet()
   cSrv := "buzinello.com"
   cRet := ""
   if DLoadFile("www."+cSrv+"/servertime.php",@cRet)
      ? "No servidor " + cSrv + ":"
      ? "--------------------------"
      ? "Date: " + DtoC(StoD(Left(cRet,8)))
      ? "Time: " + Transf(Right(cRet,6),"@R 99:99:99")
   else
      ? "ERRO desconhecido!"
   end
else
   ? "ERRO: desconectado ou bloqueado pelo firewall!"
end
?
A partir disso é fácil imaginar que novos tipos de controles poderão ser feitos para atender a demanda nessa área. Basta baixar a saída do script (seja de que tipo for: HTML, texto, etc), cujos parâmetros podem ser passados na URL. Podem ser executadas tarefas das mais diversas: conversões, cálculos, pesquisas em MySQL, etc. Tudo parametrizado na própria URL. A imaginação é o limite. :)

O README.TXT, que acompanha o ZIP contém, contém descrições mais detalhadas. Aconselho sua leitura, assim como a leitura dos fontes das funções de abstração.

Link para download: http://buzinello.com/download/wapi.zip

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pessoal,

Eu uso uma solução muito mais simples (e que tb funciona!) para evitar 2 instâncias do mesmo programa: logo no inicio, faço ele abrir um determinado arquivo TXT com o FOPEN(), em modo exclusivo. Se o FOPEN() retorna .T., deixo o programa continuar. Se o FOPEN() retorna .F., é sinal que ele já tá rodando em outra janela, então QUITo essa 2a. instância e mando uma mensagem pro usuário checar a barra de tarefas...

Na saída do programa, não precisa nem fechar o tal arquivo TXT, o Clipper cuida disso. E, mesmo que por exemplo falte energia durante a execução do programa, não tem problema: quando ela voltar, o arquivo TXT vai estar lá disponível para ser aberto novamente em modo exclusivo.

Eolo
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem por Poka »

Prezado Eolo


Voce poderia colocar um exemplo como voce faz para abrir um arquivo exclusivo com FOPEN(), e retornar .T. ou .F.
Eu utilizo funcoes de baixo nivel em algumas rotinas, mas nao consegui colocar o seu exemplo. O que me interessou, é que mesmo faltando energia, esse esquema dá certo.

Obrigado

Poka.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Poka,
A seguir, como eu uso (adaptado).
Eolo

Código: Selecionar todos

arq="c:\aberto.eol" // pode ser .txt, .abc, .qq extensão
* cria arquivo se ele não existir...
if !file(arq)
  arqh=fcreate(arq,0)
  if !arqh>0
    clear
    @10,10 say "Erro ao Iniciar Acesso"
    inkey(5)
    quit
  endi
  txt="Qualquer coisa"
  * grava qq coisa nele...
  txt_t=fwrite(arqh,txt)
  if !txt_t=len(txt)
    @10,10 say "Erro ao Registrar Acesso"
    inkey(5)
    quit
  endi
  fclose(arqh)
endi
* arquivo existe, abre exclusivo...
janela2=fopen(arq,18)
if !janela2>0
  clear
  @10,10 say "Programa aberto EM OUTRA JANELA"
  @12,10 say "Verifique a BARRA DE TAREFAS"
  inkey(5)
  quit
endi
rele arq, arqh, janela2, txt, txt_t
* neste ponto, passou...
* e, se passou, continua a execução normal do prg..
* ...
Editado pela última vez por Eolo em 25 Mar 2007 13:45, em um total de 1 vez.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Poka,

Complementando: quando vc usa o FOPEN() e dá certo, ele retorna o número do "file handle". Se der pau, ele retorna -1. Então, se a 2a. instância tentar bloquear um arquivo que já está bloqueado, o FOPEN() retorna -1, o que quer dizer que já foi bloqueado antes.

Cara, esse esquema é tão simples que dá até "raiva"...

Eolo
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MULTI SESSÃO

Mensagem por Pablo César »

Caro colega Eolo,

Confesso que estou surpreso com a sua NOVA solução através do FOPEN.
Funcionou beleza, testei de todas as formas possíveis e deu certo em TODAS (até agora). Foi uma solução bem prática e o seu resultado é IMEDIATO. Mas me permita, fazer algumas observações.

Este assunto, como já disseram os colegas em outros tópicos, já foi discutido INÚMERAS vezes. Eu lembro que abrí há muito tempo atrás (antes deste novo sistema gerenciador de FORUM) e lembro que a solução apresentada era ctambém muito similar ao seu, mas apresentava falhas. O MALIGNO, inclusivo foi uns dos primeiros a apresentar essa solução com FOPEN também. Pareceria que este assunto não tem vínculo algum com WAPI se não fosse que o WAPI apresenta outra solução muito mais aprimorada com a função -GETAPPSINFO. E inclusive, veja neste tópico aborda este mesmo assunto: https://pctoledo.org/forum/viewto ... pen+sessao

Esta ultima solução por você apresentada é boa, mas não seria a mais apropriada para os casos de terminais burros (existem casos, como menciona o colega) que não possuem HD.

Também existe outro porém, que no meu caso não resolveria a sua solução apresentada. Como eu ja disse em muitos casos. O meu sistema é MODULAR, isto é, tenho vários executáveis que compõe o sistema. Isto é, tenho um arquivo em lote, que chama um menu.exe que devolve errorlevel e dentro da BATCH chama os executáveis de acordo a opção do menu (isto é, de acordo com o errorlevel passado).

Eu tinha optado, já anteriormente por um aplicativo que verificava assim como o WAPI faz hoje, o nome da sessão aberta. Mas confesso que as vezes, meu aplicativo com WAPI, falha. Não sei ainda o por quê. Talvez haja algum furo no meu aplicativo que verifica o nome da sessão se foi aberta anteriormente já percebí que em várias ocasiões, deixa abrir MULTIPLAS SESSÕES.

Em outras palavras, a solução (vamos dizer) re-apresentada, é boa, é prática mas não é completa para todos os casos.

Aguardo comentários. Eu verificarei se será possível utilizar a sua idéia juntamente com a do MALIGNO, para o meu caso. Caso consiga, postarei aqui o que fiz. Mas parece, que não é tudo 100%. Mas mesmo assim, fico com a função do WAPI -GETAPPSINFO).

Um clip-abraço :)Pos
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Poka,

a) para o terminal burro, sem HD, é só trocar
arq="c:\aberto.eol" por
arq="\\servidor\prg\aberto.eol"
pra fazer o arquivo de controle ser criado no servidor.

(aliás, é o que eu uso: no contrato com meus clientes, o EXE não pode ser executado 2 vezes simultaneamente dentro da rede)

b) vc usa um BAT mas, na realidade, quer é controlar cada EXE, certo? Ora, é só criar um arquivo "eol" para cada um: o modulo1.exe abre o modulo1.eol em modo exclusivo, o modulo2.exe abre o modulo2.eol, e assim por diante... Não vai acontecer do mesmo módulo ser aberto em 2 janelas.

Aliás, dá pra montar isso de inúmeras formas. Se, por exemplo, vc tem o programa.exe no servidor e quer limitar o uso dele a 3 acessos simultâneos, é só criar o acesso1, acesso2 e acesso3.eol, e fazer com que o programa tente bloquear um dos três... O quarto usuário vai dançar.

Eu tb já tentei uma série de outras soluções, mas esta foi a mais simples que encontrei. E que funciona em 100% dos casos de controle de acesso.

Eolo
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem por Poka »

Eolo

Testei aqui em casa e deu certo, eu ja gravo todos os meus arquivos no servidor , inclusive o executavel, entao acredito que não terá problemas.

O comando Fopen aceita como abertura

0 somente leitura
1 gravacao
2 leitura e gravacao

porque fopen(ar,18) ?

testei com 0 -> não dá certo
1 e 2 tambem dá certo
Porque voce colocou 18 ?


Um abraço.

Poka
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Não é que você tem razão... sim admito, tens razão ! Muito bom!

Sim... vai dar trabalho e vai criar um monte de arquivinhos.... hehe Mas é aplicável e pelo visto MAIS SIMPLES.

Parabéns, você tem razão. É 100% !.

Mas... pohhh, são tantos os executáveis.... (no meu caso mais de 200)
Também... quem manda fazer o sistema tipo MODULAR... kakakaka Não que nada, graças a isso, consigo que meu sistema seja híbrido com aplicativos GUI sem me importar com o tamanho, nem memória, nem modo protegido, nem nada e me permite que possa fazer manutenção em forma OBJETIVA ou digamos seletiva. Não sei ainda se irei adotar... Mas merece crédito a sua idéia.

Mesmo que eu altere todos os EXE e pegando o seu nome (executável), poderia criar com o mesmo nome porém com extensão .EOL (digamos) e em diretório TEMP (assim, não bagunça tanto de arquivos de semáforos).

Embora o aplicativo que tinha feito pelo WAPI, me mostra piscando a sessão minimizada quando abria duas vezes. Claro que poderia utilizar ambos recursos simultaneamente, também.

Valeu EOLO, matou mesmo !. :|< :)Pos

Também não posso deixar de agradecer aqui mais uma vez ao prezado colega MALIGNO, que elaborou uma função para atender esta demanda, reconhecendo o seu esforço e paciência conosco. No entanto, a função GETAPPSINFO, poderá também ser muito útil para outras finalidades, como por exemplo: capturar os nomes de todas as sessões abertas e solicitar ao usuário fechar tal aplicação. E sabe, que usuário adora abrir e abrir janelas...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Pablo e Poka,

Caras, a coisa é simples e funciona mesmo!


Uma curiosidade (Poka): por que vc usa um arquivo batch pra rodar o seu sistema ao invés de deixar tudo dentro de um EXE só? Se é porque tava dando estouro de memória, talvez uma saída seja fazer como eu faço: overlays internos. Eu forço a compilação e linkedição em módulos pequenos, OVERLAYados, o EXE pode ter 2Mb, mas roda até em P1 com 32 de RAM...

Parece que o Blinker (por ex) já cria overlays dinâmicos, mas eu forço os overlays em meus programas (assim consigo inclusive modular melhor a coisa, separar os procedimentos para facilitar a manutenção), deixando no módulo principal só o menu e as funções que são usadas pelos overlays. "Manias" da época do Summer '87 e dos 386 da vida...

O cliente X não quer mais o módulo Y? É só desabilitar ele no menu com um asterisco...


Quanto aos retornos do FOPEN(), os que vc citou são para não-rede. Dá uma olhada no NG. O 18 quer dizer 2 (abrir leitura e gravação) + 16 (modo exclusivo em rede).


Eolo
Responder