Programm nicht lauffähig unter anderen Rechnern

Alles rund um die Programmierung mit Qt
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Programm nicht lauffähig unter anderen Rechnern

Beitrag von yarikata »

konnichiwa

ich habe ein Programm geschrieben und wollte es nun auf anderen Rechnern testen. Zu den Programm habe ich auch die notwendigen dll mit dazu gepackt.
Das Programm hat auch eine Datenbankanbindung. Diese Datenbank ist nicht lokal. Um auf die Datenbank zu connecten, muss eine Datei ausgelesen werden, in der die Parameter abgelegt sind.

Wenn ich nun das Programm starte - hier ist auch das OS egal - komme ich lediglich zu meinen Login, aber nicht weiter.

Um zu schauen, ob der Fehler nicht am auslesen der Parameter liegt, hatte ich diese mit in das Programm geschrieben. Der Erfolg blieb trotzdem aus.

Aber: Ich kann mich von meinen Laptop, mit dem Programm, auf die Datenbank verbinden lassen. Egal ob ich diese auf einen USB-Stick habe oder ob ich aus dem Verzechnis starte.

Mein Frage ist nun, wo meine Fehlerquelle liegen kann und wie ich diese behebe.

P.S
Ich arbeite mit Win 7, 64bit Ultimate.
Die Testrechner sind Win XP, 32 bit Professional, SP 3

Vielen Dank

matane
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

....
Das Programm hat auch eine Datenbankanbindung.
...
Zu den Programm habe ich auch die notwendigen dll mit dazu gepackt.
Auch die Datenbank-Treiber?
komme ich lediglich zu meinen Login, aber nicht weiter.
Weil wir nicht wissen, was genau "dein Login" macht, können wir im Grunde nur raten... wie wär's mit ein wenig Code?
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

konnichiwa,

In wie fern die Datanbanktreiber?

Wenn du die QtSql4.dll meinst, ja die habe ich auch beigefügt.

Inzwischen habe ich auch die dll hinzugefügt, mit denen ich MySql über Qt zum laufen bringen kann. Das Resutat bleibt das selbe. Keine Verbindung zu dem Server.

Aber hier der Quellcode zu meinen Login:

Code: Alles auswählen

#include "login.h"
#include <QDesktopWidget>
#include <QIcon>
#include "datenbank.h"
#include <QMessageBox>

Login::Login(QString *sPUser, int *iPRecht)
{
    spuser=sPUser;
    iprecht=iPRecht;

    Datenbank::initdb ();
    const int w=205;
    const int h=100;
    QRect globalrec;
    QDesktopWidget dw;
    globalrec = dw.screenGeometry();
    this->setGeometry(globalrec.width()/2-w/2,globalrec.height()/2-h/2,w,h);      //setzt das Hauptfenster horiz. und vert. zentriert
    this->setWindowTitle ("Login");
    this->setFixedSize (200,100);


    QIcon icon;
    icon.addFile(QString::fromUtf8("image/post.jpg"), QSize(48,32), QIcon::Normal, QIcon::Off);        // Programm-Icon
    this->setWindowIcon(icon);
    this->setWindowTitle ("Login");


    qlname =new QLabel("Name",this);
    qlpasswd =new QLabel(tr("Passwort"),this);
    qlename =new QLineEdit(this);
    qlepasswd =new QLineEdit(this);
    qlepasswd->setEchoMode(QLineEdit::Password);
    qgllogin =new QGridLayout(this);
    qpbok =new QPushButton("OK",this);
    connect(qpbok,SIGNAL(clicked()),this,SLOT(slotOK()));
    qpbcancel =new QPushButton("Beenden",this);
    connect(qpbcancel,SIGNAL(clicked()),this,SLOT(reject()));

    qgllogin->addWidget(qlname,0,0);
    qgllogin->addWidget(qlename,0,1);
    qgllogin->addWidget(qlpasswd,1,0);
    qgllogin->addWidget(qlepasswd,1,1);
    qgllogin->addWidget(qpbok,2,0);
    qgllogin->addWidget(qpbcancel,2,1);
    //qgllogin->addLayout(qhbtime,3,0);

    this->setLayout(qgllogin);
    qlename->setText ("masterroot");
    qlepasswd->setText ("root1234");
}

