Ab zweitem Drucken unter Win11 friert Anwendung ein
-
@Quiche-Lorraine
Folgende Methoden habe ich noch auf dem Device Context gefunden.m_pDC->SelectObject(&cPenNormal);
m_pDC->SetTextColor(..);
m_pDC->FillRect(..);
m_pDC->DrawText(..);
..MoveTo, ..LineTo, ..EndPage(), ..IsPrinting()Also ein "CBrush" oder "CPen", "CFont" kommt über ein "SelectObject(..)" rein.
Sonst habe ich nichts gefunden. Und die funktionieren schon lange so.
Das mit dem Application Verifier muss ich dann noch anschieben.
-
@elmut19 sagte in Ab zweitem Drucken unter Win11 friert Anwendung ein:
Und die funktionieren schon lange so.
Ja das ist halt das Wesen von undefiniertem Verhalten. Es funktioniert halt solange eine Bedingung erfüllt ist.
Frage: Achtest du auf den Rückgabewert von
SelectObject()
?
-
@Quiche-Lorraine
Nein! Also manchmal wird die Rückgabe einem Old-Obj zugewiesen.
Aber oft ohne Zuweisung.
Beim Überfliegen habe ich gerade nicht drauf geachtet, ob es sich dabei um den DC des Druckers handelt.
Aber der ist sicher auch betroffen.... "An application should always replace a new object with the original, default object after it has finished drawing with the new object."
Es könnte also sein, dass das ursprüngliche Object nicht wieder zurückgeschrieben wird.
Aber es heisst auch, dass diese Objekte dann über eine "OnIdle(..)"-Fktn, über das System verwaltet werden.
Aber ich finde auch, z.B. in meiner "DrawLine(..)" ein "ding.DeleteObject();"
... Also insgesamt viele solcher "xxx.DeleteObject()".
Das für den Print-Vorgang nachzuverfolgen dauert natürlich einige Zeit.
-
@elmut19 sagte in Ab zweitem Drucken unter Win11 friert Anwendung ein:
Nein! Also manchmal wird die Rückgabe einem Old-Obj zugewiesen.
Dann probiere doch mal folgendes. Jedes SelectObject liefert das zuvor selektierte Objekt zurück. Also würde ich den Device Context so wiederherstellen, wie ich ihn vorfand.
// Sorry WinAPI Code PrevSelectedBitmap = SelectObject(dcTrans, MyBitmap); // // Do stuff... // SelectObject(dcTrans, PrevSelectedBitmap);
https://devblogs.microsoft.com/oldnewthing/20130306-00/?p=5043
-
@Quiche-Lorraine
Bin mal einen Druck-Vorgang durchgegangen.
Am Anfang wird ein Object, aber lokal in der Methode, gesichert.
Die Sicherung erfolgt auf Pen und Font Objekte.
Danach werden dies Objekte zig mal getauscht, ohne das vorherige in ein "Old" zu sichern.
Im Abschluss werden erzeugte Objekte durch "DeleteObject()" auch wieder gelöscht.
Zwischedurch wird auch wieder ein "OldFont" zurückgeschrieben.Im Grossen Ganzen sollte das eigentlich nicht so schlecht sein.
Visuell aber schwer zu 100% einzuschätzen.
-
@elmut19
Inzwischen sehe ich den "neuen" Druck-Dialog von Win11als Bug von Microsoft an.
Es ist nirgends eine Programmiervorschrift für das Din zu finden.
Das Einzige, was es gibt, ist ein Registry Patch, der den alten Druck-Dialog wieder einschaltet.
https://answers.microsoft.com/de-de/windows/forum/all/windows-11-modernen-drucken-dialog-ohne-maus/729b38f0-536b-4a06-b014-950f83ccd557
-
@elmut19 sagte in Ab zweitem Drucken unter Win11 friert Anwendung ein:
Inzwischen sehe ich den "neuen" Druck-Dialog von Win11als Bug von Microsoft an.
Hast du dir schon das Problem auf Win11 unter dem Debugger angeschaut?
-
@Quiche-Lorraine
Ich werd erstmal einen Testrechner mit Win11 beantragen.
Der Rechner, auf dem wir das kurz probiert haben, ist leider nicht meiner.
Das ist mir da doch zu umständlich.
Aber jedenfalls vielen Dank für Deine Hinweise.
... Und ich werd noch weitersuchen ...
-
@elmut19 Warum nicht einfach ne VM nutzen?
-
@Tyrdal
Danke Tyrdal.
Werd ich jedanfalls auch beantragen.
Hab ich nicht dran gedacht, da ich eh unbedingt noch ein Notebook fürs Homeoffice möchte.
Mal sehn, was Lizenztechnisch besser ist.
Bisher kann ich nur sehen, dass auf dem "normalen" Druckweg meine Objekte, so wie ich es bei Microsoft nachlesen kann, auch wieder abgebaut werden.
Vorerst bleibt leider die einzige Möglichkeit, den Registry Patch anzuwenden.
Programmiertechnisch wird es da keine Möglichkeit geben, da der neue Druck-Dialog ja neuer ist, als meine Programmierumgebung (und deren Doku).