在dev环境之外运行时QSerialPort崩溃

时间:2015-01-13 16:04:27

标签: c++ qt

我有一个相当简单的程序运行,找到连接到计算机的所有串行端口,并将它们打印到GUI屏幕上。现在,这个代码在Qt Creator中运行时工作正常,但是一旦我尝试将可执行文件放在dll中作为独立程序运行,我就崩溃了。我正在使用MSVC2013,32位运行Qt 5.3。计算机正在运行Windows 7 32位。

这是我正在运行的代码示例:

void ApplicationWindow::findComPorts(){
    qDebug() << "find com ports selected";
    QString comText;
    QString messageText = "locating com ports";
    int i = 0;
    comText = "Locating Com Ports:";
    QMessageBox msg;
    msg.setText(messageText);
    msg.exec();
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
        i++;
        messageText = "locating com port " + QString::number(i);
        msg.setText(messageText);
        msg.exec();

        comText = comText + "\nName: ";
        comText = comText + info.portName();
        comText = comText + "\nDescription: ";
        comText = comText + info.description;
        comText = comText + "\nManufacturer: ";
        comText = comText + info.manufacturer();
        comText = comText + "\n";

        messageText = "Com port " + QString::number(i);
        messageText = messageText + " located";
        msg.setText(messageText);
        msg.exec();
    }
    messageText = "All com ports located";
    msg.setText(messageText);
    msg.exec();
    locatedComPorts->setText(comText); //locatedComPorts is type QLabel
    //and is declared in the header and is a label on the main GUI box
}

在调试器内部运行时,上面的行有以下输出:

调试内部:

find com ports selected

弹出窗口(当前连接到计算机的单个COM端口):

locating com ports

locating com port 1

Com port 1 located

All com ports located

当程序独立运行时,我会得到以下弹出窗口:

locating com ports

locating com port 1

Com port 1 located

此时程序崩溃到桌面。

与该程序捆绑在一起的当前DLL包括:

icudt51.dll,icuin51.dll,icuuc51.dll,libEGL.dll,libGLESv2.dll,msvcp120.dll,msvcr120.dll,Qt5Core.dll,Qt5Gui.dll,Qt5SerialPort.dll和Qt5Widgets.dll

另外,还有一个名为“platforms”的子文件夹,其中包含qwindows.dll

我认为没有任何dll可能导致此问题,我不确定还有什么可能导致它。我遇到此问题后唯一更改的代码是添加消息框,以便我可以在不使用调试器时识别程序崩溃的位置,因此在添加qmessagebox之前崩溃了。有谁知道可能导致这个特殊问题的原因?

2 个答案:

答案 0 :(得分:2)

我使用这个简单而稳定的代码:

QSerialPortInfo sinfo;
QList<QSerialPortInfo> slist = sinfo.availablePorts();

for(int i=0; i<slist.size(); i++)
{
    QString name = slist[i].portName();
    QSerialPort sp(name);
    if( sp.open(QIODevice::ReadWrite) )
    {
        sp.close();
        ui.comboBoxPort->addItem(name);
    }
}

答案 1 :(得分:0)

如果有人偶然遇到类似的问题,我成功地通过修改foreach循环来修复它,将声明从for语句中拉出来,将列表更改为指向QSerialPortInfo :: AvailablePorts()的指针,而不是直接使用该列表,并在函数末尾删除信息。下面是一个正常运行的代码示例,可以在问题中发布的代码中进行交换。

...
QSerialPortInfo* info = new QSerialPortInfo;
QList<QSerialPortInfo> * PortList = new QList<QSerialPortInfo>;
*PortList = QSerialPortInfo::AvailablePorts();
foreach(*info, *PortList){
    ...
}
...
delete info;