2015-01-13 4 views
0

У меня есть довольно простая программа, которая запускается, находит все последовательные порты, подключенные к компьютеру, и печатает их на экране графического интерфейса. Прямо сейчас этот код отлично работает при запуске внутри Qt Creator, но как только я попытаюсь взять исполняемый файл и поместить его в DLL для запуска в качестве автономной программы, я рушился. Я запускаю Qt 5.3 с MSVC2013, 32 бит. Компьютер работает под управлением Windows 7 32bit.Ошибка QSerialPort при запуске за пределами среды разработки

вот пример кода, который я бегу:

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 

popups (в настоящее время один COM-порт подключен к компьютеру):

locating com ports 

locating com port 1 

Com port 1 located 

All com ports located 

, когда программа работает independantly, я получаю следующие всплывающие окна:

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. длл, Qt5SerialPort.dll и Qt5Widgets.dll

дополнительно, есть подпапка под названием «платформа», которая содержит qwindows.dll

Я не думаю, что есть какой-либо DLL файлов отсутствуют, что может быть причиной этой проблемы , и я не уверен, что еще может быть причиной этого. Единственный код, который я изменил с тех пор, как я столкнулся с этой проблемой, - это добавить окно сообщения, чтобы я мог определить, где программа сбой, когда не используется отладчик, поэтому он сбой перед добавлением qmessagebox. Кто-нибудь знает, что может быть причиной этой конкретной проблемы?

ответ

0

В случае, если кто-то сталкивается с подобной проблемой, я смог исправить ее, изменив цикл foreach, чтобы вывести объявления из инструкции for, изменив список на указатель на QSerialPortInfo :: AvailablePorts() вместо использования этого списка напрямую и удаления информации в конце функции. Ниже приведен пример кода, который функционирует правильно, который может быть заменен кодом, размещенным в вопросе.

... 
QSerialPortInfo* info = new QSerialPortInfo; 
QList<QSerialPortInfo> * PortList = new QList<QSerialPortInfo>; 
*PortList = QSerialPortInfo::AvailablePorts(); 
foreach(*info, *PortList){ 
    ... 
} 
... 
delete info; 
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); 
    } 
}