Autor Thema: Word-Dokument aus Notes drucken und schließen  (Gelesen 5350 mal)

Glombi

  • Gast
Word-Dokument aus Notes drucken und schließen
« am: 12.06.04 - 15:20:29 »
Ich möchte per Script ein Worddokument öffnen, drucken und Word danach schließen. Hier mein Ansatz:

Set  OLE_application = CreateObject( "Word.Application" )  
Call OLE_application.documents.add( filePath )  
Set wordDocument =  OLE_application.activedocument
Call wordDocument.PrintOut(True)         'Drucken
Sleep 5              'Warte N Sekunden (sonst wird Word vor Druck geschlossen)
Call wordDocument.Close                         'Word-Dokument schließen
Call OLE_application.Quit()                       'Schließe Word

Ohne das Sleep würde Word sofort geschlossen und es kommt eine Warnmeldung, dass das Dokument nicht gedruckt werden kann.

Wenn ich Call OLE_application.Quit()   nicht aufrufe, bleibt WINWORD als Task in der Taskliste stehen. Das möchte ich nicht.

Frage: Gibt es eine elegantere Möglichkeit, zunächst den Druckauftrag abzusetzen und dann erst Word zu schließen. Zur Zeit behelfe ich mir mit dem Sleep Befehl, der die Ausführung um die angegebenen Sekunden verzögert.

Andreas
« Letzte Änderung: 12.06.04 - 15:21:04 von Glombi »

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #1 am: 12.06.04 - 15:24:03 »
ich habe auch noch keine bessere Lösung gefunden  :D
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #2 am: 12.06.04 - 15:28:46 »
Ulrich, das war mal wieder eine super schnelle Antwort  :D

Welchen Wert nimmst Du denn in der Regel? Ich bin mir nicht so sicher, ob 5 ausreicht.

Andreas
« Letzte Änderung: 12.06.04 - 15:29:56 von Glombi »

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #3 am: 12.06.04 - 15:29:15 »
es sei denn, du fragst irgendwie den Printer Status ab ... Frage des Aufwandes und des Nutzens
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #4 am: 12.06.04 - 15:31:27 »
Andreas: das hängt immer ein wenig davon ab, wie groß die Dokumente sind, die übertagen werden; 5 - 10 sec sollten aber allemal ausreichen.
Ist nicht die elegante Lösung, ich weiß.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #5 am: 12.06.04 - 15:31:33 »
Na, dann lasse ich es erstmal so.

Vielen Dank!
Andreas

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #6 am: 12.06.04 - 15:36:17 »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #7 am: 12.06.04 - 15:45:46 »
In dem Zusammenhang hätte ich noch eine andere Frage:

Der o.g. Code ist nur ein Teil - man soll auch Excel (bereits gelöst) und PDF-Dateien drucken.

Das Drucken von PDF funktioniert so:
ret = Shell("D:\Programme\Adobe\AdobeReader\Reader\AcroRd32.exe /p /h " & filePath, 6)         

Jetzt muss ich noch den Pfad für AcroRd32.exe irgendwie ermitteln - ich denke mal aus der Registry.

Ein kleines Problem habe ich noch: Wie bekomme ich den Task AcroRd32 wieder aus der Taskliste?

Es gibt ja auch den Befehl
Shellid ( program [ , windowStyle ] )
der die Task-ID zurückliefert. Aber wie kann ich den Task in Script schließen?

Andreas
« Letzte Änderung: 12.06.04 - 15:49:56 von Glombi »

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #8 am: 12.06.04 - 15:53:39 »
Zitat
Jetzt muss ich noch den Pfad irgendwie ermitteln - ich denke mal aus der Registry.

welchen Pfad meinst du ??

Zitat
Wie bekomme ich den Task AcroRd32 wieder aus der Taskliste?

Prozesse killen  8) 8) Muss ich mal sehen, ob ich da was fertiges in der Schublade habe; ist aber mit ein bisschen API kein Hexenwerk.

Ulrich
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #9 am: 12.06.04 - 15:57:58 »
OK, hier http://www.andreavb.com/tip020021.html waere was. Ich denke mal , das kannst du problemlos nach Notes umsetzen...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #10 am: 12.06.04 - 16:19:54 »
soo, ich habe es:

Const PROCESS_QUERY_INFORMATION = 1024
Const PROCESS_VM_READ = 16
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Const PROCESS_ALL_ACCESS = &H1F0FFF
Const hNull = 0

