AUTOMACAO WORD - COMO MATAR PROCESSO?
Estou usando a classe Microsoft Word 9.0 Object Library para editar documentos .dot via VB. Olhaà a rotina pra alterar os campos de dois documentos distintos (a diferença entre os dois é que o GUIA2 solta uma via a mais do documento, e isso é uma escolha do usuário, via Option2 - se bem que nada disso vem ao caso agora):
O problema é que, apesar de "setar" os dois objetos como "Nothing" ali no final, o processo insiste em ficar na memória. Se eu faço 5 documentos pelo VB e abro os "Programas em Execução", está lá o "Winword" instanciado 5 vezes. Como eu "mato" o processo com eficiência?
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0
Screen.MousePointer = vbHourglass
Me.WindowState = vbMinimized
Dim queoption As Byte
queoption = 0
If Form1.Option2(1).Value = True Then queoption = 1
Dim divid
Dim aux As Byte
Dim objWord As New Word.Application, objDoc As Word.Document
If queoption = 0 Then
Set objDoc = objWord.Documents.Add(ondetah & "\Modelos\GUIA.dot")
Else
Set objDoc = objWord.Documents.Add(ondetah & "\Modelos\GUIA2.dot")
End If
divid = Split("data#do#ao#func#ult", "#")
For aux = 0 To 4 'são 5 os pedaços que formam divid
For qqu = 1 To 3 + queoption
objDoc.FormFields("guia" & qqu & divid(aux)).Range = Campo(aux).Text
Next
Next
For aux = 1 To 14
For qqu = 1 To 3 + queoption
objDoc.FormFields("guia" & qqu & "seq" & aux).Range = Seq(aux - 1).Text
objDoc.FormFields("guia" & qqu & "inter" & aux).Range = Interes(aux - 1).Text
objDoc.FormFields("guia" & qqu & "ass" & aux).Range = Assunto(aux - 1).Text
objDoc.FormFields("guia" & qqu & "proc" & aux).Range = Proc(aux - 1).Text
Next
Next
' objWord.Visible = True
objWord.ActiveDocument.PrintOut
objWord.ActiveDocument.Close (False)
Set objDoc = Nothing
Set objWord = Nothing
Screen.MousePointer = vbNormal
Case 1
Unload Me
End Select
End Sub
O problema é que, apesar de "setar" os dois objetos como "Nothing" ali no final, o processo insiste em ficar na memória. Se eu faço 5 documentos pelo VB e abro os "Programas em Execução", está lá o "Winword" instanciado 5 vezes. Como eu "mato" o processo com eficiência?
Tio..max... quem sou eu.. pra dar pitaco....
Mas faço exatamente como vc....
Fecho o OBJETO pra depois dar o NOTHING... E no meu o processo é finalizado...
Agora...
Não seria
Mas faço exatamente como vc....
Fecho o OBJETO pra depois dar o NOTHING... E no meu o processo é finalizado...
Agora...
Não seria
objWord.ActiveDocument.Close (True)
Já usei esse CODIGO postado pelo JOSE.NIZ:
Com código abaixo (função CloseProcess) é possivel encerrar um processo aberto... Use esse exemplo como modelo e você poderá listar os outros processos ativos.
Com código abaixo (função CloseProcess) é possivel encerrar um processo aberto... Use esse exemplo como modelo e você poderá listar os outros processos ativos.
Option Explicit
Public Const TH32CS_SNAPPROCESS As Long = 2&
Public Const MAX_PATH As Long = 260
Public Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
(ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" _
Alias "Process32First" _
(ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" _
Alias "Process32Next" _
(ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Public Declare Sub CloseHandle Lib "kernel32" _
(ByVal hPass As Long)
Public Function CloseProcess(EXEName As String) As Boolean
Dim hSnapShot As Long
Dim uProcess As PROCESSENTRY32
Dim hProcess As Long
CloseProcess = False
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
If hSnapShot = -1 Then Exit Function
uProcess.dwSize = Len(uProcess)
If ProcessFirst(hSnapShot, uProcess) = 1 Then
Do
If LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, vbNullChar) - 1)) = LCase$(EXEName) Then
hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
CloseProcess = TerminateProcess(hProcess, ByVal 0&) > 0
Exit Do
End If
Loop While ProcessNext(hSnapShot, uProcess)
End If
Call CloseHandle(hSnapShot)
End Function
Meu caro Max, não precisa se preocupar em matar ninguém, você anda com o instinto assassino em alta !
Simplesmente dê um quit na instà ¢ncia criada, este é o seu problema, veja abaixo esse teste...
Lembrem-se de fechar o tópico caso esteja ok.
Simplesmente dê um quit na instà ¢ncia criada, este é o seu problema, veja abaixo esse teste...
Lembrem-se de fechar o tópico caso esteja ok.
Sub Teste()
Dim NW As New Word.Application
Dim ND As New Word.Document
Dim NP As Word.Paragraph
NW.Visible = True
Set ND = NW.Documents.Add
NW.Quit
Set NW = Nothing
End Sub
Tio Max eu uso o word com o vb já a algum tempo e se vc quiser que eu passe a classe que criei para usar esta facilidade é só me adicionar no msn ou me enviar um e-mail, só não a posto aki, pois ela é muito grande
Citação:
só não a posto aki, pois ela é muito grande
Dnevony,
Manda o arquivo para o servidor ué...
Voce pode fazer isso
Bom.
Primeiro, Cunha, o .Quit não resolveu. Ainda continuo instanciando Winwords de monte.
Germanir:
Estou usando modelos de documento (.dot). Eu carrego os dados, imprimo e não salvo nada. Então é (False) mesmo. Mas, já que você levantou a lebre, vou fazer uns testes com .doc e com (True). Depois eu digo no que deu.
Dnevony:
Independente da sugestão do Cunha, o abelhão, vou lhe enviar um e-mail e fico aguardando sua resposta.
Primeiro, Cunha, o .Quit não resolveu. Ainda continuo instanciando Winwords de monte.
Germanir:
Estou usando modelos de documento (.dot). Eu carrego os dados, imprimo e não salvo nada. Então é (False) mesmo. Mas, já que você levantou a lebre, vou fazer uns testes com .doc e com (True). Depois eu digo no que deu.
Dnevony:
Independente da sugestão do Cunha, o abelhão, vou lhe enviar um e-mail e fico aguardando sua resposta.
Max,
O "quit" deve ser antes do "nothing", conforme tá no exemplo do WebMaster. De outra maneira não fecha o aplicativo mesmo!
O "quit" deve ser antes do "nothing", conforme tá no exemplo do WebMaster. De outra maneira não fecha o aplicativo mesmo!
MaxMummy
Boa Tarde
Uma pergunta, estes seus Documentos .DOT (modelo) tem algum tipo de Imagem?
Se não tiver, por que não usa o RichTextBox e automatiza via campos e replace?
[s50]
** Os Documentos deveriam, neste caso, ser .RTF, mas amplamente suportados por Editores de Texto.
Boa Tarde
Uma pergunta, estes seus Documentos .DOT (modelo) tem algum tipo de Imagem?
Se não tiver, por que não usa o RichTextBox e automatiza via campos e replace?
[s50]
** Os Documentos deveriam, neste caso, ser .RTF, mas amplamente suportados por Editores de Texto.
MaxMummy
Se não der certo, sugiro que faça a "Rotina" abaixo:
[S28] Processo
Deve resolver!
[s41]
Se não der certo, sugiro que faça a "Rotina" abaixo:
[S28] Processo
Deve resolver!
[s41]
é. Fiz uns testes e o raio do Winword continua lá na memória, firmão.
Se coloco o .Quit antes do Nothing, a máquina reclama que ainda não imprimiu o documento, e não tem DoEvents que resolva.
Kpella,
Esse projeto estava engavetado desde 2003. Como sempre, por motivos polÃticos. Mas agora a maré mudou e meu chefe me deu uma semana pra colocá-lo na rede. O documento tem o brasão da cidade, mas isso não é problema, pois dá pra montar um documento idêntico no Data Report (é... Tio Max usa o DR toscão). O problema é que não queria perder tempo com isso, já que tem ainda um monte de coisa pra fazer antes de começar a fazer os testes (na quinta!!!).
E ainda tem a opção de arrancar o Winword na marra, como o Germanir sugeriu. Mas queria uma solução mais racional. Não consigo a sequência que o JCharles apontou, então deve haver alguma coisa me empatando a impressão antes do fechamento. Vou verificar.
Se coloco o .Quit antes do Nothing, a máquina reclama que ainda não imprimiu o documento, e não tem DoEvents que resolva.
Kpella,
Esse projeto estava engavetado desde 2003. Como sempre, por motivos polÃticos. Mas agora a maré mudou e meu chefe me deu uma semana pra colocá-lo na rede. O documento tem o brasão da cidade, mas isso não é problema, pois dá pra montar um documento idêntico no Data Report (é... Tio Max usa o DR toscão). O problema é que não queria perder tempo com isso, já que tem ainda um monte de coisa pra fazer antes de começar a fazer os testes (na quinta!!!).
E ainda tem a opção de arrancar o Winword na marra, como o Germanir sugeriu. Mas queria uma solução mais racional. Não consigo a sequência que o JCharles apontou, então deve haver alguma coisa me empatando a impressão antes do fechamento. Vou verificar.
Tópico encerrado , respostas não são mais permitidas