AUTOMACAO WORD - COMO MATAR PROCESSO?

USUARIO.EXCLUIDOS 21/03/2005 17:06:45
#74110
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):

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?
USUARIO.EXCLUIDOS 21/03/2005 17:37:51
#74123
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

objWord.ActiveDocument.Close (True)
USUARIO.EXCLUIDOS 21/03/2005 17:39:47
#74124
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.

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

WEBMASTER 21/03/2005 17:48:15
#74131
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.


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
DNEVONY 22/03/2005 12:01:53
#74254
Resposta escolhida
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
WEBMASTER 22/03/2005 12:31:35
#74258
Citação:


só não a posto aki, pois ela é muito grande



Dnevony,

Manda o arquivo para o servidor ué...
Voce pode fazer isso
USUARIO.EXCLUIDOS 22/03/2005 15:17:21
#74322
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.
JCHARLES 22/03/2005 16:17:27
#74341
Max,

O "quit" deve ser antes do "nothing", conforme tá no exemplo do WebMaster. De outra maneira não fecha o aplicativo mesmo!

LCSD 22/03/2005 16:33:59
#74346
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.
LCSD 22/03/2005 16:37:20
#74348
MaxMummy

Se não der certo, sugiro que faça a "Rotina" abaixo:

[S28] Processo

Deve resolver!
[s41]
USUARIO.EXCLUIDOS 22/03/2005 16:48:05
#74353
é. 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.
Página 1 de 2 [14 registro(s)]
Tópico encerrado , respostas não são mais permitidas