Problem nach Windows-Patch?!"Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werde
-
Hi!
Ich habe eine Exception beim FileDialog, die erst seit heute auftritt.
Der betroffene Code-Teil wurde nicht verändert, testweise habe ich auch einige Tage alte Sicherungen ausgeführt, der Fehler tritt auch dort auf.Fehlermeldung:
Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist. Diese Ausnahme wird nur ausgelöst, wenn ein Debugger mit dem Prozess verbunden ist.
Betroffener Code ist (die letzte Zeile verursacht die Ausnahme):
Stream^ myStream; SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog; saveFileDialog1->InitialDirectory = "c:\\"; saveFileDialog1->Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; saveFileDialog1->FilterIndex = 1; saveFileDialog1->RestoreDirectory = true; if ( saveFileDialog1->ShowDialog() != System::Windows::Forms::DialogResult::OK ) // continue only if OK pressed [...]
Meine Vermutung ist, dass patch "MS07-043" (Sicherheitsanfälligkeit in OLE-Automatisierung kann Remotecodeausführung ermöglichen (921503)) daran Schuld ist...!
- Kann dies jemand bestätigen?
- Wie kann ich den Fehler abstellen?
Gruß
-
Dieser Patch wird kaum was am .Net Framework verändert haben - die Meldung kommt ja aus der .Net OpenFileDialog Klasse die im Prinzip den Winapi Aufruf kapselt.
OLE/ActiveX/COM usw. fordern wenn sie aus .Net aufgerufen werden, immer den STA Modus, das war schon von Anfang an so. Deshalb generiert VS z.b. über der Main Methode auch immer das [STAThread] Attribute, damit der Mainthread aut STA gesetzt wird.
Warum das jetzt bei dir auftritt kann mehrere Gründe haben: z.B. Besagtes Attribut wurde von der Main Methode entfernt oder der OpenFileDialog wird in einem selber erzeugten Thread der nicht STA ist versucht anzuzeigen.
-
Du verwendest diesen Dialog in
einem Thread, welcher nicht für COM initialisiert ist. Verwende wie gesagt das STAThread Attribut, dann sollte das Problem nicht mehr auftreten.
-
Gab es da nicht auch noch was mit: "Kann nur in der IDE auftreten" ? Wegen dem Hostprozess oder so ?!
-
Nachdem ich das jetzt auf nem anderen Rechner im VC++ probiert habe, und der Fehler auch dort auftrat, ist meine Vermutung im Zusammenhang mit dem patch wohl falsch.
Interessant dennoch, dass ich in besagtem Codeteil nichts verändert habe, und das seit Tagen.
Dennoch tritt der Fehler erst seit gestern auf.
Wie kann das denn sein?Wo und wie muss ich das STA-Attribut denn setzen?
Durch klicken auf einen Button wird folgende - den SaveFileDialog enthaltende - Funktion als thread gestartet:
public: void MyGUI::Form1::MyThreadProcess() { // [...] }
-
Du musst vom besagten Thread mit Thread.SetApartmentState den ApartmentState auf STA setzen.
-
Also beim Aufruf vom thread muss man das einstellen, ok.
Habe ich jetzt so gemacht:
oThread->ApartmentState = ApartmentState::STA;
Und der SaveFileDialog kommt wieder.
Danke!!