Const TH32CS_SNAPPROCESS  = 2&
Const MAX_PATH  = 260

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

Declare Function CreateToolhelpSnapshot Lib "Kernel32.dll" Alias "CreateToolhelp32Snapshot" (Byval lFlags As Long, Byval lProcessID As Long) As Long
Declare Function ProcessFirst Lib "Kernel32.dll" Alias "Process32First" (Byval hSnapShot As Long,uProcess As PROCESSENTRY32) As Long
Declare Function ProcessNext Lib "Kernel32.dll" Alias "Process32Next" (Byval hSnapShot As Long,uProcess As PROCESSENTRY32) As Long
'Declare Sub CloseHandle Lib "Kernel32.dll" (Byval hPass As Long)
Declare Function CloseHandle Lib "Kernel32.dll" (Byval Handle As Long) As Long
Declare Function FindWindow Lib "user32" Alias"FindWindowA" (Byval lpClassName As String, Byval lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (Byval hwnd As Long, Byval wMsg As Long, Byval wParam As Long, lParam As Any) As Long

Const WM_CLOSE = &H10

Declare Function EnumProcesses Lib "psapi.dll"  ( lpidProcess As Long, Byval cb As Long,  cbNeeded As Long) As Long
Declare Function EnumProcessModules Lib "psapi.dll" (Byval hProcess As Long, lphModule As Long, Byval cb As Long, lpcbNeeded As Long) As Long
Declare Function GetModuleFileNameEx Lib "psapi.dll" Alias "GetModuleFileNameExA" (Byval hProcess As Long, Byval hModule As Long, Byval lpFileName As String, Byval nSize As Long) As Long
Declare Function GetModuleFileNameExA Lib "psapi.dll" (Byval hProcess As Long, Byval hModule As Long, Byval strModuleName As String, Byval nSize As Long) As Long
Declare Function GetModuleBaseName Lib "psapi.dll" Alias "GetModuleBaseNameA" (Byval hProcess As Long, Byval hModule As Long, Byval lpBaseName As String, Byval nSize As Long) As Long
Declare Function OpenProcess Lib "kernel32" (Byval dwDesiredAccess As Long, Byval blnheritHandle As Long, Byval dwAppProcessId As Long) As Long
Declare Function TerminateProcess Lib "kernel32" (Byval ApphProcess As Long, Byval uExitCode As Long) As Long

Const VER_PLATFORM_WIN32_NT = 2

Type OSVERSIONINFO
   dwOSVersionInfoSize As Long
   dwMajorVersion As Long
   dwMinorVersion As Long
   dwBuildNumber As Long
   dwPlatformId As Long
   szCSDVersion As String * 128
End Type

Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer


Sub Click(Source As Button)
   Msgbox ProcessRunning("notepad.exe")
End Sub

Function ProcessRunning(Byval Filename As String) As Variant
   If IsWinNT Then ProcessRunning = ProcessRunningNT(FileName): Exit Function
   Dim hSnapShot As Long, uProcess As PROCESSENTRY32, RetVal As Long
   hSnapShot = CreateToolhelpSnapshot(2&, 0&)
   If hSnapShot = 0 Then Exit Function
   uProcess.dwSize = Len(uProcess)
   RetVal = ProcessFirst(hSnapShot, uProcess)
   Do While RetVal <> 0
      If Instr(1,Ucase(uProcess.szExeFile), Ucase(Filename), 0 ) > 0 Then
         ProcessRunning = True
         Exit Function
      End If
      RetVal = ProcessNext(hSnapShot, uProcess)
   Loop
   processRunning = False
   Call CloseHandle(hSnapShot)
End Function

Function WindowsVersion() As String
   tmp = ""      
   Dim OS As OSVERSIONINFO
   Dim ret As Integer
   OS.dwOSVersionInfoSize = 148
   OS.szCSDVersion = Space$(128)
   ret = GetVersionExA( OS )
   
   Select Case OS.dwPlatformId
   Case 1
      Select Case OS.dwMajorVersion
      Case 0: tmp = "Windows 95"
      Case 10: tmp = "Windows 98"
      End Select
   Case 2
      Select Case OS.dwMajorVersion
      Case 3: tmp = "Windows NT 3.51"
      Case 4: tmp = "Windows NT 4.0"
      Case 5 :tmp = "Windows 2000"
      End Select
   Case Else
      tmp = "unknown"
   End Select
   WindowsVersion = tmp
End Function

Function KillApps(strFilePath As String) As Long
   
   If IsWinNT Then KillApps = KillAppsNT(strFilePath): Exit Function
   
   Dim uProcess As PROCESSENTRY32
   Dim rProcessFound As Long
   Dim ProcessID As Long
   Dim hSnapshot As Long
   Dim szExename As String
   Dim i
   Dim exitCode As Long
   Dim myProcess As Long
   Const TH32CS_SNAPPROCESS= 2&
   
   uProcess.dwSize = Len(uProcess)
   hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
   rProcessFound = ProcessFirst(hSnapshot, uProcess)
   Do While rProcessFound
      i = Instr(1, uProcess.szexeFile, Chr(0))
      szExename = Lcase$(Left$(uProcess.szexeFile, i - 1))
      If Right$(szExename, Len(strFilePath)) = Lcase$(strFilePath) Then
         myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID)
         KillApps = TerminateProcess(myProcess, exitCode)
         Call CloseHandle(myProcess)
         KillApps = True
         Exit Function
      End If
      rProcessFound = ProcessNext(hSnapshot, uProcess)
   Loop
   Call CloseHandle(hSnapshot)
