运行 在开发环境之外时 QSerialPort 崩溃

QSerialPort crashing when run outside of dev enviornment

我有一个相当简单的程序 运行s,找到连接到计算机的所有串行端口,并将它们打印到 GUI 屏幕上。现在,当 运行 在 Qt Creator 中运行时这段代码工作正常,但是一旦我尝试获取可执行文件并将其作为独立程序与 dll 一起放置到 运行 时,我就会崩溃。我正在 运行 宁 Qt 5.3 与 MSVC2013,32 位。电脑是运行ning windows7 32bit.

这是我 运行ning:

的代码示例
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 之前就崩溃了。有谁知道可能导致此特定问题的原因?

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

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

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

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);
    }
}