Seite 1 von 1

QFileDialog und RPC-Server

Verfasst: 25. März 2009 09:00
von AuE
Hi Leutez,

habe folgendes Problem:

Ich hatte bisher immer modale Dialoge für die Verzeichnisauswahl verwendet also die static die QFileDialog mitliefert.

Problem: Modaler Dialog ==> bei Netztwerkzugriffen schlauchts meist so ziemlich, grade wenn was falsches eingestellt ist/nicht erreichbar ist. Da dann die restliche GUI fast einfriert wollte ich das ganze umstellen und mir meinen eigenen Dialog basteln. (siehe Sourcecode unten)

Problem: Der C´tor dauert ne halbe ewigkeit beim durchlaufen, in der Ausgabe hab ich folgende Fehlermeldung:
Eine Ausnahme (erste Chance) bei 0x7c812aeb in XKN_TypverwaltungGui.exe: 0x000006BA: Der RPC-Server ist nicht verfügbar.

Code: Alles auswählen

QFileDialog dialog(this);
	
	dialog.setFileMode(QFileDialog::DirectoryOnly);
	dialog.setDirectory( ui.leLocalSAPPath->text() );
	
	if ( dialog.exec() && !dialog.selectedFiles().isEmpty() )
	{
		std::string dir = dialog.selectedFiles()[0].toStdString();
		if ( !dir.empty() )
		{
			string_support::ReplaceString( "/",std::string("\\"),dir );
			the_configuration::instance()->set_string("Dateimanagement","LokalerPfad",dir );
			the_configuration::instance()->save_to_file();
			ui.leLocalSAPPath->setText(dir.c_str());
		}
	}

Verfasst: 25. März 2009 09:27
von solarix
Diese Fehlermeldung kommt vermutlich nur, wenn "ui.leLocalSAPPath->text()" auf eine (nicht existierende) Netzwerkablage zeigt?

Wenn ja gehe ich davon aus, dass die unter Windows verwendete API beim QFileDialog eine (von den Trolls nicht abgefangene) Exception wirft. Das gäbe dann IMHO ein Fehlerreport.

Aber noch was anderes: Du verwendest ja kein eigener FileDialog, sondern immer noch "QFileDialog". Warum sollte eine Instanz der Klasse besser/anderst funktionieren als die static-Methode?

Verfasst: 25. März 2009 09:33
von AuE
nein es kackt im C'tor von QFileDialog ab!!

Verfasst: 25. März 2009 10:02
von solarix
Ist das nur in deiner Applikation so, oder kannst du das (ohne dein restlicher Code, nur in einer einzelnen "main.cpp") reproduzieren?

Verfasst: 25. März 2009 10:33
von AuE
das ralle ich net....

Code: Alles auswählen


	 std::string dir = QFileDialog::getExistingDirectory (this, tr("Bitte wählen Sie das Verzeichnis für den lokalen SAP-Pfad aus:")
		 , ui.lineEdit->text()
		, QFileDialog::ShowDirsOnly | QFileDialog::DontUseNativeDialog).toStdString();
hängt sich mal auf mal net.... sehr strange...


War mein Fehler.... scheinbar hatte er sich immer bei "\\" aufgehangen...

Verfasst: 25. März 2009 11:49
von AuE
So.... jetzt kommt da lich ins dunkel....

was ist passiert... nehmen wir an wir greifen auf einen Netzwerkordner (Zielhost bekannt) zu... also tippen wir in das eingabefeld folgendes ein:

\\127.0.0.1\C$\AddOn

was kommt aus QFileDialog::getExistingDirectory() zurück ?

\\127.0.0.1\C$\AddOn/

wenn man jetzt noch "/" durch "\\" ersetzt wird einen langsam klar warums net geht ,-)

Zweiter Fact: Rufe ich nun erneut einen QFileDialog::getExistingDirectory()
auf so versucht er zunächst den Ordner dem ich ihn mitgebe... schlägt das fehl dann den letzten Ordner den er verwendet hat.... war wohl bei mir was im netzwerk..... gibts diesen rechner nicht so kommt ein
Eine Ausnahme (erste Chance) bei 0x7c812aeb in XKN_TypverwaltungGui.exe: 0x000006BA: Der RPC-Server ist nicht verfügbar.

Verfasst: 25. März 2009 12:41
von solarix
wenn man jetzt noch "/" durch "\\" ersetzt wird einen langsam klar warums net geht ,-)
Weil der Unix-Separator bei Qt immer funktioniert, würde ich das eher umgekehrt machen... also in einem Pfad wenn schon "\" durch "/" ersetzen (http://doc.trolltech.com/4.5/qfileinfo. ... teFilePath "On Windows this will always begin 'D:/' where ... will begin '//sharename/' ....")
gibts diesen rechner nicht so kommt ein
Spannend.. also kann man dies wie folgt reproduzieren:
* mit "QFileDialog::getExistingDirectory()" eine existierende Netzwerkablage auswaehlen
* die Ablage vom Netz nehmen
* nochmals "QFileDialog::getExistingDirectory()" mit einem ungültigen Pfad aufrufen, so dass der FileDialog die (nun nicht mehr erreichbare) veraltete Ablage lesen möchte?

Stimmt das so?

Verfasst: 25. März 2009 12:58
von AuE
Jepp... wobei ich noch dazu sagen muss das die trolls die Ausnahme natürlich abfangen. Sprich ich seh den den text, muss mich aber nicht ums catchen der exception kümmern. das machen die trolls schön selbst und schieben dann dein Verzeichnis auf´s aktuelle Working Dir!

Mit dem / hast du natürlich recht... aber die Anwender kennen glaube ich kein linux ;-) und sie würden auch diese "/" nicht so wirklich verstehen...Deshalb mache ich das im Win Mode...