Hi zusammen,
Ich habe da gerade ein großes Problem: Ich versuche in einer Schleife Acrobat abzuschießen, indem ich dem Programm so oft WM_CLOSE schicke, bis pro.HasExited True meldet:
[highlight=vbnet]
Public Sub PDFDrucken(ByVal pFilename As String)
Try
Dim f As String = IIf(InStr(pFilename, " ") > 0, Chr(34) & pFilename & Chr(34), pFilename)
Dim starter As New ProcessStartInfo(GetPDFPrintExe(), " /p /h " & f) '"/T " & f
Dim pro As New Process
pro.StartInfo = starter
pro.StartInfo.UseShellExecute = True
pro.Start()
Wait(5)
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If hAcrobatWindow = 0 Then Exit Do 'Prozess hat kein Fenster (mehr) -> Prozess ist bereits beendet
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
pro.WaitForExit(1000)
Loop While Not pro.HasExited
Catch ex As Exception
ShowError("Ein Fehler ist aufgetreten:" & ex.Message & vbCrLf & ex.StackTrace)
Finally
'Speicher aufräumen
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
[/highlight]
Das pro.WaitForExit(1000) habe ich hinzugefügt, weil das PostMessage bei einigen Anwendern immer mit Fehler 1816 zurückgekommen ist, nun habe ich heute die Meldung von einem dieser Anwender zurückbekommen, es würde eine Fehlermeldung zurückgegeben "Process has exited, so the requested information is not available". Der Screenshot sagt mir, der Fehler käme beim ensureState der Funktion get_MainWindowHandle, was heisst, dass entweder hasExited False zurückgegeben hat, obwohl der Prozess schon beendet war, oder sich Acrobat zwischen Schleifenende und erneutem Schleifendurchlauf beendet hat.
Wie umgehe ich diesen Fehler? Ich kann ja schon aus Ressourcengründen wohl schlecht um das pro.MainWindowHandle nochmal einen try-catch Block herumsetzen, mal davon abgesehen, dass wenn ich den Fehler ja eigentlich vermeiden will, wenn er aber zwischen While not pro.HasExited und pro.getMainWindow dazwischen kommt, dann kann er auch zwischen einen if not pro.hasExited und pro.MainWindowHandle den Status ändern.
Nebenfrage: Wenn ich Acrobat mit entsprechendem Befehl geöffnet habe, und nicht 5 Sekunden vor der Schleife warte, sondern ein WaitForInputIdle nutze, ist das dann bis Acrobat soweit gestartet hat, dass er anfangen kann zu drucken, oder bis der Druck beendet ist?
Gruß
Martin
Ich habe da gerade ein großes Problem: Ich versuche in einer Schleife Acrobat abzuschießen, indem ich dem Programm so oft WM_CLOSE schicke, bis pro.HasExited True meldet:
[highlight=vbnet]
Public Sub PDFDrucken(ByVal pFilename As String)
Try
Dim f As String = IIf(InStr(pFilename, " ") > 0, Chr(34) & pFilename & Chr(34), pFilename)
Dim starter As New ProcessStartInfo(GetPDFPrintExe(), " /p /h " & f) '"/T " & f
Dim pro As New Process
pro.StartInfo = starter
pro.StartInfo.UseShellExecute = True
pro.Start()
Wait(5)
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If hAcrobatWindow = 0 Then Exit Do 'Prozess hat kein Fenster (mehr) -> Prozess ist bereits beendet
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
pro.WaitForExit(1000)
Loop While Not pro.HasExited
Catch ex As Exception
ShowError("Ein Fehler ist aufgetreten:" & ex.Message & vbCrLf & ex.StackTrace)
Finally
'Speicher aufräumen
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
End Sub
[/highlight]
Das pro.WaitForExit(1000) habe ich hinzugefügt, weil das PostMessage bei einigen Anwendern immer mit Fehler 1816 zurückgekommen ist, nun habe ich heute die Meldung von einem dieser Anwender zurückbekommen, es würde eine Fehlermeldung zurückgegeben "Process has exited, so the requested information is not available". Der Screenshot sagt mir, der Fehler käme beim ensureState der Funktion get_MainWindowHandle, was heisst, dass entweder hasExited False zurückgegeben hat, obwohl der Prozess schon beendet war, oder sich Acrobat zwischen Schleifenende und erneutem Schleifendurchlauf beendet hat.
Wie umgehe ich diesen Fehler? Ich kann ja schon aus Ressourcengründen wohl schlecht um das pro.MainWindowHandle nochmal einen try-catch Block herumsetzen, mal davon abgesehen, dass wenn ich den Fehler ja eigentlich vermeiden will, wenn er aber zwischen While not pro.HasExited und pro.getMainWindow dazwischen kommt, dann kann er auch zwischen einen if not pro.hasExited und pro.MainWindowHandle den Status ändern.
Nebenfrage: Wenn ich Acrobat mit entsprechendem Befehl geöffnet habe, und nicht 5 Sekunden vor der Schleife warte, sondern ein WaitForInputIdle nutze, ist das dann bis Acrobat soweit gestartet hat, dass er anfangen kann zu drucken, oder bis der Druck beendet ist?
Gruß
Martin
Comment