mme Geschrieben 17. Mai 2005 Geschrieben 17. Mai 2005 Hallo, folgendes Problem: Ich will den Browser im Hintergrund starten (ie) und dann die aufgerufene Seite ausdrucken und den Browser gleich wieder schließen. Das ganze in Powerbuilder aber das dürfte egal sein welche Sprache... Das ganze funktioniert auch... aber... wenn ich gedruckt habe kann ich den Browser nicht gleich schließen, sondern muss noch eine Schleife 10 Sekunden laufen lassen, da sonst der Druck nicht durchgeführt wird. Das Problem ist, je nach Website und Geschwindigkeit des Rechners scheint diese Zeit länger oder kürzer zu sein. Kann ich irgendwie abfragen ob er noch druckt oder schon fertig ist? Hier mein bisheriger Code: ie.visible = false ie.navigate(sle_1.text) DO // Warten bis Seite aufgebaut LOOP WHILE ie.ReadyState() <> 4 ie.execwb(6, 2) a = relativetime(now(),10) do until a < now() loop //Statt diesen drei Zeilen abfragen ob druck fertig... ie.quit() Vielen Dank im vorraus Zitieren
Maulwurf_der_Schlaue Geschrieben 17. Mai 2005 Geschrieben 17. Mai 2005 was gibt es denn für Stati bei ie.ReadyState()?? is da keiner dabei? Zitieren
Klotzkopp Geschrieben 17. Mai 2005 Geschrieben 17. Mai 2005 was gibt es denn für Stati bei ie.ReadyState()?? is da keiner dabei? typedef enum tagREADYSTATE { READYSTATE_UNINITIALIZED = 0, READYSTATE_LOADING = 1, READYSTATE_LOADED = 2, READYSTATE_INTERACTIVE = 3, READYSTATE_COMPLETE = 4 } READYSTATE; [/CODE] Ich würde auch vorschlagen, in der Warteschleife mal die ReadyState-Werte anzusehen. Zitieren
mme Geschrieben 17. Mai 2005 Autor Geschrieben 17. Mai 2005 Ready-State hat leider nach dem laden der Seite vor und nach dem Druck (und auch nach 1,2,3 bis 10 Sekunden) immer den Status 4. D.h. daran kann ich es nicht festmachen... Zitieren
mme Geschrieben 18. Mai 2005 Autor Geschrieben 18. Mai 2005 Ich habe jetzt "ie.QueryStatusWB(6) " gefunden. Dies liefert mir aber wohl nur zurück ob das Drucken überhaupt möglich (enabled) ist (immer Rückgabewert 3). Aber weiß jemand ob diese Funktion vielleicht mein Problem abfragen kann bzw. ich übergebe da eine 6, aber welche Werte kann man noch übergeben und vorrallem wofür stehen die...? Zitieren
Klotzkopp Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 Funktion vielleicht mein Problem abfragen kann bzw. ich übergebe da eine 6, aber welche Werte kann man noch übergeben und vorrallem wofür stehen die...?Die MSDN Library ist dein Freund: typedef enum { OLECMDID_OPEN = 1, OLECMDID_NEW = 2, OLECMDID_SAVE = 3, OLECMDID_SAVEAS = 4, OLECMDID_SAVECOPYAS = 5, OLECMDID_PRINT = 6, OLECMDID_PRINTPREVIEW = 7, OLECMDID_PAGESETUP = 8, OLECMDID_SPELL = 9, OLECMDID_PROPERTIES = 10, OLECMDID_CUT = 11, OLECMDID_COPY = 12, OLECMDID_PASTE = 13, OLECMDID_PASTESPECIAL = 14, OLECMDID_UNDO = 15, OLECMDID_REDO = 16, OLECMDID_SELECTALL = 17, OLECMDID_CLEARSELECTION = 18, OLECMDID_ZOOM = 19, OLECMDID_GETZOOMRANGE = 20 OLECMDID_UPDATECOMMANDS = 21 OLECMDID_REFRESH = 22 OLECMDID_STOP = 23 OLECMDID_HIDETOOLBARS = 24 OLECMDID_SETPROGRESSMAX = 25 OLECMDID_SETPROGRESSPOS = 26 OLECMDID_SETPROGRESSTEXT = 27 OLECMDID_SETTITLE = 28 OLECMDID_SETDOWNLOADSTATE = 29 OLECMDID_STOPDOWNLOAD = 30 } OLECMDID; [/code] Allerdings glaube ich auch, dass dir QueryStatusWB nicht weiterhelfen wird. Im Usenet scheinen schon mehrere Leute genau dieses Problem gehabt zu haben, aber eine "schöne" Lösung hat wohl niemand gefunden. IIRC war ein Lösungansatz, die temporäre Datei zu beobachten, die der IE zum Drucken anlegt und wieder löscht, wenn er damit fertig ist. Zitieren
mme Geschrieben 18. Mai 2005 Autor Geschrieben 18. Mai 2005 Na toll.... Da hätte ich mir vom IE mehr erhofft.... Kannst du mir den sagen wie ich an die Druckdaten rangkomme, bzw. wie ich diesen Druck unter vielen Drucken identifizieren kann? Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 hi, was mir noch eingefallen ist: warum prüfst du über den ie ob der druck fertig ist, frag doch einfach den drucker was er macht (wenn das geht), der sagt dir bestimmt ob er grad druckt oder nicht... is nur so ne idee. Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 Zugriff auf Hardware-Adressen Zeiger auf Register Bisher wurde der Blick auf den Inhalt einer Zeigervariablen immer vermieden. In der systemnahen Programmierung ist der Wert, den ein Zeiger enthält, durchaus interessant. Beispielsweise liegt das Statusregister der ersten Druckerschnittstelle bei einem gängigen Intel-PC an der Adresse 0x379. Für das normale Anwendungsprogramm ist diese Adresse unerreichbar. Wenn Sie aber eines Tages einen Treiber schreiben sollen, ist dies die Adresse, an der Sie erfahren können, ob der Drucker bereit ist, weitere Aufträge entgegenzunehmen. Der Zugriff auf die Adresse ist denkbar einfach: Sie definieren eine Zeigervariable und weisen ihr die Adresse direkt zu. [Zugriff auf den Druckerstatus] unsigned char *DruckerStatusRegister; unsigned char; DruckerStatusRegister = 0x379; Status = *DruckerStatusRegister; if (Status & 0%10000000) { // Drucker ist frei } else { // Drucker ist BUSY } Quelle: http://www.willemer.de/informatik/cpp/sysprog.htm vielleicht hilft das ja schon... Zitieren
Klotzkopp Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 DruckerStatusRegister = 0x379; Status = *DruckerStatusRegister; Die Zeiten, zu denen man noch direkt auf die Hardwareports zugreifen konnte, sind vorbei. Moderne Betriebssysteme lassen so etwas nicht mehr zu. Zudem: wer sagt, dass der Drucker an der parallelen Schnittstelle hängt? Zitieren
Maulwurf_der_Schlaue Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 @Klotzkopp: auf die idee bin ich gar nicht gekommen das des evtl ja ein USB oder Netzwerkdrucker oder ... oder ... sein könnte... schade das das nicht mehr geht.... nagut, aber irgendwie muss ja auch das bs feststellen ob ein drucker druckt oder nicht, und dafür gibts doch bestimmt ne schnittstelle, aber wie hiesst sie und wie spricht man sie an? <edit> ich hab gern hardwarenah unter dos programmiert... </edit> Zitieren
mme Geschrieben 18. Mai 2005 Autor Geschrieben 18. Mai 2005 Danke für den Einwand... Es handelt sich um unser Intranet wo ca. 1000 Netzwerkdrucker (meistens über eine Printbox) existieren ... Zitieren
Klotzkopp Geschrieben 18. Mai 2005 Geschrieben 18. Mai 2005 Möglicherweise kannst du über die Warteschlange des Druckers erkennen, ob der IE fertig ist. Sobald der Druckjob in der Warteschlange erscheint, sollte es so weit sein. Wie das genau geht, weiß ich nicht. Ich kann dir nur ein paar Stichworte liefern: GetDefaultPrinter OpenPrinter EnumJobs Zitieren
mme Geschrieben 23. Mai 2005 Autor Geschrieben 23. Mai 2005 Leider komm ich bei dem Weg über die Warteschlange des Druckers auch nicht einfach ans Ziel.... Ich habe nun mit getdefaultprintera den Drucker "gehohlt", dann die "Verbindung" mit OpenPrintera hergestellt und EnumJobsa abgefragt. Grundsätzlich ein schöner und einfacher Weg. Nun habe ich nur das Problem, das wenn ich direkt nach dem absetzten des Printkommandos im IE, den Drucker mit EnumJobsa abfrage, hat er den Druck noch nicht bekommen. Wenn ich nun in einer permanten Schleife abfrage stürzt Powerbuilder ab und wenn ich bei jedem Schleifendurchlauf kurz warte, kann es passieren, das der Druck komplett innerhalb eines Schleifendurchlaufs abgearbeitet wird und ich nicht mitbekomme, das er schon gedruckt hat.... Also suche ich gerade was wo ich sehen kann wann der letzte Druck war, bzw. einen Zähler der bei jedem Druck hochzählt oder ähnliches.... Soweit mein Stand... Wenn jemand an dieser Stelle noch eine Idee hat währe ich froh davon zu höhren.... Schöne Grüße mme Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.