Finish:
End Function

Function StrZToStr(pString As String) As String
   StrZToStr = Left$(pString, Len(pString) - 1)
End Function

Function KillAppsNT(strFilePath As String) As Long
   Dim cb As Long
   Dim cbNeeded As Long
   Dim NumElements As Long
   Dim lProcessIDs() As Long
   Dim cbNeeded2 As Long
   Dim lNumElements2 As Long
   Dim lModules(1 To 200) As Long
   Dim lRet As Long
   
   Dim exitCode As Long
   Dim myProcess As Long
   Dim strModuleName As String
      '
   Dim uProcess As PROCESSENTRY32 'This used only as a null UDT when we call DoAppsAction,    we can't make an optional parameter in a function as UDT !
      'Dim exitCode As Long
      'Dim myProcess As Long
   Dim nSize As Long
   Dim hProcess As Long
      '
   Dim szExename As String
      '
      'Dim AppKill As Boolean
      '
   Dim ProcessID As Long
   Dim r, i, ThreadID
   
   
   
      'Get the array containing the process id's for each process object
   cb = 8
   cbNeeded = 96
   Do While cb <= cbNeeded
      cb = cb * 2
      Redim lProcessIDs(cb / 4) As Long
      lRet = EnumProcesses(lProcessIDs(1), cb, cbNeeded)
   Loop
   NumElements = cbNeeded / 4
   For i = 1 To NumElements
          'Get a handle to the Process
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
      Or PROCESS_VM_READ, 0, lProcessIDs(i))
          'Got a Process handle
      If hProcess <> 0 Then
         lRet = EnumProcessModules(hProcess, lModules(1), 200, _
         cbNeeded2)
         If lRet <> 0 Then
            strModuleName = Space(MAX_PATH)
            nSize = 500
            lRet = GetModuleFileNameExA(hProcess, lModules(1), strModuleName, nSize)
            strModuleName = Left(strModuleName, lRet)
            szExename = Ucase(strModuleName)
            'Msgbox Right$(szExename, Len(strFilePath))
            If Right$(szExename, Len(strFilePath)) = Ucase$(strFilePath) Then
               myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, lProcessIDs(i))
               KillAppsNT = TerminateProcess(myProcess, exitCode)
               Call CloseHandle(myProcess)
               KillAppsNT = True
               Exit Function
            End If
         End If
      End If
      lRet = CloseHandle(hProcess)
   Next
   
End Function

Function IsWinNT() As Variant
   IsWinNt = False
   If WindowsVersion = "Windows NT 4.0" Then IsWinNt = True
End Function

