QtDBus unter Windows

Alles rund um die Programmierung mit Qt
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

QtDBus unter Windows

Beitrag von KartoffelKiffer »

Hallo,

seit gestern beschäftige ich mich mit dem Thema WinDBus für Qt.

Ich habe die aktuelle Entwicklerversion per svn von WinDBus gezogen und erstellt. Erhalten habe ich eine libdbus-1.dll und eine libdbus-1d.dll neben ein paar ausführbaren Dateien.

Wenn ich nun das Modul QtDBus unter Qt kompilieren möchte, so fehlt ihm die dbus-1d.lib. Nehme ich die Datei zum kompilieren aus den "zusätzlichen Abhängigkeiten" heraus, erstellt er mir die QtDBusd4.dll und .lib fehlerfrei.

Ich arbeite mit Qt 4.4.3 und VS2008.

Ein, wie in diesem Beispiel gezeigter, Test funktioniert allerdings mit folgender Fehlermeldung nicht:

Code: Alles auswählen

.\test.cpp(35) : error C2027: Verwendung des undefinierten Typs "QDBusConnectionInterface"
        c:\programme\qt\4.4.3\include\qtdbus\../../src/dbus/qdbusconnection.h(64): Siehe Deklaration von 'QDBusConnectionInterface'
.\test.cpp(35) : error C2227: Links von "->registeredServiceNames" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
Liegt das nun daran, dass ich die dbus-1d.lib nicht erstellt und eingebunden habe?

Die libdbus-1.dll und die für das Debuggen habe ich ins bin-Verzeichnis von Qt kopiert.

