ich erstelle mir in meinem Windows.Forms Programm eine Zusammenfassung als Word-Dokument (2003). Ich möchte dem Benutzer zusätzlich die Möglichkeit bieten das Dokument aus zu drucken. Habe auch einen Weg (siehe unten) gefunden, allerdings funktioniert dieser nicht zuverlässig. Drucke ich im main-thread wird zwar alles aufgerufen, man sieht das der druckauftrag gesendet wird, allerdings wohl nicht vollständig, gedruckt (oder bei pdf-printer gespeichert) wird nicht. Verwende ich eine Lösung mit 2 Threads (hintergrund thread druckt) hängt es davon ab wie schnell der Hintergrund-Thread nach dem Aufruf beendet wird. Jenachdem reicht die Zeit den Auftrag vollständig zu senden oder nicht. Da ich nun keine dreckige Lösung alla Thread.sleep(1000) anstrebe, frage ich nun euch ob ihr eine Idee habt, wie ich es schaffen kann, dass der Druckauftrag definitiv ankommt.
Also meine word-application verwendet diesen [url=http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word._application.backgroundprintingstatus.aspx]BackgroundPrintinStatus[/url]
Also eine Lösung, aber 100% zufrieden bin ich damit noch nicht. [CODE] Word.Dialog dlg = word.Dialogs[Word.WdWordDialog.wdDialogFilePrint]; object timeOut = 0; int retValue = dlg.Show(ref timeOut);
int numberOfPrintDocs = word.BackgroundPrintingStatus;
Welches Threading Model benutzt du in deiner Anwendung? Apartment oder MultiThreading? Anders herum: Ruft du die Funktion CoInitializeEx(), und wenn ja wie. COM programming und MultiThreading ist ein Albtraum. Darüber gibt es tonnenweise Doku, aber leicher wird es dadurch nicht. Ein Einstieg findest du hier: MSDN. Ich weiß nicht, ob dein konkretes Problem damit zu tun haben kann, aber bei MultiThreading und COM schrillen mir immer die Alarmglocken.
Okay, mir fehlt wohl etwas background-wissen was COM angeht.
Zu Frage: Wenn ich es richtig verstanden habe, weder noch, die Zuordung wird automatisch gemacht.
Nochmals zu verdeutlichung: ich verwende MSO 2003 Primary Interop Assemblies. Der Druckaufruf wird aktuell vom MainThread (UI-Thread, siehe Lösung oben Thread 1, ausgeführt. Zu diesem Zeitpunkt ist die Applikation single-threaded.
Was dann im Hintergrund bei der Variante mit 2 Threads passiert (beide verwenden das gleiche Word-Objekt) ist mir noch nicht ganz klar.
Es schadet nicht, in allen Threads am Anfang CoInitializeEx() aufzurufen: Wenn die Funktion S_OK returned war das Threading zuvor nicht gesetzt und die Funktion mußte gerufen werdenn; wenn S_FALSE returned wird, dann war der Modus schon gesetzt, und das Problem liegt voranders; wenn RPC_E_CHANGED_MODE returned wird, dann ist ein anderer Modus bereits gesetzt.
PrintOut verhält sich gleich...
Also meine word-application verwendet diesen
[url=http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word._application.backgroundprintingstatus.aspx]BackgroundPrintinStatus[/url]
Also eine Lösung, aber 100% zufrieden bin ich damit noch nicht.
[CODE]
Word.Dialog dlg = word.Dialogs[Word.WdWordDialog.wdDialogFilePrint];
object timeOut = 0;
int retValue = dlg.Show(ref timeOut);
int numberOfPrintDocs = word.BackgroundPrintingStatus;
while(numberOfPrintDocs == word.BackgroundPrintingStatus){
[/CODE]