void Login::slotOK()
{
    QString user=qlename->text();
    QString pwd=qlepasswd->text();

    Datenbank::initdb ();                            //Initialisierung der DB-verbindung

    Datenbank::setPwd("dummy", pwd);
    if((user!="dummy") && (pwd!="")  && (user!="") && (Datenbank::getPwd("dummy") == Datenbank::getPwd(user)))
    {
        if(Datenbank::getPwd(user)!="")
        {
            *iprecht=Datenbank::getRecht(user);
            *spuser=user;
            this->accept();
        }
    }else
    {
        QMessageBox::critical(this, "Achtung","Falscher Benutzername oder falsches Passwort !\nÜberprüfen Sie Ihre Eingabe");
        qlename->setText("");
        qlepasswd->setText("");
    }
}
Und hier der Quellcode für die Datenbank:

Code: Alles auswählen

#include "datenbank.h"
#include <QFile>
#include <QFileDialog>
#include <QDir>

QSqlDatabase Datenbank::mydb=QSqlDatabase::addDatabase("QMYSQL");

Datenbank::Datenbank()
{
}

//Datenbankinitialisation

void Datenbank::initdb()
{
     qDebug()<<"intdb()";
     qDebug()<<QStringList(QSqlDatabase::drivers());                //Prüft welche Treiber verfügbar sind
     QFile file("dbcon\\dbcon.txt");                                                   //Pfad zur Datei
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))         //Prüft ob die Datei geöffnet werden kann
        return;

    QTextStream in(&file);                                                                  //wenn ja, dann wird in den TextStream geschrieben
    short s=0;
    QStringList process_line;
    while (!in.atEnd())
    {
        QString line = in.readLine();
        if(s==21 || s==23)                                                 //es werden die Zeilen 21,23,25 ausgelesen
        {
            process_line<<line;                                                          //Die Zeilen werden in process_line geschrieben

        }
        ++s;                                                                                         //s wird erhöht
    }
    qDebug ()<<process_line.at(0);                                           //process_line wird aufgeplittet in einzelne Strings
    qDebug ()<<process_line.at(1);




//    mydb.setHostName(process_line.at (0));                          //IP-Adresse des Servers
//    mydb.setDatabaseName(process_line.at(1));                  //Datenbankname

    mydb.setHostName("localhost");                          //IP-Adresse des Servers
    mydb.setDatabaseName("pepabuch");                  //Datenbankname

    mydb.setUserName("root");                                                //DB-User
    mydb.setPassword("");                                               //DB-Kennwort
    mydb.setPort(3306);                                                          //Port auf den der Server lauscht
    qDebug()<<mydb.open();
}

//Rechte und Nutzer

QString Datenbank::getPwd(QString user)
{
    QString pwd="";
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("SELECT Passwort FROM Benutzer WHERE Name='"+user+"'");
        if(query.size()>0)
        {
            while(query.next())
            {
               pwd=query.value(0).toString();
            }
        }
    }
return pwd;
}

void Datenbank::setPwd(QString user, QString pwd)
{
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("UPDATE Benutzer SET Passwort = PASSWORD('"+pwd+"') WHERE Name='"+user+"'");
        mydb.close();
    }

}

int Datenbank::getRecht(QString user)
{
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("SELECT Recht FROM Benutzer WHERE Name='"+user+"'");
        if(query.size()>0)
        {
            query.next();
            int recht=query.value(0).toInt();
            mydb.close();
            return recht;

        }
    }
    return 0;
}
Und hier noch die Datei die ausgelesen werden soll:
###################################################
# #
# Datenbankparameter #
#Elektronisches Posteingangs- und Postausgangsbuch#
# IT-College Putbus gGmbH #
# #
# #
# #
###################################################

Notiz:
Durch das Ändern der unten stehenden Parameter muss
diese Datei anschließend an alle anderen Benutzer
geschickt werden. Dies gewährleistet die Funktions-
fähgikeit des Programmes.
Danke!


Parameter:

Host:
172.16.100.60
Datenbankname:
pepabuch

matane
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nein, es waren die Datenbanktreiber gemeint!
Be sure to distribute any Qt plugins that you need with your application, and note that each type of plugin should be located within a specific subdirectory (such as imageformats or sqldrivers) within your distribution directory, as described below.
http://doc.qt.nokia.com/latest/deployme ... qt-plugins
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

franzf hat geschrieben:Nein, es waren die Datenbanktreiber gemeint!
Be sure to distribute any Qt plugins that you need with your application, and note that each type of plugin should be located within a specific subdirectory (such as imageformats or sqldrivers) within your distribution directory, as described below.
http://doc.qt.nokia.com/latest/deployme ... qt-plugins
Das kann aber nicht sein, da ich alle notwendigen Treiber (von GUI bis QtSql4) angefügt habe.