Ich hoffe mir kann jemand weiterhelfen.



Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:10, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das Wiki ist (leider) outdated - zumindest ist der Patch schon ewig nicht mehr nötig :( Die Wikiseite ansich ist aber auch nicht mehr nötig.
Die Sourcen sind auch alt. Svn ist wesentlich aktueller (basiert auf dbus 1.2.3). Binaries und aktuellere Sourcen gibt es auch hier

Und wenn man QDBusConnectionInterface benutzen will - wie wäre es dann damit den Header dafür auch einzubinden?

btw: ich würde Qt mit "-dbus-linked" compileren da es sonst sein kann das die dbus-dll nicht geladen wird.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Undefined
Beiträge: 34
Registriert: 19. Oktober 2006 17:12

Beitrag von Undefined »

Da kannst du lange versuchen. Die dbus module sind auf win nur zu crossbuild zwecken Installiert.
The QtDBus module is a Unix-only library that you can use to make Inter-Process Communication using the D-Bus protocol. More...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Undefined hat geschrieben:Da kannst du lange versuchen. Die dbus module sind auf win nur zu crossbuild zwecken Installiert
Dann ist das bei mir daheim unter WindowsXP wohl nur ein Fake DBUS und KDE4/windows läuft ohne DBUS :D
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Ich bin gespannt welches Potential hinter dem Ganzen steckt, bislang habe ich mit DBus nichts am Hut gehabt.

Für meinen Anwendungsfall, n beliebige Programme greifen auf eine Benutzeroberfläche drauf zu und können diese steuern, ist DBus hoffe ich genau das Richtige.

Muss leider bis morgen warten bis sich Qt (endlich) kompiliert.

Ist es mittels DBus unter Windows unter Qt denn möglich RPC zu verwenden?
Undefined
Beiträge: 34
Registriert: 19. Oktober 2006 17:12

Beitrag von Undefined »

Christian81 hat geschrieben:
Undefined hat geschrieben:Da kannst du lange versuchen. Die dbus module sind auf win nur zu crossbuild zwecken Installiert
Dann ist das bei mir daheim unter WindowsXP wohl nur ein Fake DBUS und KDE4/windows läuft ohne DBUS :D
Joh da bin ich nicht mehr auf dem neusten stand, habe gerade mal gesucht und wie es aussieht gibt es neue patches für windbus. (Mein Zitat ist aus der aktuellen QT Doc...)
http://techbase.kde.org/Getting_Started ... lding_DBus
Für meinen Anwendungsfall, n beliebige Programme greifen auf eine Benutzeroberfläche drauf zu und können diese steuern, ist DBus hoffe ich genau das Richtige.
Wenn du dies in deinem Programm frei gibst dann ja - qdbusviewer gibt aufschluss.
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Sehr gut, es wurde alles erfolgreich kompiliert.

Jedoch bekomme ich beim Programmstart eines DBus-Tests folgende Fehlermeldung:

Code: Alles auswählen

LDR: LdrpWalkImportDescriptor() failed to probe C:\programme\Qt\4.4.3\bin\dbus-1d.dll for its manifest, ntstatus 0xc0150002
Ich habe die libs in das lib-Verzeichnis und die dlls in das bin-Verzeichnis von Qt kopiert und die libs auch als zusätzliche Pfadangabe in das Projekt eingebunden.

Durch google bin ich darauf gestoßen, dass es sich bei dem Fehler um die manifest-Datei handelt. Bei den libs und bins von dbus-msvc ist auch jeweils ein Ordner manifest dabei. Nur wie handhabe ich diese?




Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:10, insgesamt 1-mal geändert.
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Mh, irgendwie hapert es immernoch daran. Hat wer einen Tipp oder Link für mich wie mit den Manifest-Dateien umgehen muss? (liegt es überhaupt daran?)



Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:10, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Qt mit -dbus-linked übersetzen. Das dynamische Laden funktioniert nicht so wie gewünscht (und überhaupt nicht wenn man mingw benutzt).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Ist es möglich das -dbus-linked auch nachträglich einzuspielen, ohne alles neu zu erstellen? Habe letzte Woche Qt schon komplett kompiliert, was schon eine Ewigkeit gedauert hat. Dies möcht ich ungern wiederholen.



Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:11, insgesamt 1-mal geändert.
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Oder besser noch: Ich kann das QtDBus-Project doch in Visual Studio 2008 direkt über die vbproj-Datei in den src´en öffnen. Geht es evtl. auch dass ich einen Haken in den Settings setze, dass "dbus-linked" kompiliert wird?
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Also, ich habe jetzt Qt per

Code: Alles auswählen

configure -L "C:\mysql\lib\opt" -I "C:\mysql\include" -platform win32-msvc2008 -qt-sql-mysql -plugin-sql-mysql -dbus-linked -L "C:\Programme\Qt\4.4.3\lib" -I "C:\Programme\Qt\4.4.3\include\dbus"
konfiguriert und die DBus examples und den src von DBus neu kompiliert (reicht das aus? nmake laufen zu lassen, dauert mir zu lange).

Die dbus-daemon.exe lässt sich ohne Probleme starten (es startet eine Eingabeaufforderung bei der dbus.exe). Nur bei den examples habe ich Probleme.

Die Debug-Version beendet sich mit "Die Anwendung konnte nicht richtig initialisiert werden (0xc0150002). Klicken (...)" und die Release-Version startet keine Oberfläche. Der Prozess existiert zwar, aber es tut sich nichts, keine CPU-Last, Speicherauslastung konstant und ein Thread stetig vorhanden.

Die bin-Dateien der neusten DBus-Version 1.2.4 sind auch im bin-Verzeichnis von Qt, genauso wie die zwei lib-Dateien auch im lib-Verzeichnis von Qt liegen. In Qt/include habe ich einen dbus-Ordner erstellt, wo die includes liegen.

Ich hoffe, dass ich dieses Kind bald geschaukelt kriege.

Schonmal danke für die bisherige Hilfe.



Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:11, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du nicht msvc2005 sp1 benutzt musst Du dbus/win selbst erstellen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

So, ich habe Qt jetzt neu übersetzt. Bekomme das Chat-Example nun auch gestartet. Zwar nur als release aber erstmal ok.

Nun habe ich meine eigene Applikation geschrieben, wo ich den D-Bus Adaptor benutze:
DBusGui (.cpp)

Code: Alles auswählen

new MainApplicationAdaptor(this);

	if (!QDBusConnection::sessionBus().registerObject("/MainApplication", this))
	{
		QMessageBox::critical(0, "", "could not register");
	}
	else
	{
		QMessageBox::information(0, "", "registered");
	}
MainApplicationAdaptor (.h)

Code: Alles auswählen

class MainApplicationAdaptor : public QDBusAbstractAdaptor
{
	Q_OBJECT
	Q_CLASSINFO("D-Bus Interface", "de.xxx.Test.MainApplication")
	Q_PROPERTY(QString TestFunction READ TestFunction);

public:
	MainApplicationAdaptor(QObject *parent = 0);
	~MainApplicationAdaptor();

public slots:
	QString TestFunction()
	{
		return "Hallo Welt";
	}

private:
	
};
Und ein "Client" Test

Code: Alles auswählen

	QStringList services = QDBusConnection::sessionBus().interface()->registeredServiceNames();

	for (int i = 0; i < services.size(); ++i)
	{
		QMessageBox::information(0, "", services.at(i));
	}
  
	QDBusInterface remoteApp("de.xxx.Test.MainApplication", "/MainApplication");
	QDBusReply<QString> reply = remoteApp.call("TestFunction");
	if (reply.isValid())
	{
		QMessageBox::information(0, "", reply.value());
	}
	else
	{
		QMessageBox::critical(0, "", reply.error().message());
	}
Die DBusGui gibt registered zurück, es scheint also registriert zu sein. Die Test-Applikation gibt org.freedesktop.DBus, :1.14 (die 14 inkrementiert pro Aufruf des Programms) und :1.15 (nur wenn DBusGui zurzeit läuft) zurück.

Leider kommt, sobald ich

Code: Alles auswählen

QDBusInterface remoteApp("de.xxx.Test.MainApplication", "/MainApplication");
aufrufe, die Fehlermeldung:

Code: Alles auswählen

The name de.xxx.Test.MainApplication was not provided by any .service files
.

Die DBusGui hat sich also scheinbar doch nicht korrekt angemeldet, andernfalls würde ja schon der registeredServiceName "de.xxx.Test.MainApplication" in der MsgBox angezeigt werden oder nicht?



Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:11, insgesamt 1-mal geändert.
Undefined
Beiträge: 34
Registriert: 19. Oktober 2006 17:12

Beitrag von Undefined »

Siehe in der Doc "D-Bus Introspection" und registerService muss vor registerObject kommen.
Antworten