Hallo,
ich möchte eine ganze Reihe von PDF's ausdrucken, die auch sortiert aus dem Drucker kommen sollen.
Der reine Aufruf mit ShellExecute führt dazu, dass einige Dateien "verschluckt" werden.
CreateProcess mit WaitForSingleObject führt dazu, das alle PDF ausgedruckt werden, aber die Druckreihenfolge hat nichts mit der
Reihenfolge der Aufrufe zu tun.
Zuerst wird der kpl. Code abgearbeitet, dann druckt Windows die PDF's in einer Reihenfolge, die ich nicht nachvollziehen kann.
Die u.g. Funktion rufe ich in einer Schleife durch das Recordset auf.
Eigentlich hatte ich erwartet, daß der Code die nächste Datei erst dann aufruft, wenn das Acrobat-Fenster geschlossen ist.
Dem ist aber nicht so.
Hier läufts genauso ab. Code läuft durch, dann werden die Fenster
geöffnet und gedruckt, schön eines nach dem anderen nur die Reihenfolge
stimmt nicht mit der des Funktionsaufrufes.
Ich hoffe es gibt eine Möglichkeit, ohne dass der Benutzer jede Datei einzeln bestätigen muß.
Gruß Matthias Fitzner
ich möchte eine ganze Reihe von PDF's ausdrucken, die auch sortiert aus dem Drucker kommen sollen.
Der reine Aufruf mit ShellExecute führt dazu, dass einige Dateien "verschluckt" werden.
CreateProcess mit WaitForSingleObject führt dazu, das alle PDF ausgedruckt werden, aber die Druckreihenfolge hat nichts mit der
Reihenfolge der Aufrufe zu tun.
Zuerst wird der kpl. Code abgearbeitet, dann druckt Windows die PDF's in einer Reihenfolge, die ich nicht nachvollziehen kann.
Die u.g. Funktion rufe ich in einer Schleife durch das Recordset auf.
Eigentlich hatte ich erwartet, daß der Code die nächste Datei erst dann aufruft, wenn das Acrobat-Fenster geschlossen ist.
Dem ist aber nicht so.
Visual Basic-Quellcode
- Function fktWaitForPDF(Aktion As String, stDatei) As Boolean
- Dim ProcInfo As PROCESS_INFORMATION, StartInfo As STARTUPINFO
- 'Aktion = "C:\Program Files\Adobe\Acrobat 8.0\Acrobat\Acrobat.exe /P "
- With StartInfo
- .cb = Len(StartInfo) ' Größe der Struktur übergeben
- .dwFlags = STARTF_USESHOWWINDOW ' Angeben, dass .wShowWindow benutzt wird
- .wShowWindow = 1 ' Fensterstil setzen
- End With
- If CreateProcess(0&, Aktion & stDatei, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, StartInfo, ProcInfo) = 0 Then
- MsgBox "CreateProcess konnte Acrobat.exe nicht ausführen."
- End If
- While WaitForSingleObject(ProcInfo.hProcess, 0) = WAIT_TIMEOUT
- DoEvents ' Zeitscheibe fortführen, danach Kontrolle an Windows
- Wend
- End Function
Hier läufts genauso ab. Code läuft durch, dann werden die Fenster
geöffnet und gedruckt, schön eines nach dem anderen nur die Reihenfolge
stimmt nicht mit der des Funktionsaufrufes.
Visual Basic-Quellcode
- Function fktWaitForPDF(Aktion As String, stDatei) As Boolean
- ' Startoptionen festlegen
- With ShExInfo
- .cbSize = Len(ShExInfo)
- '.fMask = SEE_MASK_FLAG_NO_UI Or SEE_MASK_CLASSNAME Or SEE_MASK_NOCLOSEPROCESS
- .hwnd = Me.hwnd
- .lpVerb = Aktion
- .lpFile = stDatei
- .lpParameters = ""
- .lpDirectory = DirName
- .nShow = SW_SHOWMAXIMIZED
- End With
- ' Programm ausführen
- Retval = ShellExecuteEx(ShExInfo)
- If Retval = 0 Then
- ' bei Fehler Text ausgeben
- Select Case ShExInfo.hInstApp
- Case SE_ERR_ACCESSDENIED
- Err.Raise 5, "ShellExecuteEx", "Zugriff verweigert"
- Case SE_ERR_FNF
- Err.Raise 5, "ShellExecuteEx", "Datei nicht gefunden"
- Case SE_ERR_NOASSOC
- Err.Raise 5, "ShellExecuteEx", "Datei ist mit keinem Programm verknüpft"
- End Select
- fktWaitForPDF = False
- Else
- 'erfolgreich gedruckte Datei löschen
- fktWaitForPDF = True
- End If
- ' warten bis die Anwendung beendet wird
- test = WaitForSingleObject(ShExInfo.hProcess, INFINITE)
- Do While test = 1
- test = WaitForSingleObject(ShExInfo.hProcess, INFINITE)
- Loop
- End Function
Ich hoffe es gibt eine Möglichkeit, ohne dass der Benutzer jede Datei einzeln bestätigen muß.
Gruß Matthias Fitzner