Edit: Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

yarikata hat geschrieben:Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.
Um das ordentlich zu klären: Lässt du dir genaue Meldungen von der connection geben? Was gibt die Anwendung auf die Konsole aus? Bitte die GENAUE Info (Wortlaut).

Wg. dem Kopieren brauchen wir ebenfalls GENAUE Angaben, was wie wohin kopiert wurde (die gesamte Ordnerstruktur).
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

franzf hat geschrieben:
yarikata hat geschrieben:Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.
Um das ordentlich zu klären: Lässt du dir genaue Meldungen von der connection geben? Was gibt die Anwendung auf die Konsole aus? Bitte die GENAUE Info (Wortlaut).

Wg. dem Kopieren brauchen wir ebenfalls GENAUE Angaben, was wie wohin kopiert wurde (die gesamte Ordnerstruktur).
Es kommt keine Meldung.
Alle Dateien, bis auf die Datenbankparameterdatei) befinden sich an einen Ort:
Programmordner/
  • Die Exe
    alle dlls
    Parameterordner -> hier befindet sich die Datei für die Parameter
    Imageorder -> hier befinden sich nur die Bilder
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Und das ist der Fehler...
Du brauchst im Programmverzeichnis neben den Qt-Dlls und der exe ein Verzeichnis "plugins" mit dem Unterordner "sqldrivers", DA REIN sollst du nun deine libqsqlmysql-dll reinkopieren. Und wenn du andere Bildformate als png unterstützen willst (gif, jpeg), muss in plugins ein Ordner "imageformats" angelegt werden, mit den entsprechenden gewünschten Formaten.

Das sollte aber aus der Doku und vor allem der Ordnerstruktur auf der Festplatte hervorgehen, oder?
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

franzf hat geschrieben:Und das ist der Fehler...
Du brauchst im Programmverzeichnis neben den Qt-Dlls und der exe ein Verzeichnis "plugins" mit dem Unterordner "sqldrivers", DA REIN sollst du nun deine libqsqlmysql-dll reinkopieren. Und wenn du andere Bildformate als png unterstützen willst (gif, jpeg), muss in plugins ein Ordner "imageformats" angelegt werden, mit den entsprechenden gewünschten Formaten.

Das sollte aber aus der Doku und vor allem der Ordnerstruktur auf der Festplatte hervorgehen, oder?
Wie beschrieben, habe ich dies getan. Jedoch habe ich diese dll nicht.
Das Resultat hat sich nicht verändert.
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

Neues Update:

Das Problem liegt nicht an der vorgeschlagenen Datei, sondern komischerweise im Quelltext!

Code: Alles auswählen

QSqlDatabase Datenbank::mydb=QSqlDatabase::addDatabase("QMYSQL");
Auf meinen Rechner (mit Qt4.6.3) funktioniert es wunderbar und ohne Fehler. Auch wenn ich die exe starte.
Wenn ich jedoch die exe auf einen anderen Rechner starte, funktioniert es nicht mehr (Rückgabewert -1).

Das Programm wurde auch mit Qt4.7.0 kompiliert (mit dem entsrechenden include). Die kompilierte Version funktioniert. Die exe Version wiederrum dann nicht.

Woran kann das nur liegen?

matane
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Auf Deinem Entwickwlungsrechner liegt definitv ein MySQL-Plugin. Sonst geht es dort nämlich genausowenig...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

Ich habe nun meinen Rechner nach allen *.dll durchsucht.
Das Ergebnis ist negativ.
Ich habe nun auch weitere *.dll hinzugefügt, die dem plugin nahe kommen.
Der Rückgabewert bleibt -1

matane
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Egal was Du behauptest - bei Dir im qt-plugin Odern / Unterordner sqldrivers ist das mysql-Plugin. Dies ist nicht auf den anderen Rechnern und deshalb geht es nicht... :roll:
http://doc.trolltech.com/4.7/deployment-plugins.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

îch bin hier:

Code: Alles auswählen

C:\Qt\2010.04\qt\plugins\sqldrivers
und alle dort befindlichen *.dlls sind mit hinzugefügt.
Es funktioniert einfach nicht.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

yarikata hat geschrieben: und alle dort befindlichen *.dlls sind mit hinzugefügt.
Was heißt das? Sicher nicht so wie es in der Doku steht... :roll:
Abgesehen davon fehlt dann wohl noch die mysql-dll -> Foren-Suche 'Dependency Walker'
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten