Página 3 de 7
Set device to printer
Enviado: 29 Nov 2015 01:27
por microvolution
Prezado Itamar e demais companheiros...
volto aqui novamente para pedir socorro, pois, como já disse, no meu único cliente que me paga mensalmente, instalamos recentemente na sua rede WIN SERVER 2003 uma estação com WIN 7 e aí as impressões (mesmo em LPT1) alguma coisa dá problema.
Numa rotina que tenho para imprimir recibo que modifiquei para que a impressão vá toda para o arquivo e depois ela é impressa por um simples comando "RUN TYPE arquivo.PRN > PRN" tá me causando uma enorme dor de cabeça, pois não está sendo criado o arquivo.PRN no win 7 no momento do SET DEVICE TO PRINTER e SET PRINTER TO arquivo.PRN.
Nas máquinas com win xp tá tudo certo.
Então, fuçando aqui novamente, estou tentando compilar os exemplos da pasta contrib\hbwin\tests.
Lembrando que não sei e não tenho mais cabeça para entender como compilar no "secão" diretamente pelo HARBOUR (3.2 bruto), eu uso é IDE HMG 3.0.35 ou 3.0.46, mas, uso mais mesmo é a .35.
Então o PRN1.PRG já compilei e testei, agora estou no PRN2.PRG, e na HMG 3.0.35 o #REQUIRE "HBWIN" não funciona e aí modifiquei-o para #INCLUDE 'HBWIN.CH', e em configuração coloquei "addtional libs" HBWIN.
O erro é este:
Código: Selecionar todos
hbmk2: Processando script local: hbmk.hbm
hbmk2: Processando arquivo de configura‡Æo:
C:\MVinfo\hmg.3.0.46\hmg.3.0.35\harbour\bin\hbmk.cfg
hbmk2: Processando: prn1.hbc
hbmk2: Processando: prn2.hbc
hbmk2: Processando: prn3.hbc
hbmk2: Processando: prn4.hbc
hbmk2: Erro: Abrindo: hbwin.hbc
hbmk2: Linkando... prn2.exe
.hbmk\win\mingw\prn2.o:prn2.c:(.data+0x188): undefined reference to `HB_FUN_HB_FNAMEEXTSET'
collect2: ld returned 1 exit status
hbmk2: Erro: Executando linkeditor. 1
gcc.exe .hbmk\win\mingw\prn2.o _temp.o -mconsole -Wl,--start-group -lhbwin -lHBWIN -lhmg -lhbmysql -lmysql -lcrypt -ledit -leditex -lgraph -lini -lreport -lhbwin -lhbziparc -lhbmzip -lmsvfw32 -lvfw32 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbvpdf -lhbmemio -lhbsqlit3 -lsqlite3 -lhbfimage -lhbpgsql -lpq -lhbtip -lhbct -lhbmisc -lhbnetio -lxhb -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oprn2.exe -LC:/MVinfo/hmg.3.0.46/hmg.3.0.35/harbour/lib -LC:/MVinfo/hmg.3.0.46/hmg.3.0.35//lib -LC:/MVinfo/hb32/contrib/hbwin/tests/
Bom, peço, que me ajudem a entender esse "troço" WINPRN e seus companheiros, para que eu mude aos poucos meu sistema para somente o mais moderno possível. Por enquanto quero tentar é na rotina de BAIXAR prestações, como já falei, mas, tem que funcionar tanto em WIN XP como WIN 7, 8, 10, além do sistema entender se a impressora padrão é uma LPT ou USB que ainda no XP uso o DOSPRN, mas, no win 7 ou 10 (neste computador aqui) não captura LPT mesmo.
Aguardo mais informações.
Set device to printer
Enviado: 29 Nov 2015 09:39
por ANDRIL
O erro de gravação ocorre no WIN7 ou Superiores devido o controle de permissões nas pastas. Quando se direcionar um TYPE para LPTx, PRN o sistema operacional tem que criar um arquivo e nesse momento ocorre o erro de acesso negado, embora não tenha especificado aqui o erro.
Tente dar permissão TOTAL para o usuário "TODOS" na pasta do C:\WINDOWS\SYSTEM32\SPOOL\PRINTERS. Para isso ache a pasta PRINTERS, com botão direito do mouse, vá em PROPRIEDADES, aba SEGURANÇA. Clique em EDITAR, em seguida ADICIONAR. Crie o usuário "TODOS" e atribua acesso a ele, principalmente o GRAVAR.
Boa sorte!
Set device to printer
Enviado: 29 Nov 2015 13:13
por microvolution
Andril
Tente dar permissão TOTAL para o usuário "TODOS" na pasta do C:\WINDOWS\SYSTEM32\SPOOL\PRINTERS. Para isso ache a pasta PRINTERS, com botão direito do mouse, vá em PROPRIEDADES, aba SEGURANÇA. Clique em EDITAR, em seguida ADICIONAR. Crie o usuário "TODOS" e atribua acesso a ele, principalmente o GRAVAR.
Prezado professor, já incluí o que V.Sa. me pediu, mas, antes de compilar e testar, fiquei curioso com o fato do usuário TODOS.
Primeiro, quando digitei o nome na caixa e dei ok ele já me ofereceu o tal usuário, isso significa que ele já existia?
segundo, qual diferença dele (usuário Todos) para o usuário SISTEMA e o usuário USUÁRIOS? pergunto não em relação aos nomes deles nem suas atribuições, mas, na funcionalidade deles e seu comportamento dentro do Windows?
outra coisa, me parece que o SET PRINTER TO [nome do arquivo.PRN] ADDITIVE não está gravando aqui no Windows 10, pois lá no campo (cliente) grava perfeitamente, e, olha que aqui nesta máquina o usuário é o administrador que sou eu, com todos os privilégios que um administrador possui.
Me parece Andril, que tens grandes conhecimentos em impressões, bom, sei que não é o tópico, mas, é dentro do assunto de impressão, eu, preciso eliminar esses SET PRINTER TO para que o meu próprio sistema reconheça se tem impressora LPTx ou USB e imprima como se fosse uma matricial em USB ou literalmente matricial LPTx sem muita burocracia. V.Sa. consegue me ajudar, pois só consegui migrar de clipper para harbour através da HMG 3.0xx no início deste 2015; então, ainda nem aprendi a andar...
Bom, agora sim, vou aplicar os testes, por enquanto... "gracias"!
Leia a Bíblia, Amós 4:8.
Set device to printer
Enviado: 29 Nov 2015 13:59
por asimoes
Faz este teste:
O windows do meu notebook é o 10 e funciona sem problemas.
Código: Selecionar todos
cArqPrint:="c:\temp\arquivo.prn"
SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO &cArqPrint.
SET PRINT ON
? Time()
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
Set device to printer
Enviado: 29 Nov 2015 14:47
por microvolution
Prezado Professor
Assimões funcionou perfeitamente.
O estranho é que no meu cliente onde está com win 7 está gerando o arquivo com o código do jeito que tenho aqui no laboratório. Comecei a alterar somente para poder imprimir o arquivo que foi gerado através do SET PRINT TO ARQUIVO.PRN e em seguida excluí-lo.
Os comandos que uso são:
Código: Selecionar todos
set device to printer
set printer to &CLI..PRN ADDITIVE
// set printer to &DIR.\TEMP\&CLI..PRN ADDITIVE // não deu certo.
após parte do código acima, que gera o arquivo CLI.PRN, ou melhor gera o arquivo com o conteúdo da variável
CLI, no caso do teste é o número/código do cliente, que aqui no laboratório é o cliente 1.PRN.
Então, como disse, no windows 7 do cliente está sendo criado este arquivo perfeitamente, só que aqui no meu windows 10, por algum motivo o arquivo não está sendo gerado.
Como já disse, lá no cliente, o arquivo cria, mas, o uso do RUN TYPE 1.PRN (RUN TYPE &CLI.PRN) e em seguida o seu respectivo DEL não está funcionando.
Agora para eu testar, as funções de adaptação no meu windows 10 não está nem gerando o &CLI.PRN.
As linhas sugeridas pelo prezado TOLEDO são:
Código: Selecionar todos
hb_run ("type "+CLI+".PRN>prn")
hb_run ("del "+CLI+".PRN>prn")
nem alterando para desta forma não funcionou, pois não existe o arquivo com o conteúdo da variável &CLI.PRN:
Código: Selecionar todos
hb_run ("type "+&CLI.+".PRN>prn")
hb_run ("del "+&CLI.+".PRN>prn")
bom o que faço professor?
Set device to printer
Enviado: 29 Nov 2015 15:03
por asimoes
No windows 10 você nã vai conseguir imprimir desta forma,
Veja se ajuda esta informação:
http://www.technipages.com/send-prn-file-to-printer
Set device to printer
Enviado: 29 Nov 2015 15:34
por microvolution
Prezado Assimões e demais, mas, pelo menos o arquivo deveria ser gerado e isso não está acontecendo.
Ok?
O que pode estar errado?
Set device to printer
Enviado: 29 Nov 2015 15:39
por asimoes
O teste abaixo no windows 10 cria o arquivo teste na pasta c:\temp
e no final da impressão ele é deletado.
É esta operação que o seu sistema deve fazer?
Como eu disse este teste eu fiz no meu notebook com windows 10
Código: Selecionar todos
FUNCTION MAIN()
PRIVATE nPagina, i
cArqPrint:="c:\temp\teste.prn"
For i:=1 to 1
SET CONSOLE OFF
SET DEVICE TO PRINT
SET PRINTER TO &cArqPrint.
SET PRINT ON
SetPrc(0,0)
for j:=1 to 56
@ PRow()+1,001 SAY "Passo: " +hb_nTos(i) +" - "+StrZero(j,4)
If Mod(j,40) = 0
EJECT
Endif
next
EJECT
DesligaImp()
fErase(cArqPrint)
Next
RETURN Nil
FUNCTION DesligaImp
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
RETURN Nil
Set device to printer
Enviado: 29 Nov 2015 19:42
por ANDRIL
microvolution escreveu:qual diferença dele (usuário Todos) para o usuário SISTEMA e o usuário USUÁRIOS?
Não sei dizer, o que acho é que declarando as permissões para o usuário "Todos" libera acesso quando não esta logado com um usuário específico existente na listagem de usuário. Caso tenha seu usuário na listagem e faça logon com ele, basta atribuir os direitos ao seu usuário.
Me lembrei de um perrengue que passei aqui com SET PRINTER TO. Dei as permissões ao usuário para GRAVAÇÃO e tudo mais, mais sempre ocorria erro de acesso negado, erro de gravação etc.
Quando usava o "TYPE arquivo.txt > LPT2" no prompt funcionava. Quando usava no meu código SET PRINTER TO dava erro. Notem como estava meu código:
Código: Selecionar todos
///////////// DAVA ERRO DE GRAVAÇÃO /////////////////
porta="LPT2"
SET PRINTER TO &porta
Código: Selecionar todos
//////////////DEU CERTO///////////////////
porta="LPT2"
SET PRINTER TO "&porta"
Não sei qual a diferença a nível do sistema, mais funcionou perfeitamente.
Outro teste que podes fazer. Instale os drives da impressora no Windows, Compartilhe a impressora.
No seu sistema coloque:
Código: Selecionar todos
porta="\\NOMEDOPC\NOMEDAIMPRESSORACOMPARTILHADA"
SET PRINTER TO "&porta"
Substitua o NOMEDOPC pelo nome da sua máquina que aparece em REDE. NOMEDAIMPRESSORACOMPARTILHADA pelo nome do compartilhamento que voce atribuiu a sua impressora.
Uso dessa forma e funciona no VISTA, WIN7 e WIN8. Assim não precisa capturar a impressora através do NET USE para uma porta e depois mandar do sistema para esta porta.
Ate+
Set device to printer
Enviado: 29 Nov 2015 20:46
por JoséQuintas
Lembro nos tempos do Clipper de duas situações:
- Dependendo do Windows/Servidor pode ser LPT1 ou LPT1:
- Dependendo da pasta compartilhada, com nome sem ser 8 caracteres, dava erro
Não custa perguntar:
A impressora é na porta paralela?
Lembre-se que pode-se usar PRN pra indicar impressora padrão. (mesmo caso PRN ou PRN:)
Arquivo temporário:
O Harbour tem função pra usar a pasta temporária do Windows, assim elimina problemas de autoridade.
Além disso, desse jeito o temporário fica local, o que elimina problemas de rede.
Set device to printer
Enviado: 29 Nov 2015 22:47
por asimoes
Olá,
Microvolution, uma pergunta: qual é a pasta que você está direcionando a impressão? é na própria pasta onde roda o seu sistema? você pode também criar uma pasta padrão para depósito de arquivos de impressão, na prefeitura onde eu trabalho as imagens do windows 7 tem duas partições c: e d: a unidade c: nenhum usuário tem direito de gravaçao, exclusão, etc. No drive d: que é do usuário eu fiz uma função corporativa que testa se existe a pasta d:\tempimp se não existe (usuário pode apagar por acidente) a pasta é criada pela função que cria arquivos temporários para impressão. Se as estações de usuário do seu cliente só tem uma particição, cria uma pasta para essa finalidade, com tdos os direitos de gravação e direciona a impressão para esta pasta. É somente uma idéia.
Set device to printer
Enviado: 29 Nov 2015 23:04
por JoséQuintas
Sempre tem as soluções práticas também.
Pelo prompt diz que funciona, então, enquanto não encontrar outra solução:
Código: Selecionar todos
Memowrit( "arquivo.bat", ;
"copy arquivo.txt > prn" + HB_EOL() + ;
"exit" + HB_EOL() )
run ( "arquivo.bat" )
fErase( "arquivo.bat" )
fErase( "arquivo.txt" )
Set device to printer
Enviado: 30 Nov 2015 13:29
por microvolution
Microvolution, uma pergunta: qual é a pasta que você está direcionando a impressão? é na própria pasta onde roda o seu sistema?
Prezado
asimoes a resposta é sim.
Bom, vale lembrar que não estou compreendendo o porquê das seguintes situações:
1 - o cliente possui win server 2k3 com estações win 98(*), xp 32 bits e agora instalamos win 7 32 bits.
2 - todas as máquinas win 98 e xp funcionam perfeitamente a questão de criar o arquivo com SET PRINTER TO xxxx.PRN (xxxx é o código do cliente pra não haver confusão com outro cliente, se algum usuário abrir ao mesmo tempo);
3 - há uma única máquina com win 98, pois até o início deste ano (que já está acabando) tínhamos apenas código 100% clipper;
4 - (*) estamos eliminando esta máquin (win 98) e substituindo por uma com win 7 (nova que comprou);
5 - lá no cliente, a máquina com win 7, está criando perfeitamente o arquivo temporário, mas, a impressão não ocorre, mesmo possuindo porta paralela e impressora matricial lx 300 - aliás todas as máquinas possuem suas próprias impressoras lpt1 matriciais e são todas lx 300;
6 - quando fui trazer aqui pro meu laboratório de testes, eu, também tinha uma máquina com win 7 (64 bits), e, em julho deste ano, participei daquele teste gratuito (beta) da microsoft onde instalei gratuita e legalmente uma versão do win 10 (64 bits);
7 - nesta minha máquina é que começou outro problema, do qual não consigo solucionar o que realmente precisa: fazer com que os arquivos criados (conforme item 5 acima) no cliente imprima;
8 - o problema que gerou aqui em minha máquina (não estando em rede alguma) é que o arquivo xxxx.PRN não está sendo criado.
Bom, não sei se expliquei ou se compliquei; apesar de todos os testes que todos aqui me indicaram e terem funcionado, no meu aplicativo que já estava pronto, infelizmente não está imprimindo, ou melhor gerando o arquivo para uma posterior impressão.
Aguardo mais informações...
Set device to printer
Enviado: 30 Nov 2015 13:36
por asimoes
Tem como você trocar a extensão .prn para .txt e ver o que acontece?
Outra coisa tem como você mostrar a parte do código onde gera o arquivo e imprime.
Set device to printer
Enviado: 30 Nov 2015 14:34
por Itamar M. Lins Jr.
Ola!
Não sei se já verificou, mas... o seu antivírus ? Tente com ele desligado.
Saudações,
Itamar M. Lins Jr.