Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Invalid parameter passed to C runtime function.



  • I have a problem with a application. I've created a debug handler with a own debug window. On a system without Qt, only the needed files, the windows works as expected, but if i work on a system installed with qt, the application crashs with the output "Invalid parameter passed to C runtime function." and with an error box from Microsoft Visual C++ Runtime Library.

    I'm not sure what the problem is. The debugwindowdemo is a simple ui class with some debug output. The other files i have posted here.

    main.cpp
    @#include "debugwindowdemo.h"
    #include "debughandler.h"
    #include <QtGui/QApplication>
    #include <QWidget>
    #include <QtGlobal>
    #include <QTextBrowser>

    int main( int argc, char* argv[] ) {
    QApplication app( argc, argv );

    qInstallMsgHandler(debugWinMsgHandler);
    
    DebugWindowDemo *dialog = new DebugWindowDemo;
    dialog->show();
    
    return app.exec();
    

    }
    @

    debughandler.h
    @#ifndef DEBUGHANDLER_H
    #define DEBUGHANDLER_H

    #include "debugwindow.h"

    void debugWinMsgHandler (QtMsgType type, const char* msg) {
    static DebugWindow* debugWindow = new DebugWindow;
    debugWindow->move(0,0);
    debugWindow->show();
    switch(type) {
    case QtDebugMsg:
    debugWindow->append(QString(QObject::tr("D: %1")).arg(msg));
    break;
    case QtWarningMsg:
    debugWindow->append(QString(QObject::tr("W: %1")).arg(msg));
    break;
    case QtCriticalMsg:
    debugWindow->append(QString(QObject::tr("C: %1")).arg(msg));
    break;
    case QtFatalMsg:
    debugWindow->append(QString(QObject::tr("F: %1")).arg(msg));
    break;
    }
    }
    #endif
    @

    debugwindow.h
    @#ifndef DEBUGWINDOW_H
    #define DEBUGWINDOW_H

    #include <QDialog>

    namespace Ui {
    class DebugWindow;
    }

    class DebugWindow : public QDialog
    {
    Q_OBJECT

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

    public slots:
    void append(QString);

    private:
    Ui::DebugWindow *ui;

    private slots:
    void search(QString);
    void print();
    void save();

    };

    #endif // DEBUGWINDOW_H
    @

    debugwindow.cpp
    @#include "debugwindow.h"
    #include "ui_debugwindow.h"

    #include <QMessageBox>
    #include <QFileDialog>
    #include <QTextStream>
    #include <QPrintDialog>
    #include <QPrinter>
    #include <QFont>

    DebugWindow::DebugWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::DebugWindow)
    {
    QFont newFont("Ubuntu", 8);
    this->setFont(newFont);
    ui->setupUi(this);
    ui->tbClear->setVisible(false);
    connect(ui->leSearch,SIGNAL(textChanged(QString)),this,SLOT(search(QString)));
    connect(ui->tbClear,SIGNAL(clicked()),ui->leSearch,SLOT(clear()));
    connect(ui->pbPrint,SIGNAL(clicked()),this,SLOT(print()));
    connect(ui->pbSave,SIGNAL(clicked()),this,SLOT(save()));
    connect(ui->pbClose,SIGNAL(clicked()),this,SLOT(close()));
    }

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

    void DebugWindow::append(QString str)
    {
    ui->teLog->append(str);
    }

    void DebugWindow::search(QString pattern)
    {
    ui->tbClear->setVisible(!pattern.isEmpty());
    QTextDocument* document = ui->teLog->document();

    QTextCharFormat noBackground;
    noBackground.clearBackground();
    QTextCharFormat highlight;
    highlight.setBackground (QBrush(QColor(239,41,41,200)));
    
    QTextCursor allText  = QTextCursor(document);
    allText.select(QTextCursor::Document);
    allText.setCharFormat(noBackground);
    
    QRegExp expression = QRegExp(pattern,Qt::CaseInsensitive,QRegExp::RegExp2);
    
    QTextCursor cursor = document->find(expression,QTextCursor(document),0);
    while (!cursor.isNull()) {
        cursor.select(QTextCursor::LineUnderCursor);
        cursor.setCharFormat(highlight);
        cursor = document->find(expression,cursor,0);
    }
    

    }

    void DebugWindow::save()
    {
    QString fileName = QFileDialog::getSaveFileName(this,QObject::tr("Logfile speichern"),QDir::homePath(),QObject::tr("Logfile (*.log)"));
    if (!fileName.isEmpty())
    {
    if (!fileName.endsWith("log"))
    {
    fileName = fileName+".log";
    }
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
    QString message = QString("%1%2%3")
    .arg(QObject::tr("Die Datei "))
    .arg(fileName)
    .arg(QObject::tr(" kann nicht gespeichert werden!"));
    QMessageBox::critical(this,QObject::tr("Fehler beim Speichenrn der Logfile."),message);
    }
    else
    {
    QTextStream out(&file);
    out.setGenerateByteOrderMark(true);
    out << ui->teLog->toPlainText();
    file.close();
    QString message = QString("%1%2%3")
    .arg(QObject::tr("Die Logfile "))
    .arg(fileName)
    .arg(QObject::tr(" wurde erfolgreich gespeichert!"));
    QMessageBox::information(this,QObject::tr("Logfile erfolgreich gespeichert!"),message);
    }
    }
    }

    void DebugWindow::print()
    {
    QTextDocument *document = ui->teLog->document();
    QPrinter printer;
    QPrintDialog printDialog(&printer);
    if (printDialog.exec() != QDialog::Accepted)
    {
    return;
    }
    document->print(&printer);
    }
    @



  • What do you mean by "work on a system installed with qt"?
    Which compilers do you use?
    With which compiler was the installed Qt version build?



  • “work on a system installed with qt” means a installed qt sdk (including qt path in the $PATH)
    I'm using the build 2010.05 mingw



  • so, you are using build 2010.05 with mingw. And which version is installed on the machine, where it crashes? Are those versions the same? The error sounds (for a first read) to be caused by different versions or different builds (with different parameters, compilers etc). That's why I'm asking...



  • The same version is installed on the system where it crash. the "funny" part is, on a system without qt sdk, only with the needed qt files (libgcc_s_dw2-1.dll, mingwm10.dll, QtCored4.dll, QtGuid4.dll) it works.

    Last night i found out (lot of things i've tried eg switching debugwindow from qdialog to qwidget), that it has to be a problem of the ui file (i think so)... i created a new designer class, copied!!! the code into the cpp/h files and "copied" the ui elements with the designer to the other ui file... and you wouldn't believe it, it works.. i will post the original ui file... i haven't found any errors within, but maybe there is another problem:

    debugwindow.ui
    http://pastebin.com/XpiyNF3K



  • It seems to be an ansi/utf8 conversion error if the ui file is ansi encoded. i converted ui file to utf8. ive'd used the rc version of the qtcreater who was warning of wrong encoded file (so i figured it out).



  • Thanks for the hint here Torsten - I had a similar problem here. The only difference was a .qml file was saved with whatever System encoding Mac runs, and on my Win7 I got the same "Invalid parameter passed to C runtime function.” error.

    The fix was to "Save with Encoding" UTF-8 and rebuild - then it worked without errors? Did you file a bug-report?

    _Update: _ Actually turned out to be another bug (exception thrown and the program didn't know what to do) :) Nevermind, nothing to see here :D



  • No, i didn't file a bug, because it's not a "bug" after all. Maybe they should add a feature to configure the basic encoding the creator should use. (I know, you can choose the encoding, but that doesn't change the creator defaults).


Log in to reply