Program not working right on other windows machine

2019-03-05 05:28发布

I'm having a problem with my application, in which I'm trying to get all network configurations of the system that it runs on. The final goal is to find the MAC address with highest priority.

The code runs ok and works when I run it with QtCreator and also runs ok when I create a folder containing the dll files and the exe file.

But the problem is that when I run this program on other windows machines (7 and 10) it runs but does not return or show anything. I tried running it as an Administrator, that didn't work neither and this code should be able to work on all windows platforms.

Any suggestions?

I'm currently on Windows 10 and using Qt 5.8 MSVC 2015

The exe file runs with these dlls on Windows 10:

  • Qt5Core.dll
  • Qt5Network.dll
  • msvcp140.dll
  • msvcr120.dll
  • vcruntime140.dll

These dlls should be also there for windows 7:

  • api-ms-win-core-file-l1-2-0.dll
  • api-ms-win-core-file-l2-1-0.dll
  • api-ms-win-core-localization-l1-2-0.dll
  • api-ms-win-core-processthreads-l1-1-1.dll
  • api-ms-win-core-string-l1-1-0.dll
  • api-ms-win-core-synch-l1-2-0.dll
  • api-ms-win-core-timezone-l1-1-0.dll
  • api-ms-win-crt-convert-l1-1-0.dll
  • api-ms-win-crt-environment-l1-1-0.dll
  • api-ms-win-crt-filesystem-l1-1-0.dll
  • api-ms-win-crt-heap-l1-1-0.dll
  • api-ms-win-crt-locale-l1-1-0.dll
  • api-ms-win-crt-math-l1-1-0.dll
  • api-ms-win-crt-multibyte-l1-1-0.dll
  • api-ms-win-crt-runtime-l1-1-0.dll
  • api-ms-win-crt-stdio-l1-1-0.dll
  • api-ms-win-crt-string-l1-1-0.dll
  • api-ms-win-crt-time-l1-1-0.dll
  • api-ms-win-crt-utility-l1-1-0.dll

Link below is the exe and dll files together:

https://ufile.io/e9htu

here's my code if needed:

main.cpp

#include <QCoreApplication>
#include "macfinder.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MACFinder macFinder;
    macFinder.findMAC();
    return a.exec();
}

macfinder.h

#ifndef MACFINDER_H
#define MACFINDER_H

#include <QObject>
#include <QNetworkConfiguration>
#include <QNetworkConfigurationManager>
#include <QNetworkInterface>
#include <QNetworkSession>
#include <QDebug>

class MACFinder : public QObject
{
    Q_OBJECT
public:
    explicit MACFinder(QObject *parent = 0);
    void findMAC();
private:
    QNetworkConfigurationManager ncm;
    QString filterMAC(QList<QNetworkConfiguration> configs);

signals:
    void foundMAC(QString MAC);
private slots:
    void configurationsUpdateCompleted();
};

#endif // MACFINDER_H

macfinder.cpp

#include "macfinder.h"

MACFinder::MACFinder(QObject *parent) : QObject(parent)
{
}

QString MACFinder::filterMAC(QList<QNetworkConfiguration> configs)
{
    qDebug() << "MAC and Index: ";
    QString MAC;
    int index;
    QNetworkConfiguration nc;
    foreach(nc,configs)
    {
        QNetworkSession networkSession(nc);
        QNetworkInterface netInterface = networkSession.interface();
        QString debugStr = QString::number(netInterface.index())
                + " | " + netInterface.humanReadableName() + " | "
                + nc.name() + " | " + netInterface.hardwareAddress();
        if(netInterface.hardwareAddress().isEmpty())
        {
            qDebug() << "--> No MAC: " << debugStr;
            continue;
        }
        if(netInterface.name().isEmpty())
        {
            qDebug() << "--> NO NAME: " << debugStr;
            continue;
        }
        if(netInterface.index() == 0)
        {
            qDebug() << "--> NO INDEX: " << debugStr;
            continue;
        }
        if(netInterface.flags() & QNetworkInterface::IsLoopBack)
        {
            qDebug() << "--> loopBack: " << debugStr;
            continue;
        }
        if(netInterface.flags() & (QNetworkInterface::IsRunning | QNetworkInterface::IsUp))
        {
            qDebug() << "*** Accepted: " << debugStr;
            if(MAC.isEmpty())
            {
                qDebug() << "setting MAC:" << debugStr;
                MAC = netInterface.hardwareAddress();
                index = netInterface.index();
            }
            else
            {
                if(netInterface.index() < index)
                {
                    qDebug() << "setting MAC:" << debugStr;
                    MAC = netInterface.hardwareAddress();
                    index = netInterface.index();
                }
                else
                    qDebug() << "index is not lower: " << debugStr;
            }
        }
    }
    return MAC;
}

void MACFinder::findMAC()
{
    qDebug() << "MACFinder::findMAC | updating all configurations";
    connect(&ncm,SIGNAL(updateCompleted()),this,SLOT(configurationsUpdateCompleted()));
    ncm.updateConfigurations();
}

void MACFinder::configurationsUpdateCompleted()
{
    qDebug() << "MACFinder::configurationsUpdateCompleted";
    disconnect(&ncm,SIGNAL(updateCompleted()),this,SLOT(configurationsUpdateCompleted()));
    QNetworkConfiguration nc;
    QList<QNetworkConfiguration> configs = ncm.allConfigurations(QNetworkConfiguration::Active);
    qDebug() << "\nAllConfigs: ";
    foreach (nc,configs)
    {
        qDebug() << nc.identifier() << nc.name() << nc.state();
    }
    QString MAC = filterMAC(configs);
    qDebug() << "\nMAC:" << MAC;
    if(MAC.isEmpty())
    {
        qDebug("no MAC address found");
    }
    emit foundMAC(MAC);
}

1条回答
男人必须洒脱
2楼-- · 2019-03-05 05:46

I downloaded your app and analyze it on my computer.

problem is you missing some dlls, your app running without error but not working properly. (qgenericbearer.dll , qnativewifibearer.dll with folder bearer are missing ).

you can use windeploy command to deploy your project.

go to Qt, compiler directory on your OS for example:

C:\Qt\Qt5.7.0\5.7\msvc2013\bin

Screenshot1

press Shift+right click mouse then click open command window here

type windeployqt.exe c:\Your app directory for example:

windeployqt.exe C:\Users\Mofrad\Downloads\macfindertest\macFinderTest\macAddressTest.exe

Screenshot2

now some dlls will copy to your app directory.

Now try your app again and you'll see it's working.

You can download deploy of your app here

查看更多
登录 后发表回答