Function ProcessRunningNT(strFilePath As String) As Variant
   Dim cb As Long
   Dim cbNeeded As Long
   Dim NumElements As Long
   Dim lProcessIDs() As Long
   Dim cbNeeded2 As Long
   Dim lNumElements2 As Long
   Dim lModules(1 To 200) As Long
   Dim lRet As Long
   Dim exitCode As Long
   Dim myProcess As Long
   Dim strModuleName As String
   Dim uProcess As PROCESSENTRY32
   Dim nSize As Long
   Dim hProcess As Long
   Dim szExename As String
   Dim ProcessID As Long
   Dim r, i, ThreadID
   cb = 8
   cbNeeded = 96
   ProcessRunningNT = False   
   Do While cb <= cbNeeded
      cb = cb * 2
      Redim lProcessIDs(cb / 4) As Long
      lRet = EnumProcesses(lProcessIDs(1), cb, cbNeeded)
   Loop
   NumElements = cbNeeded / 4
   For i = 1 To NumElements
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
      Or PROCESS_VM_READ, 0, lProcessIDs(i))
      If hProcess <> 0 Then
         lRet = EnumProcessModules(hProcess, lModules(1), 200, _
         cbNeeded2)
         If lRet <> 0 Then
            strModuleName = Space(MAX_PATH)
            nSize = 500
            lRet = GetModuleFileNameExA(hProcess, lModules(1), strModuleName, nSize)
            strModuleName = Left(strModuleName, lRet)
            szExename = Ucase(strModuleName)
'            If Instr(1,Ucase(uProcess.szExeFile), Ucase(Filename), 0 ) > 0 Then
            If Instr (1, Right$(szExename, Len(strFilePath)) ,Ucase$(strFilePath),0) > 0 Then
               ProcessRunningNT= True
               Exit Function
            End If
         End If
      End If
      lRet = CloseHandle(hProcess)
   Next
End Function

Ulrich
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #11 am: 12.06.04 - 16:20:40 »
Ich habe es in Script programmiert, aber es geht nicht. Er findet zwar den Process, aber der task bleibt.  :'(

Das einzige was ich in dem von Dir verlinkten Code geändert habe ist:

Const TH32CS_SNAPPROCESS As Long = 2&
in
Const TH32CS_SNAPPROCESS = 2&

Andreas

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #12 am: 12.06.04 - 16:25:27 »
Call wordDocument.PrintOut(True)

Wenn du den Parameter (Background) auf False setzt, dann wird Word erst geschlossen, wenn der Druck fertig ist, glaube ich.
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #13 am: 12.06.04 - 16:30:55 »
@Andreas: ja, habe ich auch gerade gemerkt; aber mit meinem Code, den ich vor deinemm letzten Posting reingestellt habe,

Sub Click(Source As Button)
   Dim strProc As String
   strProc = "acrobat.exe"
   If  ProcessRunning(strProc) Then
      KillApps (strProc)
   End If
End Sub

@Thomas:  8), habe ich aber noch nirgendwo gesehen; muß ich doch gleich mal testen  :D
« Letzte Änderung: 12.06.04 - 16:46:50 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #14 am: 12.06.04 - 16:42:29 »
@Thomas: Danke für den Tipp! Ich habe es jetzt so für Word und Excel gemacht:

Select Case  applicationType
Case "Word":
Set  OLE_application = CreateObject( "Word.Application" )  
Call OLE_application.documents.add( filePath )  
Set wordDocument =  OLE_application.activedocument
Call wordDocument.PrintOut(False)                         'Drucken (im Vordergrund, damit Word erst nach dem Druck geschlossen wird!)
Call wordDocument.Close                                         'Word-Dokument schließen
Call OLE_application.Quit()                                        'Schließe Word
      
Case "Excel":
Set  OLE_application = CreateObject( "Excel.Application" )  
Set xlsSheet = OLE_application.Workbooks.Open( filePath )  
Call xlsSheet.PrintOut()
Call xlsSheet.Close
Call OLE_application.Quit()

...

Bei Excel funktioniert Call xlsSheet.PrintOut(False) nicht, es kommt eine Meldung "Bitte geben Sie eine Zahl zwischen... ein".
Aber ohne Parameter geht es!

Andreas
« Letzte Änderung: 12.06.04 - 16:43:13 von Glombi »

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #15 am: 12.06.04 - 16:49:55 »
Ulrich, Dein Code funktioniert !  :D

Andreas

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #16 am: 12.06.04 - 16:53:18 »
Dann kann der thread ja nach ca. 89 Minuten geschlossen werden ...  :D
« Letzte Änderung: 12.06.04 - 16:54:14 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Glombi

  • Gast
Re:Word-Dokument aus Notes drucken und schließen
« Antwort #17 am: 12.06.04 - 16:58:29 »
Dann kann der thread ja nach ca. 89 Minuten geschlossen werden ...  :D
Ist bereits geschehen - die EM kann kommen  :D

Ein schönes Wochenende noch!
Andreas

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz