QFileDialog und RPC-Server

Alles rund um die Programmierung mit Qt
Antworten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

QFileDialog und RPC-Server

Beitrag 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());
		}
	}
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

nein es kackt im C'tor von QFileDialog ab!!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Ist das nur in deiner Applikation so, oder kannst du das (ohne dein restlicher Code, nur in einer einzelnen "main.cpp") reproduzieren?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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...
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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...
Antworten