Ir para conteúdo
Fórum Script Brasil
  • 0

Impressão Api


Vader

Pergunta

Olá pessoal, venho novamente com dúvidas em relação as API de impressão.

Peço desculpas, porque este deve ser o terceiro tópico.... todos os outros já foram respondidos e consegui executar a dúvida em questão.

Está aqui acredito ser minha última dúvida (espero)....

Pois bem. Tenho um programa, que quando executado verifica se há trabalho na fila de impressão (EnumJob) e retorna o resultado. O meu problema aqui é, descobrir que usuário é que está enviando este documento (caso a impressora esteja compartilhada!).

Tenho algumas apis que fazem isto e está funcionando..... mas antes que me xinguem... isto está com um problema... toda vez que executo (sem fechar o programa) ele vai alocando mais memória... sem fim....

Na verdade este programa é uma bomba por enquanto.... e precisaria resolver isto...

Abaixo posto o código que estou usando.... se houver uma forma de liberar a memória usando este mesmo code seria legal.... mas se tiver outro código também está valendo....

No código eu discrimino onde ele aloca a memória, mas realmente não sei o que fazer para liberar...

Desde já agradeço a paciência de vocês... espero um dia chegar a nível de poder ajudar a responder mais do que perguntar.....

Private Declare Sub CopyMem Lib "kernel32.dll" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Declare Function lstrlenW Lib "kernel32.dll" (ByVal lpString As Long) As Long

Private Declare Function HeapAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GetProcessHeap Lib "kernel32.dll" () As Long
Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long



'É exatamente aqui que está o problema
'Allocate the Buffer
        TempBuff = HeapAlloc(GetProcessHeap(), 0, pcbNeeded)
        ret = EnumJobs(hPrinter, 0, 127, 1, TempBuff, pcbNeeded, pcbNeeded, pcReturned)
        CopyMem Jobs(0), ByVal TempBuff, pcbNeeded

obs.: Só abusando, se houver uma forma de obter também o número de páginas a ser impresso, seria perfeito, mas não é a prioridade não!!!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0
Guest Visitante

Olá Gray, tudo bom?

Cara eu vi seu post, pesquisei e testei... e imagina não funcionou.... a baixo coloco meus codes.... será que to fazendo algo errado?

No próprimo site AllApi eu peguei um exemplo de liveração, do HeapFree e nada!!! Se souber e puder me ajudar eu agradeço!!!!

Abraços.

Private Declare Sub CopyMem Lib "kernel32.dll" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Private Declare Function lstrlenW Lib "kernel32.dll" (ByVal lpString As Long) As Long

Private Declare Function HeapAlloc Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GetProcessHeap Lib "kernel32.dll" () As Long
Private Declare Function HeapFree Lib "kernel32.dll" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long



'É exatamente aqui que está o problema
'Allocate the Buffer
        TempBuff = HeapAlloc(GetProcessHeap(), 0, pcbNeeded)
        ret = EnumJobs(hPrinter, 0, 127, 1, TempBuff, pcbNeeded, pcbNeeded, pcReturned)
        CopyMem Jobs(0), ByVal TempBuff, pcbNeeded
E para liberação
If TempBuff Then HeapFree GetProcessHeap(), 0, TempBuff

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, acredito que cada vez que você chama GetProcessHeap() você pega uma pilha de processos *nova*, portanto você está pegando pilhas diferentes quando cria e quando libera. Acredito que você deveria fazer algo assim:

hHeap = GetProcessHeap()
TempBuff = HeapAlloc(hHeap, 0, pcbNeeded)
ret = EnumJobs(hPrinter, 0, 127, 1, TempBuff, pcbNeeded, pcbNeeded, pcReturned)
CopyMem Jobs(0), ByVal TempBuff, pcbNeeded
...
If TempBuff Then HeapFree(hHeap, 0, TempBuff)

Note que o mesmo hHeap que é passado para a alocação e passado para a desalocação. Acredito que isso não acontecia no seu código, uma vez que você chamava GetProcessHeap() duas vezes (note que eu chamei apenas uma).

Não testei o código acima, mas acho que deu pra pegar a idéia, né? ;)

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...