运行 在开发环境之外时 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);
}
}
我有一个相当简单的程序 运行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);
}
}