Seite 1 von 1

Alternative zu FindWindow & PostMessage

Verfasst: 17. Februar 2011 08:19
von Dane
Hallo zusammen,

In dem momentanen Projekt müssen sich bei mir Fenster gegenseitig Nachrichten senden.
Obwohl das Ganze später Plattform unabhängig sein soll, wollen wir das Ganze zuerst mal unter Windows zum laufen zu bringen.

Darum liegt die Möglichkeit der WinApi Befehle PostMessage & FindWindow ziemlich nahe.

Mittels der Methode winEvent bin ich mittlerweile im Stande an das Fenster gesendete Messages abzufangen & gegebenfalls auszuwerten.

Mein Problem liegt eher dabei, dass sobald ich entweder den WinApi Befehl PostMessage oder FindWindow aufrufe sofort ein Segmentation failure Signal bekomme.

Dies ist aber nur in der QT IDE der Fall.
Wenn ich den Befehl mit den gleichen Parametern beispielsweise in einem C++ Projekt in Visual Studio ausführe, funktioniert alles perfekt.
Warum ist dies so? <windows.h> ist selbstverständlich eingebunden.

Gibt es gegebenfalls Alternativen zu den 2 Methoden (Ich denke da an QWidget & QEvent)?

Beste Grüsse,
Dane

Verfasst: 17. Februar 2011 08:37
von pfid
Mit Fenster meinst du unterschiedliche Prozesse? Unter Unix fallen mit da System Message Queues ein, mit Qt könntest du mE auch QLocalSocket nutzen, wobei dazu die Verbindung immer gehalten werden muss.

Da ich mich mit IPC unter Windows noch nie beschäftigt habe, würde ich evtl einen eigenen Wrapper schreiben, und unter Unix System Message Queues verwenden, und unter Windows die WinApi (da mE für Message-orientierte IPC keine Qt-Variante existiert).

Zum konkreten Problem kann ich allerdings nichts sagen :(

Verfasst: 17. Februar 2011 09:02
von Dane
Hallo pfid,

Genau.
Alle (insgesammt sind es vier) Fenster sind QT Projekte (falls das eine Rolle spielt - ich denke jedoch nicht).

Ein Beispiel wäre folgendes Szenario:

Programm 1 bekommt von der Datastation gesagt dass die Serversockets gestartet wurden.
Nun teilt Programm 1 dem Programm 2 mittels PostMessage mit, dass die Serversockets der Datastation bereit sind. Programm 2 verbindet nun mit den Serversockets.

Eine Möglichkeit das Ganze OS-unabhängig zu gestalten wäre natürlich - wie du bereits erwähnt hast - dass ich alles mittels weiteren Sockets realisiere.
Aber ist dieser doch Grosse Aufwand wirklich nötig?

Da die 4 Programme nur unter Windows & Unix laufen werden könnte ich auch kurzerhand ein #ifdef _WIN32 einfügen und so OS spezifischen Code programmieren.

Was ich mich allerdings immernoch frage ist, warum der WinApi Befehl sofort ein SIGSEV Error auslöst.

Dies ist aber nicht generell bei WinApi Befehlen so (::Beep(UINT, UINT)) funktioniert.

¤:

Das Ganze sieht übrigens so aus:

Mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <windows.h>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H
Mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"




#include <QString>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}





void MainWindow::on_pushButton_clicked()
{
    HWND hwnd = NULL;
    hwnd = FindWindow(NULL, "ISSsrver");
}
Das komische daran ist ja, dass der SIGSEV Fehler nicht beim klicken auf den Button passiert, sondern bevor die GUI angezeigt wird.
Kommentiere ich die entsprechende Stelle (hwnd = FindWindow(NULL, "ISSsrver");) übrigens aus, läuft das Programm wie geschmiert. :)




- Dane

Verfasst: 17. Februar 2011 14:26
von Dane
Hallo.

Das Problem ist mittlerweile - gott sei dank - gelöst.
Komischerweise muss man in QT zuerst das ganze noch mittels "CoInitialize(NULL)" initialisieren.

Dabei sollte man auch nicht vergessen die benötigte Lib anzugeben (Ole32) :)

gruss