我有一个相当简单的程序运行,找到连接到计算机的所有串行端口,并将它们打印到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之前崩溃了。有谁知道可能导致这个特殊问题的原因?
答案 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;